Dependency Confusion
Confusion de Dépendance
Description
La confusion de dépendance (ou attaque par substitution) est une nouvelle technique d'attaque qui peut conduire à l'exécution de code à distance. L'attaque affecte généralement les environnements de compilation, les pipelines CI/CD et les stations de travail des développeurs.
Dans la plupart des langages de programmation, des systèmes de gestion de paquets externes sont disponibles pour récupérer les dépendances tierces.
Les gestionnaires de paquets offrent généralement la possibilité de déployer des dépôts privés pour héberger des paquets exclusivement internes.
Pendant le processus de compilation, le gestionnaire de paquets ne priorise pas les dépôts privés, mais ceux ayant la version la plus élevée. Ce comportement peut être exploité par un attaquant en créant un paquet malveillant sur le dépôt public et en utilisant une version suffisamment élevée pour s'assurer que le paquet malveillant est celui utilisé au moment de la compilation.
Recommandation
Lors de la gestion des dépendances d'un projet, il est essentiel d'utiliser des paquets à portée (scoped packages) pour une meilleure organisation et sécurité. Dans le cas de NPM, suivez ces étapes pour créer un paquet à portée, configurer un registre à portée, empêcher la prise de contrôle de la portée et définir efficacement les dépendances :
1. Créer un paquet avec portée (Scoped Package) :
Si vous ne l'avez pas déjà fait, créez un paquet à portée pour votre projet. Vous pouvez le faire en suivant les instructions :
- Sur la page "Sign In" de npm, entrez les détails de votre compte et cliquez sur Sign In.
- Dans le coin supérieur droit de la page, cliquez sur votre photo de profil, puis cliquez sur Add an Organization.
- Sur la page de création d'organisation, dans le champ Name, tapez un nom pour votre organisation. Le nom de votre organisation sera également la portée (scope) de votre organisation.
- Sous le champ Name, choisissez le plan payant "Unlimited private packages" ou le plan gratuit "Unlimited public packages" et cliquez sur Buy ou Create.
- (Optionnel) Sur la page d'invitation de l'organisation, tapez le nom d'utilisateur npm ou l'adresse e-mail d'une personne que vous souhaitez ajouter à votre organisation en tant que membre et sélectionnez une équipe à laquelle l'inviter, puis cliquez sur Invite.
- Cliquez sur Continue.
2. Configurer un registre avec portée (Scoped Registry) :
Configurez votre registre à portée en ajoutant la ligne suivante à votre fichier .npmrc :
@[ORG]:registry = https://reg.[ORG].internal/
3. Empêcher la prise de contrôle de portée :
Assurez-vous que la portée que vous avez l'intention d'utiliser (@ORG) est sécurisée et ne peut pas être prise en charge par un attaquant. Cela inclut la vérification de la propriété et le maintien du contrôle sur l'organisation ou le compte utilisateur associé.
4. Définir les dépendances :
Définissez les dépendances dans votre fichier package.json, en vous assurant d'utiliser la portée définie précédemment. Par exemple :
{
"name": "@org/dep1",
"version": "1.2.3",
"description": "Scoped dependency 1",
"dependencies": {
"@ostorlab/dep2": "1.2.3"
}
}
En suivant ces étapes concrètes, vous pouvez utiliser efficacement les paquets à portée, assurer la configuration du registre et atténuer le risque de prise de contrôle de la portée par des entités non autorisées.
Liens
- Microsoft warns enterprises of new 'dependency confusion' attack technique
- Dependency Confusion: How I Hacked Into Apple, Microsoft and Dozens of Other Companies
- Avoiding npm substitution attacks
Normes
- OWASP_MASVS_L1:
- MSTG_CODE_5
- OWASP_MASVS_L2:
- MSTG_CODE_5
- PCI_STANDARDS:
- REQ_2_2
- REQ_6_2
- REQ_6_3
- REQ_11_3
- OWASP_MASVS_v2_1:
- MASVS_CODE_3
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_4_2
- CC_6_6
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- CC_8_1
- CC_9_1