En bref
Que s'est-il passé ?
Le 12 juillet 2018, un attaquant compromet le compte npm d'un mainteneur d'ESLint (mot de passe réutilisé, sans 2FA) et publie des versions malveillantes d'eslint-scope et eslint-config-eslint.
À l'installation, les paquets téléchargent et exécutent du code depuis pastebin.com qui envoie le fichier .npmrc de la victime à l'attaquant, c'est-à-dire ses jetons de publication npm.
eslint-scope étant une dépendance d'eslint, babel-eslint et webpack, l'exposition est large. npm a révoqué tous les jetons émis avant le 12 juillet 2018 12h30 UTC pour casser la chaîne.
MFA obligatoire sur les comptes de publication, pas de réutilisation de mot de passe, jetons courts et scopés, et désactivation des scripts d'installation non nécessaires.
Chronologie de l'attaque
Le compte npm d'un mainteneur ESLint est détourné ; eslint-scope@3.7.2 et eslint-config-eslint@5.0.2 sont publiés et exfiltrent le .npmrc à l'installation.
À 12h30 UTC, npm révoque tous les jetons d'accès émis avant cette heure, neutralisant les jetons volés.
Comment l'attaquant a procédé
Cet incident met en jeu les vecteurs d'attaque suivants du catalogue SOCLE ; chacun renvoie à sa fiche, où l'on trouve les exigences qui le neutralisent :
La leçon à en tirer
2FA obligatoire sur les comptes de publication ; jetons de registre courts et révocables.
Les exigences SOCLE qui auraient limité cet incident
Cet incident se rattache à 13 exigences du référentiel, par domaine. Les satisfaire n'aurait pas forcément tout empêché, mais aurait réduit la probabilité de l'attaque, limité son impact ou accéléré sa détection :