flawopen.com/Référence/Dependency Confusion
Dependency Confusion : confusion sur la source des paquets
Imaginez que votre équipe commande un composant dans un catalogue, mais que deux fournisseurs utilisent le même nom de produit. Si les règles ne désignent pas le fournisseur de confiance, la compilation peut recevoir un composant inattendu. Dependency Confusion est cette erreur de sélection de source : la compilation résout un paquet depuis un registre ou un espace de noms auquel l’organisation ne voulait pas faire confiance.
Comment survient Dependency Confusion
Le comportement dépend du gestionnaire et de sa configuration. Cas concret : pip avertit que combiner un --index-url privé avec un --extra-index-url public peut conduire à sélectionner un paquet public de même nom. npm choisit un registre selon le scope du paquet ou sa configuration par défaut ; il ne compare pas systématiquement les versions publiques et privées pour prendre la plus élevée. La cause est une politique de source ambiguë. Si le paquet est installé et ses scripts activés, ceux-ci s’exécutent avec les droits disponibles pour la tâche de compilation.
[global]
index-url = https://packages.example.internal/simple
extra-index-url = https://pypi.org/simple
corp-auth-utils
@corp:registry=https://packages.example.internal/repository/npm/
{
"dependencies": {
"@corp/billing-engine": "1.2.0"
}
}
Un chemin de défaillance Dependency Confusion
- 1Le nom d’un paquet interne ou d’un espace de noms devient visible hors de l’organisation.
- 2Un registre public contient un paquet du même nom sans scope, ou la politique autorise cette source à répondre à la demande.
- 3Le résolveur choisit la source non prévue ; le lockfile ou la revue peut manquer la substitution s’il est absent, régénéré ou accepté sans vérification.
- 4Si les scripts d’installation ou de compilation sont activés, le code du paquet s’exécute avec les droits de la tâche. L’impact dépend des identifiants, du réseau et de l’isolation ; l’exécution en root n’est pas inhérente à cette classe d’attaque.
Contrôles d’ingénierie défensive
- ✓Explicitez la politique de source : utilisez les scopes ou espaces de noms de l’organisation si possible, associez-les au registre prévu et empêchez le repli vers des sources publiques pour les noms privés. Avec Python, évitez d’associer un index privé à
--extra-index-urlpour les paquets privés ; préférez un proxy contrôlé ou un index unique faisant autorité. - ✓Contrôlez la propriété des espaces de noms : réservez les noms de l’organisation lorsque les registres le permettent, sans remplacer la politique de résolution. Inventoriez les noms internes et surveillez les collisions publiques.
- ✓Vérifiez et imposez les lockfiles : versionnez le lockfile et utilisez le mode d’installation figé/CI du gestionnaire (pour npm,
npm ci). Vérifiez les noms, URL de registre, versions et empreintes modifiés. Un lockfile améliore la reproductibilité, mais ne prouve pas que la source est le bon éditeur. - ✓Limitez l’exécution de la compilation : désactivez les scripts de dépendances si le projet fonctionne sans eux et examinez les exceptions. Utilisez des identifiants temporaires à privilèges minimaux, isolez les secrets de production et limitez le trafic sortant.