← back
CVE-2024-58136criticalunder attackCWE-424

CVE-2024-58136

95Vexday Risk Score

Patch now. It under exploitation confirmed by CISA and has a working public exploit.

ssvc Actcvss 9epss 85%
from disclosure to weapon
Published on NVDApr 10
CISA KEV+22d
exploitation probability
85%top 1% of all CVEs
observed exploitation
yesCISA + VulnCheck
Action required by CISAfederal deadline: 2025-05-23

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.

Researched and written with AI from the vendor advisory and public analysis, with the sources above. Always confirm the fixed version in the official advisory before acting.
Yii 2 before 2.0.52 mishandles the attaching of behavior that is defined by an __class array key, a CVE-2024-4990 regression, as exploited in the wild in February through April 2025.
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H
Affected products
yiiframework · Yii