Vulnerabilidade grave de segurança na extração de arquivos ZIP do Bower
31 de janeiro de 2019
0 minutos de leituraNo início deste mês, foi descoberto que o Bower, um gerenciador de pacotes web popular, está vulnerável durante a extração de arquivos compactados. Até o momento, identificamos dois incidentes de segurança relacionados a ele, e já há versões com correções disponíveis:
Gravações arbitrárias de arquivos, com potencial para injeção de comandos remota, foram corrigidas no Bower 1.8.6. O problema foi causado pelas vulnerabilidades Zip Slip encontradas na dependência Zip Slip decompress-zip, uma dependência de código aberto usada pelo Bower.
Gravações arbitrárias de arquivos causadas por vulnerabilidades em links simbólicos (symlinks) em arquivos .tar.gz — exploráveis devido à forma como o Bower extrai esses arquivos — foram corrigidas no Bower 1.8.8.
O Webpack, o yarn e o registro do npm podem ter mudado o cenário para o Bower, mas ele ainda é usado. Embora hoje existam gerenciadores de pacotes mais populares e o npm seja, na prática, o registro padrão para JavaScript, muita gente ainda depende do Bower, que registra quase 2 milhões de downloads por mês. Isso mostra a gravidade desse problema de segurança.
Em 1º de janeiro de 2019, um pesquisador de segurança chamado skyn3t reportou ao grupo de trabalho de segurança do Node.js, no HackerOne, uma gravação arbitrária de arquivos causada pela validação inadequada de symlinks, decorrente da forma como o Bower extrai arquivos tar.
Pouco depois da triagem do bug, Adam Stankiewicz, da equipe principal do Bower, foi convidado a analisar o relatório e confirmou o problema rapidamente. A correção foi incluída na versão 1.8.8 do Bower.
Travessia maliciosa de caminhos durante a extração de arquivos compactados
Se um agente mal-intencionado criasse um arquivo ZIP especialmente preparado para um pacote instalado com o Bower, isso poderia causar uma travessia de caminhos e fazer com que os arquivos fossem extraídos fora do diretório raiz previsto para a descompactação.
A prova de conceito (POC) a seguir vem de um relatório de segurança divulgado por skyn3t ao programa do grupo de trabalho de segurança do Node.js no HackerOne. Ela mostra como o tratamento inseguro de symlinks pode resultar em gravações arbitrárias de arquivos.
O arquivo malicioso do pacote
O arquivo precisa criar um symlink para um diretório e, em seguida, colocar um arquivo nesse diretório de destino. Mas, para reproduzir essa estrutura de diretórios, precisamos criar manualmente um arquivo compactado malicioso.
Vamos começar criando um diretório para o pacote malicioso, um arquivo package.json padrão para o Bower e um symlink para /tmp:
Agora podemos criar um arquivo tar para esse pacote, tomando o cuidado de não compactá-lo:

A parte complicada é colocar um arquivo sob nosso controle no diretório /tmp e, essencialmente, em mySpecialDirectory/ dentro do arquivo. Esse nome de arquivo já está sendo usado por um link, então não podemos simplesmente reutilizá-lo em nosso próprio sistema de arquivos.
Para contornar esse desafio, vamos recorrer à funcionalidade padrão dos arquivos tar: manipular os dados dentro do arquivo. Arquivos tar permitem atualizar um arquivo existente, por exemplo, adicionando mais arquivos. Assim, podemos criar uma rota de escape.
Vamos excluir o link, criar um diretório em seu lugar e colocar nele nosso próprio arquivo. Em seguida, adicionaremos apenas esse arquivo ao arquivo tar usando a funcionalidade de atualização:
Como mostra a captura de tela, o conteúdo do arquivo inclui um symlink para o diretório /tmp e também um link para um arquivo malicioso que criamos:

É importante observar que arquivos compactados não podem ser manipulados da mesma forma que arquivos tar. Por isso, vamos compactar o arquivo com gzip agora, depois de prepará-lo para o ataque:
Como iniciar a instalação pelo Bower
Agora que temos um arquivo tar.gz no diretório inicial, em ~/tmp, vamos executar uma instalação do Bower a partir do sistema de arquivos local para demonstrar como o pacote é extraído:

Como podemos ver, a instalação usa o Bower 1.8.7. Ao instalar o pacote malicioso, o arquivo malicioso sob nosso controle foi instalado no diretório /tmp do sistema.
Como corrigir a vulnerabilidade
O Bower é compatível com estes tipos de arquivo: tar, tar.gz e ZIP. Uma vulnerabilidade semelhante que afetava pacotes ZIP já havia sido corrigida com a correção de decompress-zip, mas tar e tar.gz continuavam vulneráveis.
A correção aplicada para as vulnerabilidades em tar e tar.gz mitigou o problema ao ignorar quaisquer symlinks nos pacotes instalados. Desde então, uma nova versão do Bower, a 1.8.8, foi lançada para que os usuários possam atualizar e reduzir o risco de segurança.
No início de 2018, a equipe de pesquisa de segurança da Snyk cunhou o termo para a vulnerabilidade de segurança Zip Slip após realizar uma pesquisa abrangente sobre exploração durante a extração de arquivos compactados, que pode resultar em gravações arbitrárias de arquivos. Em casos críticos, isso também pode levar à execução remota de comandos e à sobrescrita de arquivos confidenciais de configuração do sistema.
A pesquisa sobre Zip Slip levou à descoberta de milhares de projetos vulneráveis em diversos ecossistemas, incluindo projetos da Apache, Pivotal, Amazon e outras empresas.
Em resumo
Vimos como criar deliberadamente um pacote malicioso capaz de provocar a gravação arbitrária de arquivos. Mas o problema não se limita ao download de pacotes maliciosos. Se um pacote for obtido por um meio inseguro, como uma conexão sem HTTPS, é possível realizar um ataque man-in-the-middle.
Problemas na extração de arquivos não são novidade e podem remontar a um artigo da Phrack de 1991, que explicava como invadir um BBS usando vetores de ataque baseados na extração de arquivos ZIP. É provável que continuemos encontrando vulnerabilidades Zip Slip em bibliotecas e aplicações à medida que as pesquisas nessa área avançarem.
Lembre-se: mesmo que symlinks sejam permitidos, trabalhar com arquivos compactados controlados pelo usuário é perigoso. Trate-os com o devido cuidado, assim como qualquer outra entrada fornecida pelo usuário.
Principais conclusões
Atualize para o Bower 1.8.8 o quanto antes.
Consulte nossa folha de dicas sobre Zip Slip para ver referências a códigos vulneráveis em diferentes ecossistemas de linguagens de programação e saber como evitar vulnerabilidades semelhantes em seu código.



