Investigation

Dependency Confusion et Typosquatting: Defense Pratique pour Equipes Dev

Por Equipe Basilisk ·

Comment les politiques de registry, lockfiles et scoping bloquent les paquets malveillants avant le build. Guide technique hands-on de l equipe Basilisk.

En 2021 un chercheur a empoche plus de 130 mille dollars de bug bounty en publiant des paquets portant des noms internes d Apple, Microsoft, PayPal et des dizaines d autres entreprises sur les registres publics npm et PyPI. L attaque n a utilise aucun zero-day: elle a juste exploite la precedence que les gestionnaires de paquets donnent au registry public quand le nom existe des deux cotes. Cinq ans plus tard, les equipes Basilisk trouvent encore ce vecteur ouvert dans 7 pipelines audites sur 10. Dependency confusion et typosquatting ne sont pas des curiosites academiques, ce sont la porte d entree bon marche pour compromettre un build entier et, par consequence, chaque client recevant cet artefact.

Le mecanisme du dependency confusion est simple et cruel. Vous avez un paquet interne nomme acme-payments-sdk heberge sur un Nexus ou Artifactory prive. Un attaquant decouvre ce nom dans un package.json fuite, un post Stack Overflow ou une couche docker publique, et publie acme-payments-sdk@99.0.0 sur npmjs.com. La prochaine fois que le pipeline lance npm install sans lockfile strict, le resolver choisit la version superieure. Voila, du code arbitraire qui tourne dans votre CI avec des credentials AWS, des tokens GitHub et un acces au registry interne. On l a vu sur le terrain dans des missions similaires a Pentest APIs REST et GraphQL : Checklist Technique pour Bug Bounty Legal, ou la surface du build etait plus exploitable que l API elle-meme.

Le typosquatting joue dans une autre cour. Au lieu de reprendre le vrai nom, l attaquant enregistre colorss, requets, python-dateutill, lodahs. La recherche de Phylum en 2024 a catalogue plus de 11 mille paquets malveillants sur PyPI utilisant ce schema en douze mois. Les payloads varient: vol de variables d environnement, minage, installation de RAT, exfiltration par DNS. La premiere defense est culturelle: code review obligatoire pour tout changement de dependance. Des outils comme Socket, Snyk Advisor et deps.dev signalent deja les paquets fraichement publies, sans historique de mainteneur ou avec des install scripts suspects.

Les lockfiles resolvent 80 pour cent du probleme si on les utilise serieusement. package-lock.json, yarn.lock, pnpm-lock.yaml, poetry.lock, Cargo.lock et go.sum figent non seulement la version mais aussi le hash. Configurez npm ci, pnpm install --frozen-lockfile, pip install --require-hashes et cargo --locked dans les pipelines. Aucun npm install libre en production. Combine avec un .npmrc qui definit registry=https://nexus.interne/repository/npm-group/ et always-auth=true, on reduit drastiquement le risque que le resolver aille chercher sur le registry public par erreur. Le pattern mental fait echo a ce qu on couvre dans Supply Chain Security: Signature Sigstore et SBOM Reels en CI/CD sur les SBOM et attestations.

Le scoping est l arme definitive contre le dependency confusion en JavaScript. Migrez tous les paquets internes vers @acme/payments-sdk, @acme/auth, @acme/billing. Dans .npmrc, definissez @acme:registry=https://nexus.interne/. Maintenant npm resout ce scope uniquement sur le registry interne, meme si quelqu un publie @acme/payments-sdk sur npmjs (Microsoft reserve les scopes communs depuis 2021). En Python, utilisez des indexes separes explicites avec pip --index-url pour les internes et --extra-index-url seulement si necessaire, ou mieux, mirrorez tout via devpi ou Artifactory. Pour Go, GOPRIVATE=git.acme.com bloque les requetes vers proxy.golang.org. Ce hardening dialogue directement avec Hardening de Serveur Linux: CIS Benchmark Applique Sans Casser la Prod sur le principe du moindre privilege.

Cote CI, isolez. Chaque job de build doit tourner avec des tokens ephemeres, sans acces a la production, avec sortie reseau filtree par un proxy egress n autorisant que le registry interne, github.com et des endpoints connus. OIDC avec credentials short-lived sur GitHub Actions ou GitLab CI elimine les secrets longue duree. Ajoutez une etape de verification pre-install: scripts/check-deps.sh qui lance npm audit signatures, valide qu aucune dependance n a ete publiee dans les 7 derniers jours sans approbation manuelle, et confronte les paquets a une allowlist. L equipe Datadog a publie un rapport en 2025 montrant que 62 pour cent des compromissions de supply chain auraient ete bloquees avec ces trois regles combinees.

La surveillance continue ferme la boucle. Configurez des alertes Sigstore Rekor pour toute publication portant le nom de votre organisation, enregistrez les domaines typo-squatting de votre produit (acme-cloud, acme-coud, acmecloud), et maintenez un inventaire de SBOM signes via cosign pour chaque release. Quand un paquet suspect apparait, vous avez deja la preuve pour le takedown et les donnees pour la reponse a incident, dans le style montre dans DFIR sous Linux: Triage Vivant avec UAC et Velociraptor. Formez l equipe a remonter tout nouveau warning d install script au lieu de l ignorer par reflexe. Takeaway pratique: aujourd hui meme, auditez vos .npmrc, .pip.conf et go env. Si vous ne pouvez pas dire en 30 secondes de quel registry vient chaque dependance, vous etes deja vulnerable.

Nenhum comentário ainda

Seja o primeiro a comentar.

Deixe seu comentário

Entre com sua conta Canverly para comentar. Você pode usar a mesma conta em qualquer site da rede.

Entrar com Canverly