CVE-2024-58136
Patch now. It under exploitation confirmed by CISA and has a working public exploit.
Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.
Summary
Falha no framework PHP Yii 2 que permite, sob condições específicas, instanciar uma classe arbitrária através do mecanismo de atribuição dinâmica de "behaviors" (`Component::__set()`), reintroduzindo o Object Injection que já havia sido corrigido pelo CVE-2024-4990 (GHSA-cjcc-p67m-7qxm). Importa porque foi o vetor usado em uma campanha real de RCE contra instalações do CraftCMS (que embute Yii2) documentada entre fevereiro e abril de 2025 — mas o AC:H do CVSS não é decorativo: o bug em si não é explorável direto por qualquer app Yii2, depende de a aplicação hospedeira expor um caminho que passe dados controlados pelo atacante para essa configuração de objeto.
Technical detail
O núcleo do problema está em `Component::__set()`. Quando uma propriedade com prefixo "as " recebe um array de configuração, o Yii2 tenta anexá-lo como behavior: se o array tem a chave `class` apontando para uma subclasse de `Behavior`, ele chama `Yii::createObject($value)` para instanciar o objeto. O CVE-2024-4990 (GHSA-cjcc-p67m-7qxm), corrigido na 2.0.51, endureceu essa checagem para aceitar apenas a chave `class` validada via `is_subclass_of()`.
Essa correção quebrou instalações que definiam behaviors usando a chave `__class` — convenção alternativa que o próprio `Yii::createObject()` honra internamente para permitir merge/override de configuração. O PR #20232 (commit 40fe496, mesclado em 25/07/2024) tentou restaurar esse suporte adicionando uma checagem OR: aceita o array se (`class` setado E subclasse de Behavior) OU (`__class` setado E subclasse de Behavior).
O problema, apontado no mesmo dia pelo mantenedor rob006 no próprio PR: a validação e a instanciação não usam a mesma chave de forma consistente. Um atacante que controle o array pode setar `class` como uma subclasse legítima de `Behavior` (passa a validação) e `__class` como qualquer outra classe arbitrária — porque `Yii::createObject()` prioriza `__class` sobre `class` ao decidir o que efetivamente instanciar. Resultado: a checagem de segurança valida uma classe, mas o código instancia outra, sem qualquer restrição a subclasses de `Behavior`. Isso é essencialmente CWE-470 (uso de entrada externamente controlada para selecionar código/classe) montado sobre um mecanismo de configuração dinâmica de objetos (CWE-915).
O gatilho remoto não está no Yii2 isoladamente: exige que a aplicação construída sobre o framework exponha, direta ou indiretamente (por exemplo via uma cadeia de deserialização insegura ou manipulação de configuração de projeto), a capacidade de o atacante controlar o array passado para essa atribuição de behavior em um Component.
How it’s exploited
A exploração documentada in-the-wild (fevereiro a abril de 2025) ocorreu contra CraftCMS, que depende do Yii2 e, no período da campanha, usava uma revisão do framework situada entre o commit da regressão (40fe496, 25/07/2024) e o commit do fix definitivo (899a833, 14/09/2024) — ou seja, uma instalação puxada via dependência não fixada em release estável, não o Yii2 2.0.51 nem o 2.0.52 tag final. O blog da SensePost detalha essa campanha como parte de uma cadeia de RCE no CraftCMS, na qual o gadget de object injection do Yii2 é uma peça, não o ponto de entrada isolado.
Pré-requisito real: o atacante precisa de um caminho dentro da aplicação que traduza entrada não confiável em um array de configuração atribuído a uma propriedade de behavior (`as algumaCoisa`) de um Component Yii2, contendo simultaneamente `class` (uma subclasse de Behavior válida, só para passar a checagem) e `__class` (a classe real que se quer instanciar). Isso normalmente não é exposto por um endpoint HTTP genérico — depende de outra vulnerabilidade ou funcionalidade da aplicação hospedeira que exponha esse ponto de configuração ao usuário.
O impacto final depende inteiramente do que a classe instanciada via `__class` faz em seu construtor ou nos setters subsequentes (gadget chain) — pode variar de leitura/escrita arbitrária de arquivo até execução remota de código, como foi o caso na cadeia contra CraftCMS. Não é uma vulnerabilidade de "um payload universal": a classe alvo precisa existir e ser autoloadável no contexto da aplicação, e ter efeitos colaterais úteis ao atacante.