Le 8 octobre 2026, un acteur malveillant a publié une version corrompue de « tensorlake » sur npm. La version corrompue est 0.5.144 et contient une variante du ver Shai-Hulud, qui extrait des informations confidentielles des appareils infectés et tente de se répliquer via les chaînes d'approvisionnement connectées. Tensorlake est un environnement de test sans serveur destiné aux agents d'IA, et son paquet npm aurait été installé plus de 100 000 fois depuis sa création.
Tensorlake distribue également un paquet via PyPI et Cargo, mais rien n'indique, à l'heure où nous écrivons ces lignes, que l'auteur de la menace ait réussi à le publier sur l'un ou l'autre de ces écosystèmes. Le logiciel malveillant présente de légères variations par rapport à la dernière vague de Shai-Hulud ; il s'agit donc probablement d'une nouvelle attaque plutôt que d'une réinfection en cours.
Ce que fait le malware
Le logiciel malveillant est déclenché par un script de préinstallation, qui appelle fichier lib/setup.mjs. setup.mjs (25a0735d0db7dc40e5d45ce42d9c106067e6a66e184d967cfecfab17c3bcb5ef) est un script obscurci qui sert à implanter Bun sur un hôte infecté et à exécuter lib/Math_Symbol.js (b50a00900399ba99fb6ce1fc151519cb99d44320ef2a631f2237e1aea0ad6fec) avec le moteur d'exécution Bun.
Math_Symbol.js contient une charge utile Shai-Hulud obscurcie. Le logiciel malveillant définit une variable globale WORMTAG marqueur avant l'exécution du code obscurci, spécifique au paquet TensorLake infecté. Ce marqueur indique que le paquet correspond à une nouvelle intrusion et non à une réinfection issue d'une vague antérieure de Shai-Hulud.
Le logiciel malveillant déchiffre des charges utiles assurant sa persistance et sa prolifération, ainsi qu’un mécanisme de « dead-man’s switch » qui efface les machines infectées si un jeton GitHub intégré est révoqué, à l’instar des vagues précédentes de Shai-Hulud. Toujours à l’instar des vagues précédentes de Shai-Hulud, le logiciel malveillant tente de lire et d’exfiltrer des variables d’environnement sensibles et des secrets locaux. Un index complet des données ciblées par le logiciel malveillant est disponible à la fin de cet article. Tout système ou environnement infecté par ce logiciel malveillant doit être considéré comme entièrement compromis, et la rotation des secrets ou des identifiants qu’il contenait doit être traitée comme une priorité absolue.
Le logiciel malveillant contient l'adresse C2 codée en dur iseekaigogo[.]com, mais intègre également un mécanisme de « dead drop » basé sur la blockchain permettant de mettre en place un canal de commande et de contrôle (C2) alternatif. Le logiciel malveillant appelle une fonction de lecture sur le contrat Ethereum contrôlé par l'acteur malveillant
0xb614155Fd88114d40549b259457Bcf921Df091B9 par eth.llamarpc.com, rpc.ankr.com et ethereum.publicnode.com pour récupérer un autre domaine C2/d'exfiltration. La dernière mise à jour du contrat, effectuée le 21 septembre à partir du portefeuille 0x779f83aE56309682beDb04816c19d358c4B21040, attribue à cette valeur la même adresse C2 codée en dur, iseekaigogo[.]com.
Ce logiciel malveillant se distingue des vagues précédentes de Shai-Hulud en ce qu’il tente d’extraire des données plus sensibles stockées dans les mémoires cache des navigateurs Web. Il tente notamment d’accéder à des données situées dans des chemins d’accès codés en dur, associés à 14 extensions de navigateur dédiées aux cryptomonnaies. Le logiciel malveillant tente d’exfiltrer les fichiers IndexedDB et LevelDB des extensions. Il récupère également depuis l’adresse C2 un binaire HackBrowserData distant adapté au système infecté et l’exécute pour tenter d’obtenir des identifiants supplémentaires à partir des mémoires cache des navigateurs. Ces changements reflètent potentiellement une stratégie de l’opérateur davantage axée sur la monétisation rapide des terminaux de développeurs infectés que sur la prolifération via la chaîne d’approvisionnement.
Retracer la source de l'infection
Le logiciel malveillant provenait du dépôt GitHub « tensorlake ». Le 7 octobre 2026, l'auteur de la menace a effectué des commits vérifiés sous l'identité d'un responsable de maintenance. Le logiciel malveillant a été introduit lors du commit 41b38f0 via un téléchargement direct de fichier, après quoi l'auteur de la menace a tenté de modifier la version et de déclencher la publication. Le dépôt a été compromis pendant environ 20 heures avant que l'auteur de la menace ne parvienne à déclencher la publication sur npm.
Comment Aikido détecte cela
Si vous êtes un utilisateur Aikido, vérifiez votre flux central et filtrez les problèmes de logiciels malveillants. Cela apparaîtra comme un problème critique 100/100. Aikido effectue des rescans nocturnes, mais nous vous recommandons de déclencher un rescan manuel dès maintenant.
Si vous n'êtes pas encore un utilisateur d'Aikido, vous pouvez créer un compte et connecter vos dépôts. Notre couverture anti-malware est incluse dans le plan gratuit, aucune carte de crédit requise.
Pour une couverture plus large pour toute votre équipe, Device Protection d'Aikido vous offre une visibilité et un contrôle sur les packages logiciels installés sur les appareils de votre équipe. Il couvre les extensions de navigateur, les bibliothèques de code, les plugins d'IDE et les dépendances de build, le tout en un seul endroit. Arrêtez les malwares avant qu'ils ne soient installés.
Pour une protection future, envisagez Aikido Safe Chain (open source). Safe Chain s'intègre à votre workflow existant, en interceptant les commandes npm, npx, yarn, pnpm et pnpx et en vérifiant les packages par rapport à Aikido Intel avant l'installation.
Indicateurs de compromission
Paquets NPM :
- tensorlake 0.5.144
Domaine C2 :
iseekaigogo[.]com
Fichiers :
lib/setup.mjs25a0735d0db7dc40e5d45ce42d9c106067e6a66e184d967cfecfab17c3bcb5ef
lib/Math_Symbol.jsb50a00900399ba99fb6ce1fc151519cb99d44320ef2a631f2237e1aea0ad6fec
Autre :
- Transaction Ethereum effectuée par un acteur malveillant :
-
0xb614155Fd88114d40549b259457Bcf921Df091B9
-
- Acteur malveillant - Portefeuille Ethereum :
0x779f83aE56309682beDb04816c19d358c4B21040
Variables et fichiers concernés
Variables d'environnement :
APPVEYOR
AWS_ACCESS_KEY_ID
AWS_CONFIG_FILE
AWS_CONTAINER_CREDENTIALS_FULL_URI
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
AWS_PROFILE
AWS_REGION
AWS_ROLE_ARN
AWS_CLÉ_D'ACCÈS_SECRÈTE
AWS_WEB_IDENTITY_TOKEN_FILE
bamboo_agentId
BITBUCKET_BUILD_NUMBER
BITRISE_IO
BUDDY_WORKSPACE_ID
BUILD_BUILDURI
BUILDKITE
CF_BUILD_ID
CF_PAGES
CI
CI_NAME
CIRCLECI
CIRRUS_CI
CODEBUILD_BUILD_ID
DISTELLI_APPNAME
DRONE
GITHUB_ACTIONS
GITLAB_CI
JB_SPACE_NUMÉRO_D'EXÉCUTION
JENKINS_URL
KUBECONFIG
KUBERNETES_SERVICE_HOST
NETLIFY
NOW_GITHUB_DEPLOYMENT
SAILCI
SCREWDRIVER
SEMAPHORE
SHIPPABLE
TEAMCITY_VERSION
TRAVIS
ADRESSE_VAULT
JETON_API_VAULT
JETON_D'AUTHENTIFICATION_VAULT
VAULT_RÔLE_AWS
VAULT_TOKEN
VAULT_TOKEN_FILE
VAULT_TOKEN_PATH
VELA
VERCEL
WERCKER_MAIN_PIPELINE_STARTED
WS_SHARED_CREDENTIALS_FILEChemins d'accès aux fichiers d'informations d'identification :
~/.ansible
~/.azure
~/.cert/nm-openvpn
~/.config/atomic/Stockage local/leveldb
~/.config/discord/Stockage local/leveldb
~/.config/Element/Stockage local
~/.config/Exodus/exodus.wallet
~/.config/helm
~/.config/kwalletd
~/.config/Ledger Live
~/.config/remmina
~/.config/Signal
~/.config/telegram-desktop
~/.docker
~/.electrum-ltc/wallets
~/.electrum/wallets
/etc/openvpn
/etc/ssh
~/.ethereum/keystore
~/.kde4/share/apps/kwallet
~/.kde/share/apps/kwallet
~/.local/share/keyrings
~/.local/share/TelegramDesktop/tdata
~/.monero
~/.pki/nssdb
~/.remmina
~/.ssh
/var/lib/docker/containers
~/.foundry/keystores
~/.brownie/accounts
~/.config/github-copilot
~/.gnupg/private-keys-v1.d
~/.config/gcloud/legacy_credentials
~/.volta/tools/image/node
~/.kube/cache/discovery
~/.kube/http-cache
~/.near-credentials
~/.keplr
~/.config/keplr
~/.bitcoin/wallets
~/.nethermind/keystore
~/.local/share/io.parity.ethereum/keys
~/.config/exodus/exodus.wallet
~/.local/share/gopass/stores
/etc/ssl/private
/etc/letsencrypt/live
~/.mozilla/firefox
~/.config/google-chrome
~/.config/chromium
~/.config/BraveSoftware/Brave-Browser
~/.config/microsoft-edge
~/.config/opera
~/.config/vivaldi
/etc/ssl/cert.pem
~/.aws/credentials
~/.aws/config
~/.kube/config
~/.vault-token
/home/runner/.vault-token
/vault/token
/var/run/secrets/vault-token
/var/run/secrets/vault/token
/run/secrets/vault_token
/run/secrets/VAULT_TOKEN
~/.vault/token
/etc/vault/tokenExtensions de navigateur :
nkbihfbeogaeaoehlefnkodbefgpgknn MetaMask
bfnaelmomeimhlpmgjnjophhpkkoljpa Phantom
hnfanknocfeofbddgcijnmhnfnkdnaad Extension Coinbase Wallet
acmacodkjbdgmoleebolmdjonilkdbch Rabby Wallet
egjidjbpglichdcondbcbdnbeeppgdph Trust Wallet
ibnejdfjmmkpcnlpebklmnkoeoihofec TronLink
fnjhmkhhmkbjkkabndcnnogagogbneec Portefeuille Ronin
bhhhlbepdkbapadjdnnojkbgioiodbic Portefeuille Solflare
dmkamcknogkgcdfhhbddcghachkejeap Keplr
aholpfdialjgjfhomihkjbmgjidlcdno Portefeuille Exodus Web3
mcohilncbfahbmgdjkbpemcciiolgcge Portefeuille OKX
opfgelmcmbiajamepnmloijbpoleiama Rainbow
ppbibelpcjmhbdihakflkdcoccbgbkpo Portefeuille UniSat
lgmpcpglpngdoalbgeoldeajfclnhafa Portefeuille SafePal (extension)