Alguns pesquisadores descobriram que um novo ataque de dependência permite a execução de código em servidores internos de 35 empresas.
Alguns dias atrás, foi revelado um método surpreendentemente simples que permite atacar dependências em aplicativos desenvolvidos usando repositórios de pacotes internos.
Os pesquisadores que identificaram o problema conseguiram executar seu código nos servidores internos de 35 empresas, incluindo PayPal, Microsoft, Apple, Netflix, Uber, Tesla e Shopify.
Ataque de dependência permite a execução de código em servidores internos de 35 empresas
Os hacks foram realizados como parte dos programas Bug Bounty, em coordenação com as empresas atacadas, e os perpetradores já receberam US$ 130.000 em bônus por identificar vulnerabilidades.
O método é baseado no fato de que muitas empresas usam dependências de repositório NPM, PyPI e RubyGems padrão em seus aplicativos internos, bem como dependências internas que não são distribuídas publicamente ou baixadas de seus próprios repositórios.
O problema é que gerenciadores de pacotes como npm, pip e gem tentam baixar dependências internas de empresas, mesmo de repositórios públicos.
Para um ataque, basta definir os nomes dos pacotes com dependências internas e criar seus próprios pacotes com os mesmos nomes nos repositórios públicos do NPM, PyPI e RubyGems.
O problema não é específico do NPM, PyPI e RubyGems e também se manifesta em outros sistemas, como NuGet, Maven e Yarn.
A ideia do método proposto surgiu depois que um pesquisador percebeu acidentalmente que no código disponível publicamente postado no GitHub, muitas empresas não removem de seus arquivos de manifesto a menção de dependências adicionais usadas em projetos internos ou ao implementar funcionalidade estendida.
Traços semelhantes foram encontrados no código JavaScript para serviços da web, bem como em projetos Node.JS, Python e Ruby de muitas empresas.
Os principais vazamentos estavam relacionados à incorporação do conteúdo dos arquivos package.json em código JavaScript publicamente disponível durante o processo de construção, bem como o uso de elementos de caminho reais em chamadas require(), que podem ser usados para julgar os nomes das dependências .
A varredura de vários milhões de domínios corporativos revelou vários milhares de nomes de pacotes JavaScript que não estavam no repositório NPM.
Depois de compilar um banco de dados de nomes de pacotes internos, o pesquisador decidiu realizar um experimento para hackear a infraestrutura de empresas participantes de programas Bug Bounty.
Os resultados foram surpreendentemente eficazes e o pesquisador foi capaz de executar seu código em muitos computadores e servidores de desenvolvimento responsáveis por construir ou testar com base em sistemas de integração contínua.
Ao baixar dependências, os gerenciadores de pacotes npm, pip e gem instalaram principalmente pacotes dos repositórios públicos primários NPM, PyPI e RubyGems, que foram considerados de maior prioridade.
A presença de pacotes semelhantes com os mesmos nomes nos repositórios de empresas privadas foi ignorada sem mostrar quaisquer avisos ou causar travamentos que pudessem chamar a atenção dos administradores.
No PyPI, a prioridade de download foi influenciada pelo número da versão (independentemente do repositório, a versão mais recente do pacote foi baixada). No NPM e RubyGems, a prioridade era apenas dependente do repositório.
O pesquisador colocou pacotes nos repositórios NPM, PyPI e RubyGems que se cruzam com os nomes das dependências internas encontradas, adicionando código ao script que é executado antes da instalação (pré-instalado no NPM) para coletar informações sobre o sistema e enviar as informações recebido para o host externo.
Para transmitir informações sobre o sucesso do hack, ignore os firewalls que bloqueiam o tráfego externo, o método de organizar as comunicações de canal secreto por meio do protocolo DNS.
O código que estava sendo executado resolveu o host no domínio de ataque sob o controle do domínio de ataque, o que tornou possível coletar informações sobre operações bem-sucedidas no servidor DNS. Informações sobre o host, nome de usuário e caminho atual foram passadas.
75% de todas as execuções de código registradas foram associadas a downloads de pacotes NPM, principalmente devido ao fato de que havia significativamente mais nomes de módulos internos em JavaScript do que nomes de dependências em Python e Ruby.