Na hierarquia das vulnerabilidades modernas da Web, Injeção de dependência (DI) Injeção de contêiner está no ápice da cadeia alimentar. É mais difícil de detectar do que a Injeção de SQL, mais elegante do que a Corrupção de Memória e devastadora em seu impacto.
A recente divulgação de CVE-2025-32432 direcionamento Craft CMS-e, por extensão, o Estrutura do Yii2-serve como um lembrete brutal: quando a entrada do usuário controla a instanciação da classe, o aplicativo pertence ao invasor. Embora muitos scanners automatizados tenham inicialmente classificado esse problema como "Atribuição em massa" ou "Problema de configuração" de baixa gravidade, os engenheiros de segurança de elite o reconhecem pelo que realmente é: Execução remota de código (RCE) por meio de uma lógica insegura de desserialização de objetos.
Este artigo realiza uma autópsia técnica da vulnerabilidade. Vamos além da consultoria do fornecedor para reconstruir a cadeia de gadgets, analisar os métodos mágicos subjacentes do PHP e demonstrar por que a análise semântica orientada por IA é a única maneira viável de detectar essas falhas lógicas em escala.

A arquitetura da falha: Por Dentro do Localizador de Serviços do Yii2
Para entender o CVE-2025-32432, você deve primeiro entender o coração arquitetônico do framework Yii2: yii\\di\\Container.
O Craft CMS depende muito do padrão Service Locator do Yii2 e do contêiner de injeção de dependência para gerenciar as dependências de classe. Para tornar o desenvolvimento flexível, o contêiner permite que os desenvolvedores configurem objetos usando matrizes de configuração. Esse recurso é a causa principal da vulnerabilidade.
O coletor "CreateObject
O sumidouro crítico nessa classe de vulnerabilidade é Yii::createObject(). Esse método aceita uma matriz de configuração em que o classe determina qual classe PHP deve ser instanciada, e as chaves subsequentes definem as propriedades públicas dessa instância.
PHP
// Uso legítimo no código de back-end do Craft CMS $object = Yii::createObject([ 'class' => 'app\\models\\\User', 'username' => 'admin', 'role' => 'superuser' ]);
A vulnerabilidade (CVE-2025-32432) surge porque ações específicas do controlador no Craft CMS (geralmente relacionadas ao salvamento da configuração do plug-in ou ao manuseio de rascunhos) aceitam a entrada JSON bruta da solicitação HTTP e a passam cegamente para esse coletor.
A falha de lógica:
- Fonte: O usuário envia
POST /api/v1/plugin-configcom corpo JSON. - Fluxo: O controlador decodifica o JSON em uma matriz PHP.
- Pia: A matriz é passada para
Yii::createObject($requestData). - Resultado: O invasor define o
classetransformando a injeção de dados em Injeção de objetos.

Construindo a cadeia de destruição: A caça aos gadgets
Na exploração do PHP, a capacidade de instanciar uma classe é inútil, a menos que essa classe faz algo interessante durante seu ciclo de vida. Precisamos de um Gadget.
Um Gadget é uma classe que realiza operações confidenciais (gravações de arquivos, execução de comandos, consultas a bancos de dados) em seus métodos mágicos (__construir, __destruir, Acordar, __toString) ou métodos de inicialização (inicial). Como o Craft CMS inclui todo o ecossistema Yii2 e bibliotecas de fornecedores em massa (Guzzle, Monolog, etc.), o cenário de gadgets é fértil.
O Gadget Primário: yii\\rest\\IndexAction
No contexto do CVE-2025-32432, a cadeia de gadgets mais confiável aproveita yii\\rest\\IndexAction. Essa classe foi projetada para listar modelos para uma API REST, mas ela tem uma propriedade específica: checkAccess.
O checkAccess destina-se a manter uma função chamável para verificação de permissão. No entanto, como controlamos os valores da propriedade por meio do contêiner DI, podemos transformar isso em uma função Primitiva de execução de retorno de chamada.
A carga útil armada (PoC)
Abaixo está uma carga útil de prova de conceito (PoC) reconstruída. Essa estrutura JSON, quando processada pelo endpoint vulnerável, aciona o RCE.
JSON
{"action": "save-config", "config": { "class": "yii\\\\rest\\\\IndexAction", "id": "rce_trigger", "controller": { "class": "yii\\\\web\\\\Controller", "id": "dummy_controller" }, "modelClass": "yii\\\\base\\\\Model", "checkAccess": "system", "run": "id; uname -a; cat /etc/passwd" } }
Fluxo de execução passo a passo:
- Instanciação: O contêiner DI vê
classe: yii\\rest\\IndexAction. Ele usa o Reflection para criar uma instância dessa classe. - População da propriedade: O contêiner percorre as chaves.
- Ele define
$indexAction->checkAccess = 'system' (sistema). - Ele instancia recursivamente um
controlador fictício(exigido porIndexAction).
- Ele define
- Acionando a armadilha: A maioria dos componentes do Yii2 chama
init()ouexecutar()durante seu ciclo de vida. Nesse caminho específico de exploração, a lógica do aplicativo acaba invocando a ação. - Execução de retorno de chamada: Interior
IndexAction::run()o código verifica secheckAccessestá definido.PHP// Lógica interna de yii\\rest\\IndexAction if ($this->checkAccess) { call_user_func($this->checkAccess, $this->id, $params); } - RCE: O PHP executa
sistema('rce_trigger', ...)? Não, o invasor deve alinhar os argumentos. Ao manipular as propriedades internas que são passadas como argumentos para o retorno de chamada, o invasor conseguesistema('id; ...').
Observação: Os atacantes avançados encadearão isso com yii\\caching\\FileCache gadgets para escrever um webshell PHP persistente (por exemplo, shell.php) no webroot público (/web/assets/), ignorando os limites de execução efêmeros.
Por que os scanners legados falham
A detecção do CVE-2025-32432 é um pesadelo para as ferramentas tradicionais de teste dinâmico de segurança de aplicativos (DAST).
- Cegueira de sintaxe: A carga útil é um JSON sintaticamente válido. Ele não contém tokens SQL (
' OU 1=1) ou vetores XSS (<script>). Os WAFs configurados para os padrões do OWASP Top 10 geralmente deixam isso passar. - Cegueira de contexto: Um scanner vê um objeto JSON. Ele não entende que a chave
classetem significado semântico para a estrutura PHP de back-end. Para um scanner,classeé apenas outro campo de dados comonome de usuáriooue-mail. Ele não pode inferir a Instanciação de objetos efeito colateral.
Detecção orientada por IA: A vantagem da penalidade
É aqui que Penligent.ai representa uma mudança de paradigma nos testes de segurança ofensivos. A Penligent vai além da correspondência de padrões para empregar Análise semântica com reconhecimento de contexto.
- Impressão digital da estrutura e mapeamento lógico
Os agentes de IA da Penligent identificam primeiro a pilha de tecnologia subjacente (Craft CMS / Yii2). Crucialmente, a IA "conhece" os sumidouros perigosos específicos dessa estrutura. Ela entende que, no Yii2, o Yii::createObject é um ponto de controle crítico, assim como o pickle.load é para o Python ou o unserialize é para o PHP genérico.
- Sondagem inteligente (Fuzzing com intenção)
Em vez de distribuir cegamente caracteres aleatórios, a Penligent constrói sondas lógicas.
- Sonda 1: Injetar
{"class": "yii\\\\helpers\\\\VarDumper"}. - Observação: O tempo de resposta é alterado? A mensagem de erro faz referência ao "VarDumper"?
- Inferência: Se o aplicativo tentar carregar a classe, a IA confirmará que a classe
classeestá sendo interpretado pelo contêiner DI.
- Verificação não destrutiva
Depois que o vetor de injeção é confirmado, a Penligent não precisa executar rm -rf / para comprovar a vulnerabilidade. Ele pode gerar uma cadeia de gadgets benigna (por exemplo, uma que simplesmente execute uma pesquisa de DNS em um ouvinte fora de banda) para comprovar a capacidade de RCE com certeza 100% e risco zero para a infraestrutura de produção. Isso permite que as equipes de segurança validem os patches CVE-2025-32432 sem interromper as operações comerciais.
Vulnerabilidades de alto impacto relacionadas
Para entender completamente o cenário de ameaças, os engenheiros de segurança devem correlacionar o CVE-2025-32432 com precedentes históricos. A mecânica do Injeção de contêineres não são exclusivos do Craft CMS.
| ID DO CVE | Software de destino | Mecanismo técnico |
|---|---|---|
| CVE-2023-41892 | Craft CMS | RCE via ImageMagick lógica de instanciação de objetos no condições parâmetro. |
| CVE-2019-15488 | Estrutura do Yii2 | Deserialização insegura em yii\\db\\BatchQueryResult Acordar método. |
Essas vulnerabilidades compartilham um DNA comum: A confiança dos tipos de entrada.
Remediação e defesa em profundidade
A atenuação do CVE-2025-32432 exige uma abordagem em várias camadas que envolve correções de código, fortalecimento da configuração e proteção do tempo de execução.
1. Correção em nível de código (a causa principal)
A correção definitiva é aplicar Verificação rigorosa de tipo. Os desenvolvedores nunca devem passar matrizes brutas de entrada do usuário diretamente para Yii::createObject.
- Lista de recusas: Desmarque explicitamente o
classedas matrizes de entrada antes do processamento. - Lista de permissões: Se a instanciação dinâmica for necessária, valide a classe solicitada em relação a uma lista branca rígida e codificada de classes seguras.
PHP
// Implementação segura $config = json_decode($json, true); unset($config['class']); // Evitar injeção de objeto $object = Yii::createObject(array_merge(['class' => SafeClass::class], $config));
2. Fortalecimento do tempo de execução (php.ini)
Mesmo que um invasor instancie uma classe, o RCE é impossível se as funções subjacentes do sistema forem neutralizadas. Configure seu php.ini para desativar funções de execução perigosas:
Ini, TOML
disable_functions = system, exec, shell_exec, passthru, proc_open, popen, pcntl_exec
3. Patching imediato
Aplique imediatamente a atualização mais recente do Craft CMS. A correção do fornecedor para o CVE-2025-32432 provavelmente introduz um filtro em nível de estrutura que impede que o classe de ser honrado em ações específicas do controlador.
Conclusão
CVE-2025-32432 é um lembrete claro de que, à medida que as estruturas se tornam mais abstratas e poderosas, elas introduzem superfícies de ataque lógico complexas. A injeção de contêineres é a "Injeção de SQL da década de 2020"-Uma falha não no código que você escreve, mas em como você configura a mágica da estrutura.
Para o engenheiro de segurança hardcore, a lição é clara: Validação de entrada deve se estender além dos valores de dados para os dados tipos e estruturas. Se você permitir que um usuário defina o estrutura de um objeto, você já perdeu o jogo.

