Skip to main content

A segurança do Magento exige um patch adicional para corrigir vulnerabilidade de sanitização

Escrito por
Headshot of DeveloperSteve Coochin

DeveloperSteve Coochin

blog feature security alert purple

24 de fevereiro de 2022

0 minutos de leitura

Quem trabalha com tecnologia costuma estar sob muita pressão para corrigir código em produção, atualizar um componente de infraestrutura ou aplicar um patch. Muitas vezes, o aviso é curto e a correção precisava ter sido feita cinco minutos atrás. Em qualquer situação de “prazo zero”, é preciso equilibrar a pressa para corrigir logo com o tempo necessário para testar e verificar.

Recentemente, foi lançado um patch crítico para o Magento Ecommerce, o Magento Open Source e as versões do Magento para Adobe Commerce, após pesquisadores de segurança descobrirem um problema crítico na plataforma de e-commerce amplamente adotada. O CVE-2022-24086 identificou uma vulnerabilidade que permitia explorar uma injeção de SQL ou uma injeção de objetos PHP durante a finalização da compra, sem autenticação.

A equipe de segurança da Adobe lançou um patch inicial e agiu rápido para disponibilizar a correção. Alguns dias depois, pesquisadores descobriram que o patch não era suficiente para mitigar o problema no código. Isso levou à criação de um novo CVE-2022-24087 e à disponibilização de um segundo patch.

Há um patch para a vulnerabilidade recém-identificada no alerta de segurança mais recente da Adobe. O novo patch deve ser aplicado sobre o patch original para CVE-2022-24086.

Uma das coisas de que mais gosto na área de AppSec é fazer a devida diligência em implantações, bibliotecas e tudo o que possa afetar os usuários finais de uma plataforma. Então, vamos analisar o patch mais recente e ver o que mudou.

Analisando o patch para o CVE-20220-24087

Antes de me aprofundar no novo patch, MDVA-43443, vamos revisar o patch original, MDVA-43395, para entender o que ele fez.

É importante observar que as duas vulnerabilidades afetam apenas o Magento Open Source e o Adobe Commerce nas versões iguais ou superiores à 2.3.4 e inferiores à 2.4.5-p1 ou 2.3.7-p2.

O patch original (MDVA-43395) adicionou uma nova sanitização segura das entradas do usuário durante o fluxo de finalização da compra na lógica do aplicativo da loja Magento. /Email/Model/Template/transDirective e VarDirective.php receberam padrões de preg_replace() e preg_match() para ajudar a sanitizar tipos de caracteres indesejados nas entradas do usuário.

Trecho de código mostrando um loop preg_replace em PHP com um padrão de expressão regular e uma condição preg_match.

Após a implantação do patch, pesquisadores de segurança descobriram que ele não bastava para neutralizar o vetor de ataque e que, na verdade, abria caminho para o surgimento de vulnerabilidades ainda mais profundas no framework.

O novo patch (MDVA-43443) adiciona uma função reutilizável ao framework, chamada sanitizeValue(), como extensão de \Magento\Framework\Filter\Template. A função realiza uma verificação e correspondência de sanitização com preg_replace.

Diferença de código mostrando uma classe Filter do Magento com uma função sanitizeValue que retorna um valor booleano ou remove chaves de uma string.

Em seguida, sanitizeValue() é usada para substituir o código de sanitização com preg_match() e preg_replace() adicionado pelo patch original MDVA-43395.

Diff de código mostrando o filtro de template do Magento sanitizando o texto renderizado antes de aplicar modificadores

A função sanitizeValue() é então usada em vários pontos do código, inclusive no carregamento de valores de configuração e de tipos de valores personalizados já sanitizados.

Diff de código PHP que adiciona chamadas a sanitizeValue para validar parâmetros HTTP do Magento e valores de variáveis personalizadas

É em blockDirective() que ocorre mais uma etapa de sanitização: são adicionadas correspondências de caracteres e sanitizações ao núcleo de \Magento\Framework\FilterTemplate.

Trecho de código PHP que define blockDirective e substitui chaves duplas por entidades HTML

resolveBlockDirective deixa de ser uma função pública e passa a ser privada, e layoutDirective é migrada para resolveLayoutDirective.

A mudança de função pública para privada é importante para a segurança de aplicações PHP, porque a declaração como função privada significa que ela só pode ser usada dentro da classe pai. Uma função pública poderia ser acessada em qualquer parte do aplicativo.

Diferença de código mostrando uma função de diretiva de layout do Magento PHP renomeada para resolveLayoutDirective e verificando os parâmetros da diretiva.

Os dois patches estão disponíveis no Boletim de segurança APSB22-12 da Adobe, para instalação via PHP Composer ou para incorporação em uma base de código derivada.

Lembre-se de fazer backups seguros antes de aplicar os dois patches e testar o código antes da implantação.

Cadastre-se na Snyk para receber alertas sobre novas vulnerabilidades

Uma coisa que sempre faço com grandes projetos de código aberto, como o Magento, é monitorar o repositório público pelo meu Painel da Snyk.

Clique em Add Project e monitore repositórios públicos do GitHub.

Interface de pesquisa de projetos mostrando resultados para “magento”, com magento/magento2 selecionado e opções para adicionar projetos pelo GitHub, Cloud Foundry, Bitbucket Cloud e CLI.

Isso é especialmente útil em branches de desenvolvimento de um projeto, pois você pode receber alertas sobre possíveis problemas enquanto eles ainda estão sendo desenvolvidos. Também ajuda a contribuir com o projeto, porque permite identificar problemas que podem ser corrigidos antes de o desenvolvimento terminar.

Em projetos de plataforma como o Magento, o processo de monitoramento procura manifestos de pacotes, código, contêineres e configurações de IaC para analisar e destacar possíveis problemas. O melhor é que ele também sugere possíveis correções e ajuda você a entender tudo o que foi detectado.

Comece a participar de desafios de Capture the Flag

Aprenda a resolver desafios de Capture the Flag assistindo sob demanda ao nosso workshop virtual introdutório.