flawopen.com/Incidents/tensorlake-npm-install-hook-compromise-october-2026
Tensorlake npm 0.5.144 : hook d’installation malveillant
Une version malveillante du SDK IA de Tensorlake a ajouté un chargeur preinstall. L’équipe a confirmé des changements directs sur main et renforcé la publication ; l’avis GitHub considère compromis tout hôte où le code s’est exécuté. Les chercheurs rapprochent le chargeur de la famille ChainDrop/Shai-Hulud ; l’avis GitHub ne confirme pas cette attribution.[1], [2], [3], [4], [5]
Installer ce paquet, c’était comme brancher un appareil qui démarre dès qu’il est alimenté : nul besoin d’appuyer sur un bouton ni de l’utiliser. npm a exécuté le hook malveillant de préinstallation avec les droits de la personne qui l’installait, avant tout import du SDK.[3], [6], [1]
Concepts Clés et Termes
hook preinstall- Script que npm peut exécuter pendant l’installation. Le manifeste publié de Tensorlake 0.5.144 lançait un chargeur par ce hook, sans nécessiter l’import du SDK.[1], [6]
attestation de provenance- Preuve de l’origine et du processus de compilation d’un artefact. L’équipe indique que la publication malveillante avait une provenance npm ; cela ne prouve pas que le code source était sain.[2], [3]
garde-fou des scripts d’installation- Contrôle CI qui échoue si un manifeste publié déclare des scripts d’installation. Après l’incident, Tensorlake l’a ajouté avec npm ci --ignore-scripts.[3]
Correspondances de référentiels
- Référence CWE pour la faiblesse décrite dans ce guide : CWE-506
Chronologie de l'Incident
Déroulement de l'Attaque Étape par Étape
Les identifiants et la persistance de l’hôte étaient exposés
L’avis malware de GitHub demande de considérer comme compromis tout hôte concerné. StepSecurity et Socket signalent un vol d’identifiants et une persistance, dont un moniteur qui pouvait réagir à la révocation de jetons. Attribuez ces détails aux chercheurs ; ne supposez pas que chaque capacité s’est exécutée sur chaque hôte.[1], [4], [5]
L’équipe a rétabli les contrôles de publication
La réponse a annulé les commits malveillants, ajouté npm ci --ignore-scripts et un garde-fou des manifestes, renforcé les protections du dépôt et de publication, puis remplacé le paquet par 0.5.145. Le GHSA ne liste pas de version corrigée car il suit un malware et non une plage de code vulnérable classique.[3], [7]
Code Source : Vulnérable vs Sécurisé
Cette comparaison CI suit la PR fusionnée #1016 ; elle ne montre ni le paquet malveillant ni un exploit. Le garde-fou s’exécute avant l’installation et rejette les hooks dans les manifestes publiés ; ignore-scripts empêche npm ci d’exécuter les scripts de cycle de vie des dépendances. L’équipe indique que ses tests et la compilation du SDK fonctionnaient ainsi. Cela peut affecter les paquets qui exigent des hooks, et les commandes explicitement lancées, comme npm test, exécutent toujours leurs scripts prévus. Isolez les étapes suivantes et ne confondez pas provenance et revue du code source. Cet extrait est partiel : en plus de vérifier les hooks d’installation déclarés, le garde-fou du mainteneur rejette aussi les fichiers inattendus dans typescript/lib/.[3], [6]
steps:
- run: npm cisteps:
- run: node scripts/check-no-install-scripts.mjs
- run: npm ci --ignore-scriptsListe de Contrôle de Sécurité pour l'Ingénierie
- ✓Recherchez tensorlake@0.5.144 dans les manifestes, fichiers de verrouillage, caches et journaux de build. L’avis identifie cette version npm précise ; ne déduisez pas une exposition du seul nom du paquet.[1]
- ✓Si l’installation a été exécutée, isolez l’hôte du réseau et préservez les éléments de preuve. Retirer la dépendance ne prouve pas que la persistance ou les autres changements ont disparu ; reconstruisez depuis des supports fiables si l’intégrité ne peut être établie.[1], [4], [5]
- ✓Gardez l’hôte isolé et coordonnez avec les intervenants l’identification et le retrait de la persistance qui, selon les chercheurs, pouvait se déclencher lors de la révocation de jetons, avant de révoquer ou renouveler ceux-ci. Suivez les consignes actuelles et intervenez depuis des systèmes sains.[4], [5]
- ✓Une fois la persistance signalée traitée par les intervenants, utilisez un système sain pour révoquer et renouveler les identifiants accessibles au processus d’installation. Examinez les dépôts et publications de paquets accessibles, ainsi que les artefacts CI et journaux d’audit, pour repérer les changements non autorisés.[4], [5], [3]
- ✓En CI, exécutez un garde-fou vérifié avant l’installation, utilisez npm ci --ignore-scripts si compatible, isolez les scripts de build nécessaires, supprimez les contournements d’administration et de push direct, et exigez une approbation indépendante pour publier.[3], [6]
- ✓Au 2026-10-12, vérifiez si votre environnement a installé l’un de ces six paquets associés en version
0.5.144: `tensorlake-native-*family:tensorlake-native-linux-x64-gnu,tensorlake-native-linux-x64-musl,tensorlake-native-linux-arm64-gnu,tensorlake-native-linux-arm64-musl,tensorlake-native-darwin-arm64,tensorlake-native-win32-x64. Le registre npm a renvoyé les métadonnées de version de chacun à cette date ; considérez-les donc comme toujours publiés et incluez-les dans l’inventaire d’exposition. Cela confirme uniquement leur disponibilité dans le registre, pas la présence de la charge de l’incident dans un paquet associé. Dans la PR #1016 fusionnée, le responsable indiquait que ces versions devaient encore être retirées à ce moment-là.[3], [8], [9], [10], [11], [12], [13]
Sources
- GitHub Advisory Database — GHSA-rqxj-g25x-4v9v
- Tensorlake — issue d’incident #1014
- Tensorlake — PR de réponse #1016
- StepSecurity — analyse technique
- Socket — analyse technique
- npm v10 — npm ci et ignore-scripts
- Tensorlake — version saine 0.5.145
- npm registry — tensorlake-native-linux-x64-gnu@0.5.144
- npm registry — tensorlake-native-linux-x64-musl@0.5.144
- npm registry — tensorlake-native-linux-arm64-gnu@0.5.144
- npm registry — tensorlake-native-linux-arm64-musl@0.5.144
- npm registry — tensorlake-native-darwin-arm64@0.5.144
- npm registry — tensorlake-native-win32-x64@0.5.144