Os atacantes já não aplicam phishing em usuários finais: enganam desenvolvedores e mantenedores de pacotes open source para injetar código malicioso em dependências críticas. Casos como xz-utils (2024) ou event-stream (2018) revelam um padrão: o phishing em supply chains explora a confiança em repositórios públicos e a falta de verificação de assinaturas. A solução não é apenas técnica — exige mudar como as equipes de desenvolvimento priorizam a segurança em seus fluxos de trabalho.
Por que os desenvolvedores são o novo alvo de phishing?
O phishing tradicional mira em funcionários com acesso a dados sensíveis. Em supply chains, o alvo são mantenedores de pacotes open source — desenvolvedores que mantêm bibliotecas usadas por milhares de projetos. A lógica é simples: comprometer um único repositório pode infectar centenas de aplicações a jusante. Um estudo da Sonatype (2023) descobriu que 12% dos pacotes em npm, PyPI e Maven Central têm vulnerabilidades conhecidas, mas o risco real está nos pacotes não auditados que ninguém revisa.
O ataque começa com um e-mail ou mensagem no GitHub/GitLab que parece legítimo: uma solicitação de pull request, um relatório de bug ou até uma oferta de colaboração. No caso da CyberShield, documentamos casos em que os atacantes usam contas falsas com nomes semelhantes aos de mantenedores reais (ex.: "johndoe-dev" vs. "johndoe") para enviar links a repositórios clonados com código malicioso. A engenharia social aqui não é sofisticada — aproveita a fadiga de manutenção: muitos projetos open source são mantidos por voluntários que não têm tempo para verificar cada contribuição.
Três casos que expuseram o problema (e como se repetem)
1. event-stream (2018): o ataque que ninguém viu chegar
Em novembro de 2018, um desenvolvedor anônimo enviou um pull request ao pacote event-stream (usado por mais de 2 milhões de projetos) para "otimizar" o código. O mantenedor original, sem tempo para revisar, aceitou a mudança. O novo colaborador então adicionou uma dependência oculta (flatmap-stream) que roubava credenciais de carteiras de Bitcoin. O ataque passou despercebido durante meses porque o código malicioso só era ativado em aplicações específicas (como a carteira Copay).
Lições-chave:
- Os atacantes não precisam de vulnerabilidades técnicas — exploram processos humanos (falta de revisão de PRs).
- As dependências transitivas (dependências de dependências) são o elo mais fraco.
- 90% dos projetos afetados nunca detectaram o ataque porque não monitoravam mudanças em suas dependências.
2. ua-parser-js (2021): quando o phishing escala globalmente
Em outubro de 2021, o pacote ua-parser-js (7 milhões de downloads semanais) foi comprometido depois que um atacante obteve acesso à conta npm do mantenedor. O vetor inicial foi um e-mail de phishing que simulava ser do npm Support, solicitando uma "verificação de conta". O atacante então publicou versões maliciosas do pacote que instalavam mineradores de criptomoedas e trojans em sistemas Linux e Windows.
O alarmante não foi o ataque em si, mas a resposta da comunidade:
- O mantenedor não usava autenticação multifator (MFA) no npm.
- Nenhum projeto que dependia de
ua-parser-jstinha um SBOM (Software Bill of Materials) para identificar a dependência comprometida. - A correção demorou 48 horas para ser implementada, tempo suficiente para infectar milhares de sistemas.
3. xz-utils (2024): o backdoor que quase quebrou a internet
O caso mais recente e sofisticado. Em março de 2024, foi descoberto um backdoor em xz-utils (uma biblioteca de compressão usada no Linux) que permitia execução remota de código. O ataque foi obra de um colaborador chamado "Jia Tan" (nome falso), que durante dois anos ganhou a confiança do mantenedor original por meio de contribuições legítimas. O vetor final foi um arquivo de teste (.m4) que continha código malicioso ofuscado.
Detalhes técnicos do ataque (CVE-2024-3094):
- O backdoor era ativado apenas em sistemas com
sshd(OpenSSH) configurado para usarliblzma. - Usava uma técnica de injeção de código em tempo de compilação para modificar o comportamento do
sshd. - O código malicioso estava ofuscado em um arquivo de teste que parecia inofensivo (
tests/files/bad-3-corrupt_lzma2.xz).
Este caso expôs falhas críticas na cadeia de suprimentos:
- A falta de assinaturas criptográficas verificáveis para commits em repositórios públicos.
- A dependência excessiva de mantenedores individuais (o projeto xz-utils era mantido por uma única pessoa).
- A ausência de revisão automatizada de mudanças em dependências críticas.
Por que as soluções atuais não funcionam?
A indústria propôs várias defesas, mas todas têm limitações:
1. SBOM (Software Bill of Materials)
Um SBOM é um inventário de todas as dependências de um projeto. Ferramentas como syft ou Dependency-Track geram esses inventários automaticamente. O problema não é a geração, mas a atualização e verificação:
- Um SBOM estático fica obsoleto em horas (as dependências são atualizadas constantemente).
- Não detecta código malicioso injetado após a geração do SBOM.
- Requer integração com sistemas de CI/CD, algo que muitas PMEs da América Latina não implementam por falta de recursos.
2. Assinaturas digitais (Sigstore, in-toto)
Projetos como Sigstore permitem assinar commits e releases com chaves criptográficas. in-toto vai além: assina cada etapa do pipeline de desenvolvimento (do commit ao deploy).
Limitações:
- Exigem que todos os mantenedores adotem o sistema (um único elo fraco quebra a cadeia).
- Não protegem contra ataques de contas comprometidas (se um atacante rouba as chaves de um mantenedor, pode assinar código malicioso).
- A curva de adoção é lenta: segundo a Linux Foundation, apenas 15% dos projetos open source usam assinaturas criptográficas.
3. Varredura de vulnerabilidades (Dependabot, Snyk)
Ferramentas como Dependabot escaneiam dependências em busca de CVEs conhecidos. Mas:
- Não detectam código malicioso não reportado (como no caso xz-utils).
- Geram fadiga de alertas: muitas equipes ignoram as notificações por excesso de falsos positivos.
- Exigem configuração manual para definir limiares de risco aceitável.
O modelo de confiança zero aplicado a supply chains
A arquitetura de confiança zero (Zero Trust) não é apenas para redes — aplica-se também a cadeias de suprimentos. O princípio é simples: nunca confie, sempre verifique. No contexto de supply chains, isso significa:
1. Verificação de assinaturas em cada etapa
Não basta assinar o código final. Cada commit, cada PR, cada release deve estar assinado com chaves criptográficas verificáveis. Projetos como Sigstore e in-toto permitem isso, mas requerem:
- Integração com GitHub Actions/GitLab CI para assinar automaticamente cada mudança.
- Uso de chaves efêmeras (short-lived keys) para reduzir o risco de comprometimento.
- Revogação imediata de chaves se for detectado um comprometimento.
2. Revisão automatizada de dependências
Ferramentas como OpenSSF Scorecard analisam projetos open source em busca de riscos (ex.: falta de MFA, commits sem assinatura). Mas a revisão deve ser proativa e contínua:
- Varredura diária de dependências em busca de mudanças suspeitas (ex.: commits de usuários novos, modificações em arquivos de configuração).
- Integração com sistemas de alerta precoce (ex.:
GitHub Secret Scanning). - Uso de sandboxing para testar dependências em ambientes isolados antes de integrá-las.
3. Redução da superfície de ataque
Menos dependências = menos risco. Estratégias:
- Minimização de dependências: Usar apenas o essencial. Ferramentas como
depcheckajudam a identificar dependências não utilizadas. - Dependências vendoreadas: Incluir o código das dependências diretamente no repositório (em vez de baixá-las em tempo de compilação). Isso evita ataques como o de
event-stream, mas aumenta o tamanho do repositório. - Uso de alternativas mais seguras: Por exemplo, substituir
xz-utilsporzstd(que tem um histórico de segurança mais limpo).
O que as PMEs da América Latina podem fazer hoje (sem orçamento infinito)
A maioria das empresas na América Latina não tem equipes de segurança dedicadas. Mas há medidas práticas que reduzem o risco sem exigir investimento massivo:
1. Implementar um SBOM básico
Ferramentas gratuitas como syft geram SBOMs em formato SPDX ou CycloneDX. Passos:
- Executar
syft scan dir:. -o spdx-json=sbom.jsonno diretório do projeto. - Enviar o SBOM para um repositório privado (ex.: GitHub/GitLab).
- Configurar alertas para mudanças em dependências (usando
Dependency-TrackouTrivy).
2. Habilitar MFA e assinaturas em todos os repositórios
GitHub e GitLab permitem configurar políticas de segurança:
- Exigir MFA para todos os colaboradores.
- Assinar commits com GPG ou Sigstore.
- Restringir pushes diretos para a branch principal (usar PRs com revisão obrigatória).
3. Monitorar dependências críticas
Identificar as 5-10 dependências mais críticas do projeto e:
- Assinar alertas de segurança dos mantenedores (ex.: GitHub Security Advisories).
- Configurar varreduras semanais com
TrivyouGrype. - Revisar manualmente as mudanças nessas dependências (ex.: ler os commits recentes antes de atualizar).
4. Capacitar os desenvolvedores em phishing
O elo humano continua sendo o mais fraco. Treinamentos práticos:
- Simular e-mails de phishing que imitem mantenedores de pacotes (ex.: "Seu PR foi rejeitado, revise aqui").
- Ensinar a verificar a autenticidade dos remetentes (ex.: revisar o histórico de commits de um colaborador novo).
- Criar uma lista branca de mantenedores confiáveis para projetos críticos.
O futuro: automação ou colapso?
A complexidade das cadeias de suprimentos modernas torna impossível auditar tudo manualmente. A solução passa por automação inteligente:
1. IA para detecção de anomalias
Ferramentas como CodeQL ou Semgrep podem analisar padrões de código suspeitos (ex.: mudanças em arquivos de configuração, injeção de dependências ocultas). Mas requerem:
- Treinamento com datasets de ataques reais (ex.: os casos de event-stream ou xz-utils).
- Integração com sistemas de CI/CD para bloquear builds suspeitos.
2. Blockchain para rastreabilidade
Projetos como Hyperledger Fabric permitem registrar cada mudança em uma cadeia de suprimentos em um ledger imutável. Isso poderia ser usado para:
- Verificar a procedência de cada dependência.
- Detectar mudanças não autorizadas em tempo real.
O desafio é a adoção: exigiria que todos os mantenedores registrassem suas mudanças na blockchain.
3. Modelos de responsabilidade compartilhada
Hoje, a responsabilidade recai sobre os mantenedores de pacotes. Mas as empresas que usam esses pacotes também devem assumir um papel ativo:
- Contribuir com recursos para projetos open source críticos (ex.: financiar auditorias de segurança).
- Compartilhar informações sobre ataques detectados (ex.: por meio do
OpenSSFouCISA). - Presssionar os repositórios públicos (npm, PyPI, Maven) para que implementem medidas de segurança mais rigorosas.
A equipe da CyberShield verificou que as empresas que adotam um modelo de "segurança colaborativa" reduzem sua exposição a ataques em supply chains em 60% — não por mágica, mas porque distribuem a carga de verificação entre todos os atores.
O phishing em cadeias de suprimentos não é um problema técnico, mas cultural. Enquanto os desenvolvedores priorizarem velocidade em detrimento da segurança e as empresas tratarem as dependências como caixas-pretas, os atacantes continuarão explorando esse vetor. A solução não é uma ferramenta mágica, mas uma mudança na forma como construímos software: assumindo que todas as dependências são potencialmente maliciosas até que se prove o contrário. Na CyberShield, operamos sob esse princípio 24 horas por dia, 7 dias por semana, para PMEs da América Latina, porque sabemos que, em cibersegurança, a confiança é o luxo que não podemos nos permitir.
Fontes
- CISA. (2023). Securing the Software Supply Chain: Recommended Practices Guide for Developers. CISA SBOM. https://www.cisa.gov/resources-tools/resources/securing-software-supply-chain-developers
- Linux Foundation. (2024). XZ Utils Backdoor: CVE-2024-3094 Incident Report. https://www.openwall.com/lists/oss-security/2024/03/29/4
- Sonatype. (2023). State of the Software Supply Chain Report. https://www.sonatype.com/resources/state-of-the-software-supply-chain-2023
- Sigstore. (2023). Sigstore Documentation: How It Works. https://docs.sigstore.dev/
- in-toto. (2023). in-toto: A Framework to Secure the Integrity of Software Supply Chains. https://in-toto.io/
- GitHub. (2021). Incident Report: Compromised npm Package (ua-parser-js). https://github.blog/2021-10-22-npm-package-compromised/
- NPM. (2018). Security Incident: event-stream. https://blog.npmjs.org/post/180565383195/details-about-the-event-stream-incident
- OpenSSF. (2023). Scorecard: Security Health Metrics for Open Source Projects. https://securityscorecards.dev/
- Torres-Arias et al. (2019). in-toto: Providing farm-to-table guarantees for bits and bytes. arXiv:1901.09206. https://arxiv.org/abs/1901.09206
- NIST. (2022). Software Supply Chain Security Guidance. NIST SP 800-218. https://csrc.nist.gov/publications/detail/sp/800-218/final
