Selon StepSecurity, un incident de supply chain a compromis le paquet populaire @ctrl/tinycolor (2M+ téléchargements hebdo) ainsi que plus de 40 autres paquets npm, avec retrait des versions malveillantes du registre. Découvert par @franky47, le binaire malveillant bundle.js
(~3,6 Mo) s’exécute lors de npm install
(probable postinstall
détourné) et cible des environnements Linux/macOS.
L’attaque s’appuie sur un chargeur Webpack modulaire exécuté de façon asynchrone. Il réalise une reconnaissance du système (plateforme, architecture) et exfiltre l’intégralité de process.env
, capturant des variables sensibles (ex. GITHUB_TOKEN
, AWS_ACCESS_KEY_ID
). Le code adopte une gestion silencieuse des erreurs et n’émet aucun log, tout en camouflant certains comportements (exécution de TruffleHog).
Pour la collecte de secrets, le malware utilise notamment TruffleHog sur le système de fichiers et interroge les gestionnaires de secrets cloud. Il énumère et lit les secrets AWS via @aws-sdk/client-secrets-manager
(avec pagination) et GCP via @google-cloud/secret-manager
, et cible explicitement des identifiants GitHub, AWS, GCP, Azure, des tokens npm et des métadonnées cloud. Les environnements Windows sont ignorés.
La propagation s’opère via un module qui, après validation du NPM_TOKEN
, récupère jusqu’à 20 paquets d’un mainteneur et publie de force des mises à jour injectant le binaire, compromettant en cascade l’écosystème du mainteneur. Pour la persistance/exfiltration, un module GitHub crée la branche shai-hulud
et injecte un workflow .github/workflows/shai-hulud-workflow.yml
qui, à chaque push
, envoie secrets
(${{ toJSON(secrets) }}
) vers une infrastructure de commande et contrôle; un dépôt public Shai-Hulud
est également créé pour agréger les données exfiltrées.
Affectations notables: @ctrl/tinycolor
(4.1.1, 4.1.2) et une quarantaine d’autres paquets (ex. ngx-toastr
19.0.2, koa2-swagger-ui
5.11.2/5.11.1, divers paquets @ctrl/*
et @nativescript-community/*
). Le billet fournit en outre des indicateurs de compromission, des commandes de détection et un ensemble d’actions immédiates (suppression des paquets compromis, nettoyage de workflows/branches, rotation des secrets, et audits AWS/GCP/GitHub).
• IoC (indicateurs):
- Hash SHA-256 du
bundle.js
: 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09 - Endpoint d’exfiltration: https://webhook.site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7
- Fichier workflow:
.github/workflows/shai-hulud-workflow.yml
- Branche suspecte:
shai-hulud
- Exécutions/processus:
trufflehog filesystem /
,npm publish --force
,curl
verswebhook.site
- Appels API:
secretsmanager.*.amazonaws.com
(AWS),secretmanager.googleapis.com
(GCP),registry.npmjs.org/v1/search
(npm),api.github.com/repos
(GitHub)
• TTPs (techniques):
- Compromission supply chain via
postinstall
et binaire Webpack - Auto-propagation par publication forcée sur l’ensemble des paquets d’un mainteneur
- Récolte de secrets (env, TruffleHog, AWS Secrets Manager, GCP Secret Manager)
- Persistance et exfiltration via workflow GitHub Actions et dépôt public
- Évasion: erreurs avalées, double Base64, absence de logs, déguisement en « scan sécurité »
Il s’agit d’une analyse technique détaillée visant à documenter la chaîne d’attaque, les TTPs et à partager des IoC ainsi que la liste des paquets affectés.
🧠 TTPs et IOCs détectés
TTP
[‘Compromission supply chain via postinstall
et binaire Webpack’, ‘Auto-propagation par publication forcée sur l’ensemble des paquets d’un mainteneur’, ‘Récolte de secrets (env, TruffleHog, AWS Secrets Manager, GCP Secret Manager)’, ‘Persistance et exfiltration via workflow GitHub Actions et dépôt public’, ‘Évasion: erreurs avalées, double Base64, absence de logs, déguisement en « scan sécurité »’]
IOC
{‘hash’: ‘46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09’, ‘domaine’: ‘webhook.site’, ’endpoint’: ‘https://webhook.site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7', ‘fichier_workflow’: ‘.github/workflows/shai-hulud-workflow.yml’, ‘branche_suspecte’: ‘shai-hulud’, ’executions_processus’: [’trufflehog filesystem /’, ’npm publish –force’, ‘curl vers webhook.site’], ‘appels_api’: [‘secretsmanager.*.amazonaws.com’, ‘secretmanager.googleapis.com’, ‘registry.npmjs.org/v1/search’, ‘api.github.com/repos’]}
🔗 Source originale : https://www.stepsecurity.io/blog/ctrl-tinycolor-and-40-npm-packages-compromised