namespace MediaWiki\Shell;
-use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
/**
*
* ... = $result->getExitCode();
* ... = $result->getStdout();
+ * ... = $result->getStderr();
*/
class Shell {
+ /**
+ * Apply a default set of restrictions for improved
+ * security out of the box.
+ *
+ * Equal to NO_ROOT | SECCOMP | PRIVATE_DEV
+ *
+ * @note This value will change over time to provide increased security
+ * by default, and is not guaranteed to be backwards-compatible.
+ * @since 1.31
+ */
+ const RESTRICT_DEFAULT = 7;
+
+ /**
+ * Disallow any root access. Any setuid binaries
+ * will be run without elevated access.
+ *
+ * @since 1.31
+ */
+ const NO_ROOT = 1;
+
+ /**
+ * Use seccomp to block dangerous syscalls
+ * @see <https://en.wikipedia.org/wiki/seccomp>
+ *
+ * @since 1.31
+ */
+ const SECCOMP = 2;
+
+ /**
+ * Create a private /dev
+ *
+ * @since 1.31
+ */
+ const PRIVATE_DEV = 4;
+
+ /**
+ * Restrict the request to have no
+ * network access
+ *
+ * @since 1.31
+ */
+ const NO_NETWORK = 8;
+
+ /**
+ * Deny execve syscall with seccomp
+ * @see <https://en.wikipedia.org/wiki/exec_(system_call)>
+ *
+ * @since 1.31
+ */
+ const NO_EXECVE = 16;
+
/**
* Returns a new instance of Command class
*
// treat it as a list of arguments
$args = reset( $args );
}
- $command = new Command();
- $config = MediaWikiServices::getInstance()->getMainConfig();
-
- $limits = [
- 'time' => $config->get( 'MaxShellTime' ),
- 'walltime' => $config->get( 'MaxShellWallClockTime' ),
- 'memory' => $config->get( 'MaxShellMemory' ),
- 'filesize' => $config->get( 'MaxShellFileSize' ),
- ];
- $command->limits( $limits );
- $command->cgroup( $config->get( 'ShellCgroup' ) );
- $command->setLogger( LoggerFactory::getInstance( 'exec' ) );
+ $command = MediaWikiServices::getInstance()
+ ->getShellCommandFactory()
+ ->create();
return $command->params( $args );
}
if ( wfIsWindows() ) {
// Escaping for an MSVC-style command line parser and CMD.EXE
- // @codingStandardsIgnoreStart For long URLs
// Refs:
// * https://web.archive.org/web/20020708081031/http://mailman.lyra.org/pipermail/scite-interest/2002-March/000436.html
// * https://technet.microsoft.com/en-us/library/cc723564.aspx
// * T15518
// * CR r63214
// Double the backslashes before any double quotes. Escape the double quotes.
- // @codingStandardsIgnoreEnd
$tokens = preg_split( '/(\\\\*")/', $arg, -1, PREG_SPLIT_DELIM_CAPTURE );
$arg = '';
$iteration = 0;