Commit graph

14 commits

Author SHA1 Message Date
Kunal Mehta
bdb5b592f4 shell: Optionally restrict commands' access with firejail
Introduces a FirejailCommand class, which can be used to add additional
restrictions to a command, for increased security. For now, firejail
containment needs to be enabled on a per-command basis.

The following restrictions are implemented:
* NO_ROOT - disallows any root access, including via setuid binaries
* SECCOMP - block dangerous syscalls with seccomp
* PRIVATE_DEV - create a private /dev
* NO_NETWORK - deny all network access
* NO_EXECVE - block the execve syscall

A convenient Shell::RESTRICT_DEFAULT is equivalent to NO_ROOT | SECCOMP
| PRIVATE_DEV, with the expectation that more restrictions may be added
to it in the future.

In addition, specific paths can be whitelisted with
Command::whitelistPaths(). Any file/directory that isn't whitelisted in
that top level directory (e.g. /srv) won't exist inside the firejail.

$wgShellRestrictionMethod can be set to false for no restriction system,
'firejail' to explicitly use it, or 'autodetect' to autodetect whatever
system is available. In the future the default should be changed to
autodetection once firejail is tested more.

Bug: T173370
Change-Id: Id74df0dbba40e1e7c07c4368aacffb6eb06a17c5
2017-11-28 00:06:40 +00:00
Gergő Tisza
7d9dbc0040
MediaWiki\Shell: log stderr
Change-Id: I1495fe2aba10102d7e36c3a3e5fdabf97f14546b
2017-10-26 21:06:03 -07:00
Kunal Mehta
c3bbadcc83 Shell\Command: Move code that builds final shell command into separate method
Change-Id: I6aae209fd0b20057b5f7f7129db92c184ec945f8
2017-10-19 19:38:42 -07:00
Max Semenik
32912b8c8d Introduce Shell\CommandFactory
Bug: T177038
Change-Id: Id875e68ea1fa72b44a463f977ab52270fe1e7088
2017-10-17 18:55:11 -07:00
Max Semenik
4d9a95f970 Don't trigger PHP errors for unused Shell\Command
Change-Id: Id29da4f21a44ccb18d8a2ae11348d69ca3233aa5
2017-10-17 18:55:11 -07:00
Kunal Mehta
29e36cc4d8 Command: Avoid using wfDebug()
Change-Id: I92ea55d7a5b6a71a6f6b944f377215c08ea3b096
2017-10-17 18:22:42 -07:00
Max Semenik
945f8870d3 Shell\Command: Better walltime fallback
Previously, it assumed that the only way times could be overridden is to
reduce the limits - which isn't the case for video transcoding.

Bug: T178314
Change-Id: I492a44f280a36ee666e9963788caac2bbc6bc6f3
2017-10-17 03:43:09 +00:00
Fomafix
af72813a12 shell: Deduplicate code in Command.php by combining else paths
Also reduce indenting.

Change-Id: I33f83786c38bba0919372df0d5cdfa806d4361fc
2017-10-12 20:46:15 +00:00
Max Semenik
926c97c69f
Return stderr from Shell\Command
Change-Id: I5551ae4bbe7b539b528a734aa82198b11f103871
2017-10-12 02:12:20 -07:00
jenkins-bot
d4f712c326 Merge "Suppress error in MediaWiki\Shell\Command" 2017-10-10 18:52:53 +00:00
Gergő Tisza
2ebb0ca271 Suppress error in MediaWiki\Shell\Command
Command uses a certain error message to detect and ignore
EINTR in stream_select, and uses trigger_error to clear
the message from get_last_error (clear_last_error is PHP7 only).
This works rather poorly with a system config that does not catch
or ignore most errors; specifically it breaks database tests
on Vagrant with the warnings_as_errors role on.

Change-Id: I9c8f922bc0a8f5ee6b8e7501b22223cce4f98ecb
2017-10-09 00:28:02 +00:00
Max Semenik
7c3d3d54bd Get rid of $IP in Command
Change-Id: Iccfe1b79963462f9cad80ff327ccd574ee1122c5
2017-10-06 19:50:45 -07:00
Max Semenik
1bb9a223d2 Inject dependencies into Shell\Command
This slightly changes how execution time limits fall back on each other.

Change-Id: I7754a9e6be9638eebe90cb953adb8e2a6ee97cef
2017-10-03 20:01:59 -07:00
Max Semenik
77ce3b98a0 Replace wfShellExec() with a class
This function has gotten so unwieldy that a helper was
introduced. Instead, here's this class that makes
shelling out easier and more readable.

Example usage:
  $result = Shell::command( 'shell command' )
       ->environment( [ 'ENVIRONMENT_VARIABLE' => 'VALUE' ] )
       ->limits( [ 'time' => 300 ] )
       ->execute();

  $exitCode = $result->getExitCode();
  $output = $result->getStdout();

This is a minimal change, so lots of stuff remains
unrefactored - I'd rather limit the scope of this commit.
A future improvement could be an ability to get stderr
separately from stdout.

Caveat: execution errors (proc_open is disabled/returned error) now
throw errors instead of returning a status code. wfShellExec() still
emulates this behavior though.

Competing commit: I7dccb2b67a4173a8a89b035e444fbda9102e4d0f
<legoktm> MaxSem: so you should continue working on your patch and I'll
          probably refactor on top of it later after its merged :P

Change-Id: I8ac9858b80d7908cf7e7981d7e19d0fc9c2265c0
2017-09-08 21:49:49 -07:00