
Em abril de 2025, a Orange Cyberdefense descobriu uma vulnerabilidade crítica no Craft CMS durante uma investigação de incidente, agora rastreada como CVE-2025-32432. A falha permite a execução remota de código (RCE) não autenticada com a pontuação máxima de gravidade CVSS v3.1 de 10,0 (crítica) do NVD (National Vulnerability Database).
Como parte do Programa de Bolsas de Estudo em Segurança Cibernética para InfraestruturasOPSWAT , os nossos bolsistas realizaram um estudo abrangente sobre essa vulnerabilidade, incluindo a reprodução da exploração, a validação do seu impacto, a avaliação dos riscos organizacionais e a análise das estratégias de proteção recomendadas.
Este blog oferece uma análise aprofundada e abrangente sobre o CVE-2025-32432, analisando sua causa raiz, fluxo de exploração e implicações mais amplas para a segurança, ao mesmo tempo em que oferece orientações práticas para que as organizações se defendam contra essa ameaça.
CVE-2025-32432 Introdução
A CVE-2025-32432 afeta as versões 3.0.0-RC1 a 3.9.14, 4.0.0-RC1 a 4.14.14 e 5.0.0-RC1 a 5.6.16 do Craft CMS. Classificada como CWE-94: Injeção de código, a falha surge do tratamento inadequado de entradas não confiáveis, permitindo, em última instância, RCE não autenticado.

Craft CMS e a estrutura Yii
O Craft CMS é um sistema de gestão de conteúdos moderno que permite aos programadores e equipas de conteúdos criar websites flexíveis e totalmente personalizados, em vez de dependerem de modelos rígidos e pré-definidos. Com adoção em mais de 46.000 websites em todo o mundo, é amplamente utilizado e um alvo frequente para atacantes que procuram vulnerabilidades de alto impacto.
O Craft CMS é construído com base no Yii Framework, uma estrutura PHP rápida e poderosa criada para o desenvolvimento web moderno. O Yii fornece a estrutura e as ferramentas principais, enquanto o Craft CMS a amplia para oferecer um sistema de gestão de conteúdo flexível.

Uma das principais características do framework Yii é o seu contentor de injeção de dependências (DI). A injeção de dependências é um padrão de design que fornece aos componentes os recursos de que necessitam, em vez de exigir que eles próprios construam esses recursos. O contentor DI do Yii é altamente flexível, capaz de construir objetos complexos a partir de regras de configuração relativamente simples.
No entanto, essa flexibilidade acarreta riscos. No caso do CVE-2025-32432, o contentor DI foi utilizado indevidamente em combinação com entradas de utilizadores não confiáveis, criando um caminho para a execução remota de código. Este caso demonstra que mesmo funcionalidades seguras e poderosas de uma estrutura podem tornar-se perigosas se forem integradas sem uma compreensão completa das suas implicações de segurança.
Análise aprofundada do CVE-2025-32432
O Craft CMS inclui um recurso chamado Image Transforms, que foi projetado para otimizar o desempenho, gerando imagens redimensionadas diretamente no servidor. Em vez de entregar uma imagem grande de 4,5 MB para exibir como uma miniatura de 300×300, o Craft CMS cria e serve automaticamente uma versão menor e otimizada. Essa abordagem reduz o uso de largura de banda e melhora significativamente a velocidade de carregamento da página.
Para tornar essa funcionalidade amplamente disponível, o Craft CMS expõe o endpoint actions/assets/generate-transform sem exigir autenticação. Embora isso garanta que usuários autenticados e anónimos possam se beneficiar de imagens otimizadas, também introduz uma superfície de ataque acessível ao público, onde qualquer pessoa pode fornecer entradas criadas para o aplicativo.

Através de uma análise detalhada deste fluxo de trabalho, os nossos colegas identificaram que o método AssetsController::actionGenerateTransform é invocado sempre que uma solicitação POST é enviada para o ponto final exposto. Esta função recupera o parâmetro handle diretamente do corpo da solicitação e o encaminha para processamento posterior na próxima etapa.

Na etapa seguinte, o método ImageTransforms::normalizeTransform() é chamado. Esse método recebe o parâmetro handle fornecido pelo utilizador e o converte em um objeto ImageTransform. Como o objeto é criado diretamente a partir de uma entrada não confiável, isso representa um ponto crítico de risco no fluxo de execução.

Durante este processo, todos os pares chave-valor da matriz $transform controlada pelo utilizador (originária do parâmetro handle) são mesclados numa matriz de configuração. O método normalizeTransform então passa esta matriz para Craft::createObject(), que é responsável por instanciar um novo objeto ImageTransform.

A vulnerabilidade decorre da forma como Craft::createObject() (envolvendo Yii::createObject() do Yii) processa matrizes de configuração. Como esse mecanismo usa o contentor DI para instanciar e configurar objetos diretamente da matriz não validada, os atacantes podem obter controlo sobre o processo de construção do objeto.

Quando uma carga maliciosa é passada, o construtor do objeto (herdado da classe Model ) invoca o método App::configure().

Este método itera sobre cada propriedade na matriz controlada pelo invasor e atribui-as ao novo objeto.

When App::configure() assigns properties from the attacker-controlled configuration array, most keys are mapped directly onto the object. However, if a key begins with the prefix as, the assignment is routed through Component::__set, Yii’s magic setter. This method interprets as <name> as an instruction to attach a behavior (mixin) to the object.
Uma carga maliciosa desse tipo pode ser criada para explorar a forma como Component::__set processa propriedades com o prefixo as, como por exemplo:

De acordo com a nossa análise, a implementação do Component::__set inclui uma salvaguarda: quando um comportamento é anexado por meio dessa propriedade, a estrutura verifica se a classe especificada na matriz de configuração é uma subclasse válida do yii\base\Behavior. Essa verificação tem como objetivo impedir que classes arbitrárias sejam anexadas diretamente aos componentes.

No entanto, essa proteção não é tão eficaz quanto parece. A fraqueza vem da forma como o Yii::createObject lida com matrizes de configuração.
Ao instanciar um objeto, Yii::createObject dá prioridade ao parâmetro especial __class. Se essa chave estiver presente, o seu valor é usado como a classe de destino para a instanciação, e a chave de classe padrão na matriz de configuração é ignorada.

O invasor pode criar uma carga útil para o comportamento de exploração que inclui duas chaves:
- 'class' => '\craft\behaviors\FieldLayoutBehavior' - Uma classe legítima que estende yii\base\Behavior. Este valor existe apenas para satisfazer a verificação is_subclass_of em Component::__set, permitindo que a execução continue sem gerar um erro.
- '__class' => '\yii\rbac\PhpManager' - O alvo real do invasor. Esta é a classe "gadget" que eles querem instanciar.
Quando o código é executado, Component::__set passa na verificação de segurança porque apenas inspeciona a chave da classe. No entanto, quando a estrutura chama posteriormente Yii::createObject para anexar o comportamento, dá precedência a __class, resultando na instanciação do objeto \yii\rbac\PhpManager escolhido pelo invasor.
O uso de \yii\rbac\PhpManager é intencional. Simplesmente criar um objeto não é suficiente para a exploração; para conseguir RCE, é necessária uma classe gadget com efeitos colaterais que possam ser transformados em armas. O PhpManager é um alvo comum em ataques POI (PHP Object Injection) devido ao seu fluxo de inicialização. Após a instanciação, o seu método init() chama load(), que então invoca loadFromFile($this->itemFile). Com o controlo sobre $this->itemFile, um invasor pode forçar a aplicação a carregar um ficheiro malicioso, transformando a criação de objetos em execução de código.

O perigo reside no método loadFromFile. Em PHP, um require executa o ficheiro de destino como código, portanto, se um invasor controlar o caminho do ficheiro, poderá acionar a execução de código arbitrário.
Para colocar código malicioso no servidor, o invasor explora os ficheiros de sessão PHP. Ao injetar PHP num parâmetro de solicitação, o Craft CMS guarda a carga útil num ficheiro de sessão durante o processo de redirecionamento. Posteriormente, quando o PhpManager carrega esse ficheiro, o código do invasor pode ser executado.

A cadeia de ataque completa funciona em três etapas. Primeiro, o invasor planta um PHP malicioso enviando uma URL criada, que o Craft CMS guarda num ficheiro de sessão. Em seguida, eles exploram o bypass __class no endpoint de transformação de imagem para carregar o gadget PhpManager e direcioná-lo para o ficheiro de sessão corrompido. Por fim, quando o PhpManager carrega o ficheiro, a carga útil do invasor é executada, concedendo RCE e controle total do servidor — geralmente por meio de um webshell ou shell reverso.



Mitigação e reparação
Para mitigar eficazmente os riscos associados ao CVE-2025-32432, as organizações precisam de visibilidade e controlo sobre os seus componentes de código aberto. Sem um inventário claro dos componentes, a aplicação de patches torna-se uma tarefa aleatória.
OPSWAT , uma tecnologia proprietária daplataforma MetaDefender®, atende a essa necessidade, fornecendo um inventário de todos os componentes de software, bibliotecas, contentores Docker e dependências em uso. Ele permite que as organizações rastreiem, protejam e atualizem seus componentes de forma proativa.


No exemplo acima,a tecnologia SBOM do MetaDefender verificou o pacote nginx-ingress-controller que continha a vulnerabilidade CVE-2025-32432. O sistema sinalizou automaticamente o problema como crítico e forneceu orientações sobre as versões corrigidas disponíveis, permitindo que as equipas priorizassem e corrigissem rapidamente a vulnerabilidade antes que ela pudesse ser explorada.
OPSWAT está disponível em MetaDefender Core e MetaDefender Software Chain™,permitindo que as equipas de segurança identifiquem e ajam sobre vulnerabilidades mais rapidamente. Com OPSWAT , as equipas de segurança podem:
- Localize rapidamente os componentes vulneráveis - Identifique imediatamente os componentes de código aberto afetados por ataques de desserialização. Isso garante uma ação rápida na correção ou substituição das bibliotecas vulneráveis.
- Garanta a aplicação proativa de patches e atualizações – Monitore continuamente os componentes de código aberto por meio OPSWAT para se antecipar às vulnerabilidades de deserialização. OPSWAT pode detectar componentes desatualizados ou inseguros, permitindo atualizações oportunas e reduzindo a exposição a ataques.
- Manter a conformidade e a comunicação de relatórios – OPSWAT ajuda as organizações a cumprir os requisitos de conformidade, à medida que as estruturas regulatórias exigem cada vez mais transparência nas cadeias de fornecimento de software.
Pronto para fortalecer a sua cadeia de fornecimento de software contra ameaças emergentes?
