O Que É Dependency Confusion? Sequestrando Nomes de Pacotes Internos
Dependency confusion é um ataque em que alguém publica um pacote público com o mesmo nome do seu privado interno, na esperança de que seu build pegue o dele.
Muitas organizações têm pacotes privados, bibliotecas internas publicadas apenas em um registry privado. A dependency confusion explora como os package managers resolvem nomes: se um registry público tem um pacote com o mesmo nome e uma versão maior, o build pode puxar o público (controlado pelo atacante) em vez do seu. O atacante nunca precisa invadir sua rede; ele só adivinha um nome.
A falha de resolução
Quando um package manager é configurado para checar tanto um registry privado quanto um público, ele muitas vezes escolhe a versão mais alta que consegue encontrar entre todos eles. Um atacante publica um pacote público com o seu nome interno e um número de versão enorme, e o resolver o prefere.
Como o ataque se desenrola
- O atacante descobre um nome de pacote interno (de um manifest vazado, mensagem de erro ou palpite).
- Ele publica um pacote com esse nome no registry público com uma versão alta.
- Seu build resolve para a versão pública e a instala.
- O script de install do pacote malicioso roda com os privilégios do seu build.
Como nomes vazam
Nomes de pacotes internos aparecem em lockfiles commitados, stack traces, repos públicos e Dockerfiles. Atacantes não precisam de muito; uma única referência a um nome interno em um artefato público é o bastante para começar.
Defesas
Coloque em escopo ou namespace os pacotes internos para que seus nomes não possam colidir. Configure o package manager para buscar nomes internos apenas no registry privado. Fixe versões em um lockfile. Alguns registries permitem reivindicar ou reservar um namespace publicamente para bloquear impostores.
Por que importa para a CI
O install acontece no pipeline, onde os secrets são mais ricos. Um ataque de confusion que aterrissa na CI dá ao atacante o ambiente de build. Runners isolados e efêmeros com credenciais escopadas limitam o que esse install comprometido pode alcançar.
Principais conclusões
- Dependency confusion publica um impostor público do nome do seu pacote privado.
- Resolvers que preferem a versão mais alta entre registries puxam o pacote do atacante.
- Coloque os pacotes internos em namespace e trave a resolução no registry privado para bloqueá-lo.