Corrigindo outra falha de segurança no Magento – APPSEC-212

Logo após o lançamento da versão 1.7.x do Magento, foi anunciando a primeira grande falha de segurança do sistema decorrente da versão utilizada do Zend Framework.

Aqui mesmo no fórum você encontra informações e detalhes sobre o problema e como resolver: Como corrigir a falha de segurança do Magento – Zend Framework Vulnerability

Agora, logo após o lançamento da versão 1.8.x do Magento, no dia 11/12/2013 foi anunciado uma nova falha de segurança no sistema, chamada apenas de APPSEC-212.

O Problema

Fica até difícil entrar em detalhes sobre essa falha de segurança, pois a Magento Inc não liberou informação nenhuma. Então o máximo que podemos fazer é analisar o arquivo de correção pra ver que alterações/correções ele está fazendo no sistema.

E ao ler o script, podemos ver que as alterações são feitas no arquivo Images.php que fica em:

app/code/core/Mage/Cms/Helper/Wysiwyg/Images.php

E na função getCurrentPath() temos a alteração de algumas linhas de código. Onde basicamente é alterado a forma como é recuperado o caminho (path) dos arquivos enviados.

A Solução 1 – Muito simples

A solução mais rápida e fácil seria atualizar sua versão do Magento para as versões mais recentes (+ 1.8.x), pois essas já possuem o patch de correção.

Dowload da última versão do Magento CE no site oficial.

Importante ressaltar que TODOS devem fazer essa correção, não é optativo, você deve atualizar o sistema ou aplicar o patch de correção para evitar ataques.

Então, se por acaso atualizar o sistema não esteja nos seus planos, vamos as seguintes soluções…

A Solução 2 – Copiar e Colar

Agora que já entendemos o problema e analisamos o patch de correção, podemos aplicar nossa atualização manualmente.

O primeiro passo, claro, é copiar. E para isso precisamos acessar a página oficial da Magento em: www.magentocommerce.com/download

No final da página teremos “Magento Community Edition Patches“, onde você deve escolher a sua versão do Magento – pois cada versão possui um patch diferente.

download patch APPSEC-212

Ao clicar em download você deve obter um arquivo ou novo endereço com o script de correção.

Magento CE 1.4.0.0 ~ 1.4.0.1: www.magentocommerce.com/index.php/getmagento/ce_patches/PATCH_SUPEE-2530_CE_1.4.0.0-1.4.0.1_v1.sh

Magento CE 1.4.1.0 ~ 1.5.0.1: www.magentocommerce.com/index.php/getmagento/ce_patches/PATCH_SUPEE-2529_CE_1.4.1.0-1.5.0.1_v1.sh

Magento CE 1.5.1.0 ~ 1.7.0.2: http://www.magentocommerce.com/index.php/getmagento/ce_patches/PATCH_SUPEE-2518_CE_1.5.1.0-1.7.0.2_v1.sh

No final (bem no final) deste arquivo você vai encontrar algo semelhante a isto:

+++ app/code/core/Mage/Cms/Helper/Wysiwyg/Images.php
@@ -197,11 +197,11 @@ class Mage_Cms_Helper_Wysiwyg_Images extends Mage_Core_Helper_Abstract
    public function getCurrentPath()
    {
        if (!$this->_currentPath) {
-            $currentPath = $this->getStorageRoot();
-            $path = $this->_getRequest()->getParam($this->getTreeNodeName());
-            if ($path) {
-                $path = $this->convertIdToPath($path);
-                if (is_dir($path)) {
+            $currentPath = realpath($this->getStorageRoot());
+            $node = $this->_getRequest()->getParam($this->getTreeNodeName());
+            if ($node) {
+                $path = realpath($this->convertIdToPath($node));
+                if (is_dir($path) && false !== stripos($path, $currentPath)) {
            $currentPath = $path;
            }
        }

Onde a primeira linha (+++) indica o diretório e nome do arquivo a ser alterado. As linhas que iniciam com sinal de subtração () devem ser retiradas do código, e as linhas com sinal de adição (+) devem ser inseridas no código.

Salve o arquivo, limpe o cache, e respire aliviado. Correção concluída com sucesso.

A Solução 3 – Linha de comando

Essa solução é para o pessoal que manja de linha de comando e que falam que “copiar e colar” é para os fracos.

To brincando, essa solução é mais adequada se você possui uma lista enorme de sites para atualizar. Realmente seria contraproducente passar o dia inteiro abrindo arquivos para copiar e colar códigos. Nesses casos a solução por linha de comando seria mais indicada.

Abra seu prompt de comando com acesso SSH, neste exemplo usarei o Terminal do MacOsX. Digite seu nome de usuário, domínio, e senha para se conectar ao servidor:

ssh nomeUsuario@ftp.seuDominio.com

Navegue até o diretório de instalação do seu Magento. Agora digite o comando para copiar o patch para seu servidor, exemplo versão 1.7.x:

wget http://www.magentocommerce.com/index.php/getmagento/ce_patches/PATCH_SUPEE-2518_CE_1.5.1.0-1.7.0.2_v1.sh

Atenção! Lembre-se de baixar sempre o patch correspondente à sua versão do Magento. Se o comando wget não funcionar, baixe o arquivo e envie por FTP.

Agora basta executar o script usando o comando:

sh PATCH_SUPEE-1868_CE_1.7.0.2_v1.sh

Se você baixou o arquivo .patch ao invés de .sh, então o comando seria:

patch –p0 < PATCH_SUPEE-1868_CE_1.7.0.2_v1.patch

Uma mensagem de sucesso deve aparecer no terminal. Digite exit; para fechar a conexão ssh.

Dessa forma é extremamente mais rápido atualizar um conjunto de lojas. Mas lembre-se… você ainda precisa acessar todas as lojas atualizadas para limpar o cache.

Pra Encerrar

Avise todos seus amigos que utilizam Magento que eles devem fazer esta atualização (e aquela atualização do Zend Framework Vulnerability também!).

Tenha sempre um backup do sistema antes de aplicar alterações ou atualizações deste gênero – pois algo pode sair errado no processo.

A equipe da Magento Inc recomenda (e eu também) que você faça essa atualização primeiro em um ambiente de testes, para depois aplicar em um ambiente de produção.

Sucesso!