1 points par GN⁺ 2 시간 전 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • Les versions 2.6.2 et 2.6.3 de lightning sur PyPI, publiées le 30 avril 2026, ont été exploitées dans une attaque de supply chain, et un simple pip install lightning pouvait déclencher l’exécution d’un répertoire caché _runtime et d’une charge utile JavaScript obfusquée
  • La charge utile malveillante s’exécute automatiquement à l’import du module et dérobe des identifiants, des jetons d’authentification, des variables d’environnement et des secrets cloud, tout en essayant aussi de contaminer des dépôts GitHub
  • Cette attaque a pour point d’entrée PyPI, mais la propagation du ver s’effectue via npm ; si des identifiants de publication npm sont trouvés, il injecte le dropper setup.mjs et router_runtime.js dans les packages publiables, puis republie une version de patch
  • L’exfiltration des données utilise quatre canaux parallèles — POST HTTPS, dead drop par recherche de commits GitHub, dépôt GitHub public contrôlé par l’attaquant et push direct vers le dépôt de la victime — et laisse comme indicateurs le préfixe de commit EveryBoiWeBuildIsAWormyBoi et la description de dépôt "A Mini Shai-Hulud has Appeared"
  • Le malware implante le hook SessionStart de .claude/settings.json dans Claude Code et une tâche runOn: folderOpen dans .vscode/tasks.json pour VS Code, afin d’exécuter le dropper à chaque ouverture du dépôt ; toute machine ayant importé le package malveillant pendant la période concernée doit être considérée comme totalement compromise

Packages affectés et procédure de vérification

  • lightning est un framework de deep learning souvent présent dans l’arbre de dépendances des équipes qui construisent des classifieurs d’images, font du fine-tuning de LLM, exécutent des modèles de diffusion ou développent des outils de prévision de séries temporelles
  • Packages affectés

    • lightning version 2.6.2
    • lightning version 2.6.3
  • Procédure de vérification pour les clients Semgrep

    • Si vous n’avez pas exécuté de scan de projet récemment, vous devez lancer un nouveau scan
    • Vous pouvez vérifier sur la page advisories si le projet a récemment installé cette version du package
    • Vous pouvez consulter les correspondances dans le dependency filter ; si “No matching dependencies” s’affiche, cela signifie que le projet n’utilise pas activement la dépendance malveillante
    • S’il existe des correspondances, vous devez auditer dans le dépôt les fichiers inattendus dans les répertoires .claude/ et .vscode/ mentionnés dans les indicateurs de compromission ci-dessous
    • Vous devez remplacer les jetons GitHub, identifiants cloud et clés API qui ont pu se trouver dans l’environnement affecté
    • Des conseils généraux sur la réponse aux attaques de supply chain et les périodes d’attente sont donnés dans $foo compromised in $packagemanager et Attackers are Still Coming for Security Companies

Structure de propagation de PyPI vers npm

  • Contrairement à mini Shai-Hulud, qui visait directement npm, le point d’entrée de cette attaque est PyPI
  • La charge utile malveillante reste en JavaScript, et la propagation du ver passe par npm
  • Si le code malveillant exécuté trouve des identifiants de publication npm, il injecte le dropper setup.mjs et router_runtime.js dans tous les packages publiables avec ce jeton
  • Il configure ensuite scripts.preinstall pour exécuter le dropper, augmente la version de patch, puis republie le package
  • Les développeurs en aval qui installent ces packages exécutent alors l’ensemble du code malveillant sur leur machine, ce qui entraîne le vol de jetons et l’infection par le ver de packages

Méthodes d’exfiltration des données

  • La fonctionnalité de vol partage les mécanismes et la conception de la campagne précédente Mini Shai-Hulud, et utilise quatre canaux parallèles pour faire sortir les données même si certaines voies sont bloquées
  • L’attaque reprend le thème Shai-Hulud, notamment avec la création d’un dépôt public nommé EveryBoiWeBuildIsaWormBoi
  • La structure des indicateurs de l’attaque correspond à celle de la campagne précédente mini Shai-Hulud, mais les messages de commit malveillants utilisent le préfixe EveryBoiWeBuildIsAWormyBoi, ce qui les distingue de l’attaque Mini Shai-Hulud d’origine
  • Transmission C2 via HTTPS POST

    • Les données volées sont immédiatement envoyées par POST à un serveur contrôlé par l’attaquant via le port 443
    • Le domaine et le chemin sont stockés dans la charge utile sous forme de chaînes chiffrées afin de compliquer l’analyse statique
  • Dead drop via recherche de commits GitHub

    • Le malware interroge en boucle l’API de recherche de commits GitHub pour trouver des messages de commit préfixés par EveryBoiWeBuildIsAWormyBoi
    • Les messages de commit transportent un jeton doublement encodé en Base64 au format EveryBoiWeBuildIsAWormyBoi:<base64(base64(token))>
    • Le jeton décodé est ensuite utilisé pour authentifier un client Octokit pour les opérations ultérieures
  • Dépôt GitHub public contrôlé par l’attaquant

    • Un nouveau dépôt public est créé avec un nom de mot aléatoire tiré de Dune et la description "A Mini Shai-Hulud has Appeared"
    • Cette description est directement recherchable sur GitHub
    • Les identifiants volés y sont commités sous la forme results/results-<timestamp>-<n>.json ; ils sont encodés en Base64 via l’API, mais leur contenu interne reste du JSON ordinaire
    • Les fichiers dépassant 30 MB sont découpés en fragments numérotés
    • Les messages de commit utilisent chore: update dependencies comme camouflage
  • Push direct vers le dépôt de la victime

    • Si le malware obtient un jeton serveur GitHub ghs_, il pousse directement les données volées sur toutes les branches de GITHUB_REPOSITORY de la victime

Cibles du vol

  • Le malware vise des identifiants présents dans les fichiers locaux, l’environnement, les pipelines CI/CD et chez les fournisseurs cloud
  • Système de fichiers

    • Il scanne plus de 80 chemins de fichiers d’identifiants pour y trouver des jetons ghp_, gho_ et npm_
    • Il traite jusqu’à 5 MB par fichier
  • Shell et variables d’environnement

    • Il exécute gh auth token
    • Il vide toutes les variables d’environnement de process.env
  • GitHub Actions

    • Sur les runners Linux, il vide la mémoire du processus Runner.Worker à l’aide du Python intégré
    • Il extrait tous les secrets marqués "isSecret":true ainsi que GITHUB_REPOSITORY et GITHUB_WORKFLOW
  • Organisations GitHub

    • Il vérifie les scopes du jeton, repo et workflow
    • Il parcourt les secrets d’organisation GitHub Actions
  • AWS

    • Il tente d’appeler sts:GetCallerIdentity via des variables d’environnement, des profils ~/.aws/credentials, IMDSv2 169.254.169.254 et ECS 169.254.170.2
    • Il énumère et récupère toutes les valeurs de Secrets Manager ainsi que les paramètres SSM
  • Azure

    • Il utilise DefaultAzureCredential pour énumérer les abonnements et accéder aux secrets Key Vault
  • GCP

    • Il s’authentifie avec GoogleAuth
    • Il énumère et récupère tous les secrets de Secret Manager
    • La portée visée couvre les environnements de développement locaux, les runners CI et les trois principaux fournisseurs cloud
    • Toute machine ayant importé le package malveillant pendant la période affectée doit être considérée comme totalement compromise

Persistance via les outils de développement

  • Une fois introduit dans le dépôt, le malware cible Claude Code et VS Code, des outils de développement courants, pour y implanter des hooks de persistance
  • Claude Code

    • Le malware écrit dans .claude/settings.json, le fichier de configuration Claude Code du dépôt, un hook SessionStart avec matcher: "*"
    • Le hook pointe vers node .vscode/setup.mjs
    • Il s’exécute à chaque fois qu’un développeur ouvre Claude Code dans le dépôt infecté, sans nécessiter d’autre usage d’outil ni action de l’utilisateur au-delà du démarrage de session
  • VS Code

    • Pour cibler les utilisateurs de VS Code, il implante dans .vscode/tasks.json une tâche runOn: folderOpen
    • node .claude/setup.mjs s’exécute à chaque ouverture du dossier du projet
  • Dropper setup.mjs

    • Les deux hooks appellent setup.mjs, un bootstrapper autonome du runtime Bun
    • Si Bun n’est pas installé, il télécharge discrètement bun-v1.3.13 depuis les releases GitHub
    • Il gère Linux x64, Linux arm64, Linux musl, macOS x64, macOS arm64, Windows x64 et Windows arm64
    • Il exécute ensuite la charge utile complète .claude/router_runtime.js, de 14.8 MB, puis nettoie /tmp
  • Workflow GitHub Actions malveillant

    • Si le malware possède un jeton GitHub avec droit d’écriture, il pousse dans le dépôt de la victime un workflow nommé Formatter
    • À chaque push, il vide tous les secrets du dépôt via ${{ toJSON(secrets) }}
    • Il téléverse le résultat sous forme d’artefact Actions téléchargeable nommé format-results
    • Les Actions sont épinglées à des SHA de commit spécifiques pour sembler légitimes
    • Les dépôts ayant reçu le package lightning infecté en CI et disposant d’un jeton avec droits d’écriture doivent auditer ces fichiers

Indicateurs de compromission

  • Indicateurs recherchables

    • Les messages de commit préfixés par EveryBoiWeBuildIsAWormyBoi servent de transporteurs de jetons pour le dead drop et peuvent être trouvés via la recherche de commits GitHub
    • Les dépôts GitHub dont la description est "A Mini Shai-Hulud has Appeared" sont des dépôts d’exfiltration contrôlés par l’attaquant et peuvent être recherchés directement
  • Packages

    • lightning@2.6.2
    • lightning@2.6.3
  • Fichiers et artefacts système

    • _runtime/start.py : chargeur Python qui initialise la charge utile à l’import
    • _runtime/router_runtime.js : charge utile JavaScript obfusquée, correspondant au runtime Bun de 14.8 MB
    • _runtime/ : répertoire ajouté dans les versions malveillantes du package
    • .claude/router_runtime.js : copie du malware injectée dans le dépôt de la victime
    • .claude/settings.json : configuration du hook Claude Code injectée dans le dépôt de la victime
    • .claude/setup.mjs : dropper injecté dans le dépôt de la victime
    • .vscode/tasks.json : tâche d’exécution automatique VS Code injectée dans le dépôt de la victime
    • .vscode/setup.mjs : dropper injecté dans le dépôt de la victime

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.