Le malware sur le thème de Shai-Hulud découvert dans la bibliothèque d’entraînement IA PyTorch Lightning
(semgrep.dev)- Les versions 2.6.2 et 2.6.3 de
lightning, le framework de deep learning, ont été exploitées dans une attaque de la chaîne d’approvisionnement — le simple fait d’exécuterpip install lightningdéclenche automatiquement une charge utile JavaScript obfusquée dans un répertoire caché_runtime - Comme ce framework est largement utilisé pour créer des classifieurs d’images, le fine-tuning de LLM, les modèles de diffusion ou la prévision de séries temporelles, il est probable qu’il figure déjà dans l’arbre de dépendances de nombreuses équipes IA/ML
- Une fois exécuté, le malware scanne plus de 80 chemins sur le système de fichiers local pour voler des tokens GitHub (
ghp_,gho_), des tokens npm (npm_), des variables d’environnement et des secrets cloud, en traitant jusqu’à 5 Mo par fichier - Il énumère et récupère des secrets chez les trois grands fournisseurs cloud : AWS (fichiers d’identifiants, IMDSv2, ECS, Secrets Manager, SSM), Azure (Key Vault) et GCP (Secret Manager)
- Dans les environnements GitHub Actions, il utilise le Python intégré pour vider la mémoire du processus
Runner.Workerafin d’extraire tous les secrets marqués avec"isSecret":true, ainsi que les informations sur le dépôt et le workflow - Le point d’entrée est PyPI (Python), mais la propagation en ver passe par npm (JavaScript) — à l’aide des tokens npm volés, il injecte un dropper (
setup.mjs) et le malware (router_runtime.js) dans tous les paquets publiables, incrémente la version de patch puis les republie, provoquant une infection en chaîne jusqu’aux machines des développeurs qui installent ces paquets - Pour l’exfiltration des données, il utilise quatre canaux parallèles afin qu’un simple blocage d’un chemin unique ne suffise pas : ① envoi au serveur C2 via HTTPS POST, ② dead drop via l’API de recherche de commits GitHub (avec insertion de tokens encodés en double Base64 dans les messages de commit), ③ commit sous le nom
results-<timestamp>.jsondans un dépôt GitHub public utilisant des noms de l’univers de Dune, ④ push direct dans le dépôt de la victime - Après avoir pénétré un dépôt, il installe des hooks de persistance dans les outils de développement pour garantir la réinfection — il écrit un hook
SessionStartdans.claude/settings.jsonde Claude Code pour une exécution automatique au démarrage de session, et place une tâcherunOn: folderOpendans.vscode/tasks.jsonde VS Code pour s’exécuter à chaque ouverture du dossier- Ces deux hooks appellent le dropper autonome
setup.mjset, si le runtime Bun n’est pas présent, le téléchargent discrètement depuis GitHub pour exécuter la charge utile de 14,8 Morouter_runtime.js
- Ces deux hooks appellent le dropper autonome
- Lorsqu’il obtient un token GitHub avec droits d’écriture, il pousse dans le dépôt de la victime un workflow camouflé nommé
Formatter— à chaque push, il vide les secrets du dépôt avec${{ toJSON(secrets) }}puis les téléverse comme artefact GitHub Actions - Toutes les machines ayant installé ces versions pendant la période concernée doivent être considérées comme totalement compromises ; il faut remplacer immédiatement les tokens GitHub, identifiants cloud et clés API, et auditer les répertoires
.claude/et.vscode/pour détecter d’éventuels fichiers inattendus - Indicateurs de compromission : préfixe
EveryBoiWeBuildIsAWormyBoidans les messages de commit, description de dépôt"A Mini Shai-Hulud has Appeared", présence d’un répertoire_runtime/dans le dépôt — autant d’éléments vérifiables directement via la recherche GitHub
2 commentaires
Bon, il ne faudra plus faire les mises à jour maintenant...
Avis Hacker News
C’est peut-être simplement une illusion de fréquence, mais on voit récemment pas mal d’attaques de la chaîne d’approvisionnement très médiatisées dans des paquets importants
Rien que dans les premières pages de HN en ce moment, il y a plusieurs billets sur des cas différents
Quand on repense à
left-padil y a 10 ans, on se demande si les attaques réussies sont plus nombreuses qu’avant, et c’est probablement le casLa valeur d’une attaque réussie a sûrement beaucoup augmenté aussi, mais je me demande si, collectivement, la communauté s’améliore réellement pour les détecter avant la publication des paquets
Les éditeurs de logiciels commerciaux devraient faire mieux, mais il semble toujours manquer d’outils universels et simples pour les cas où du code de loisir/amateur finit par devenir une dépendance de nombreux projets
J’ai posté le même commentaire dans le fil sur l’attaque de la chaîne d’approvisionnement de SAP : https://news.ycombinator.com/item?id=47964003
Avant, on lançait plus souvent
npm installmanuellement, probablement seulement quand un build cassait ou très occasionnellementLes attaques de la chaîne d’approvisionnement reposent sur le fait que les gens — ou plus précisément les pipelines — mettent automatiquement à jour les paquets sans réfléchir dès qu’une nouvelle version sort
Je ne sais pas si c’est un bon modèle économique, et probablement pas
left-padn’était pas une attaque, mais un bug de NPMIl n’aurait pas dû être possible de supprimer une version de paquet dont d’autres paquets déjà publiés dépendent, alors qu’à l’inverse il aurait dû être possible de supprimer une version de paquet plus récente dont personne ne dépendait encore
Quand l’auteur de
left-pada essayé d’effacer toutes ses données avec l’intention de quitter le service, NPM aurait dû renvoyer un code d’erreurD’après Wikipedia, quand Koçulu a dit qu’il ne voulait plus rester sur la plateforme, déçu par une décision de npm, Inc., Schlueter, le créateur de NPM, lui a fourni une commande pour supprimer les 273 modules qu’il avait publiés
Ce qui est étrange, c’est que 4 signalements de sécurité ont été ouverts et que tous ont reçu un commentaire automatique du bot
pl-ghost, puis ont été fermés [1][2][3][4]Au final, seul [4] a été traité correctement, et tous les commentaires du bot ont été supprimés
On peut voir les commentaires du bot dans cet autre rapport [5], qui donne plus d’informations que l’original
[1] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[2] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[3] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[4] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[5] https://socket.dev/blog/lightning-pypi-package-compromised
pl-ghostcompromisL’attaquant a créé un nouveau workflow Actions avec ce compte, puis a extrait les secrets PyPI depuis le workflow exécuté
Après avoir publié le paquet, il a laissé des commentaires avec ce compte, en nous narguant légèrement au passage
J’aimerais vraiment que le jour arrive vite où il n’y aura plus aucune dépendance
Dans un cas extrême, quand je crée en ce moment des applis éducatives interactives pour ma fille, je demande à Opus d’utiliser uniquement du JavaScript et HTML purs
Du double pendule à la simulation de fluides, tout fonctionne bien d’un coup, alors qu’avant cela représentait des centaines de dépendances
Si le code est sous licence MIT, je peux demander à Opus d’en extraire précisément les parties nécessaires, puis de les adapter et de les intégrer à mon usage
Pour les projets hobby, ça a très bien marché jusqu’ici, et j’aimerais qu’à l’avenir les logiciels de production puissent eux aussi se passer de dépendances
Si Chrome change la forme d’une API, il faut le trouver et le corriger soi-même ; si le Maroc modifie la date de début de l’heure d’été, il faut aussi mettre à jour son propre code de gestion des dates et heures
Ce sont justement le genre de choses que les bibliothèques prennent en charge et qu’on tenait pour acquises
Ce n’est pas bien grave pour un simulateur de double pendule auquel ta fille ne s’intéressera plus la semaine prochaine, mais pour une entreprise qui construit quelque chose censé fonctionner indéfiniment, c’est un vrai problème
Il faudrait peut-être publier un bout de code MIT d’accès à distance pour qu’il finisse dans les données d’entraînement d’Opus
Quand j’ai suivi le cours de deep learning de Fast.AI, j’ai été surpris par le nombre de dépendances Python qu’un projet de machine learning traîne avec lui
J’ai toujours considéré que les projets de front-end web avaient beaucoup de dépendances tierces, mais pour moi l’écosystème ML semble bien plus enchevêtré
En plus, le développement web est considéré comme sensible à la sécurité depuis longtemps, donc il y a eu le temps d’accumuler de la sagesse et des pratiques en la matière, alors que le développement ML paraît beaucoup plus bricolé, avec bien moins d’application des pratiques générales de génie logiciel
Par exemple, l’une des façons de déployer des modèles de ML à l’époque passait par Python pickle, c’est-à-dire des objets exécutables sans restriction par défaut
Un modèle dans ce format pouvait faire n’importe quoi sur la machine qui l’importait, et ce far west initial de l’écosystème facilite les compromissions de sécurité et les attaques de la chaîne d’approvisionnement
Certains ont appris un peu à coder en cours de route, certains sont mathématiciens, et certains sont des développeurs ivres d’IA
Il y a aussi cette mentalité du type : « le code n’a plus d’importance, tant que ça marche »
Pour beaucoup, une vraie gestion des dépendances n’est qu’une corvée dont ils ne veulent pas s’occuper
Dans beaucoup de projets ML, tous ces facteurs se combinent, alors qu’en réalité le ML devrait être l’un des domaines les plus focalisés sur la reproductibilité
En cherchant dans les dépôts, je trouve 2,2 k dépôts créés au cours des dernières 24 heures contenant le texte
"A Mini Shai-Hulud has Appeared": https://github.com/search?q=A%20Mini%20Shai-Hulud%20has%20Ap...Cela ressemble au signe qu’un compte, probablement avec des tokens GitHub auth/Actions, a été compromis puis utilisé pour créer des dépôts
Ce n’est pas la première fois que ça arrive, donc on aurait cru qu’ils auraient retenu la leçon
Ce malware n’a pas fait beaucoup d’efforts, et Microsoft non plus, on dirait
Pour être clair, je n’ai jamais utilisé pytorch et je ne connais pas très bien les pratiques de sécurité logicielle
Mais j’ai du mal à imaginer un scénario où pytorch aurait besoin d’un accès réseau
Le fait de pouvoir importer n’importe quel module n’importe où dans la base de code et utiliser son API me paraît problématique
Il faudrait sans doute des restrictions d’import supplémentaires ou de l’analyse statique
Le langage ne semble pas disposer des bonnes abstractions pour traiter ce genre de problème
À titre de comparaison, ce que j’aime avec Rust, c’est qu’on peut voir la mutabilité et les durées de vie juste à partir de la signature d’une fonction, sans comprendre le code interne
J’ai l’impression qu’il faudrait quelque chose de similaire pour les dépendances
Un développeur devrait pouvoir auditer facilement toutes les dépendances sans aller fouiller le code en dessous, et voir : « ah, cette dépendance utilise
eval()» ou « elle a un accès réseau »Les applis mobiles imposent des permissions ; les développeurs ne devraient-ils pas eux aussi pouvoir mettre certaines capacités sur liste blanche au lieu d’accepter d’un bloc toutes sortes de fonctionnalités ?
Je n’aime pas généraliser, mais la communauté de développement IA semble surtout privilégier la commodité au détriment de tout le reste
Par exemple, il est devenu presque standard qu’un projet télécharge automatiquement un gros modèle au premier lancement
On peut généralement le désactiver, mais trouver le bon paramètre dans des couches profondes de classes réparties sur plusieurs bibliothèques est vraiment pénible
C’est bien de pouvoir démarrer très facilement des choses complexes, souvent proches du gadget, mais cette ambiance permissive est assez dérangeante
On dirait que la première étape de résolution de problème est toujours «
pip install …», et certains environnements, comme MacOS, ne virtualisent même pas très bien l’accès GPUJe me demandais cette semaine si utiliser uv pour gérer les versions Python était une bonne idée
Le site web [1] dit que « Python ne fournit pas de binaires officiels pour la distribution, donc uv utilise les distributions du projet Astral python-build-standalone »
Cela renvoie vers ce dépôt GitHub https://github.com/astral-sh/python-build-standalone, qui lui-même mentionne https://gregoryszorc.com/docs/python-build-standalone/main/r...
Si je comprends bien, le code source utilisé pour construire Python ne semble pas venir directement de python.org, et je ne suis pas sûr de la sécurité de tout cela
J’ai la même inquiétude avec asdf [2], mais asdf utilise pyenv [3], qui me paraît plus proche de l’officiel
Est-ce que quelqu’un peut expliquer quel outil est préférable et plus sûr pour installer Python, entre uv et asdf ?
[1] https://docs.astral.sh/uv/guides/install-python/
[2] https://github.com/asdf-community/asdf-python
[3] https://github.com/pyenv/pyenv/tree/master/plugins/python-bu...
On se demande bien d’où ils iraient les chercher sinon
[1]: https://github.com/astral-sh/python-build-standalone/blob/a2...
uvetcpythonne m’inquiètent pas trop. Le processus est solide, la réaction est rapide, et il y a désormais des financements conséquentsCe qui m’inquiète, c’est par exemple un formateur comme
mdformat, largement utilisé mais maintenu principalement par une seule personne sur son temps libre, ou une dépendance très spécifique située trois niveaux plus bas dans l’arbre et qui n’a pas été mise à jour depuis des annéesJe n’ai pas envie de figer toutes les mises à jour et de les approuver manuellement pour une appli activement développée, mais pour une appli sérieuse, ça commence à ressembler à une nécessité
En attendant, je vais devoir récupérer mes clés API depuis un fichier
.envnon chiffréSe faire compromettre sur une grosse webapp grand public, c’est gênant mais compréhensible ; perdre des centaines ou des milliers de dollars à cause d’une dépendance indirecte d’un dépôt de démo gadget qui se trouvait sur le même hôte et le même système, c’est vraiment douloureux
Quelqu’un sait si OAI ou Anthropic remboursent quand des clés sont volées comme ça, ou est-ce considéré comme une erreur utilisateur ?
Je ne sais pas à quel point le risque change selon qu’ils construisent eux-mêmes le binaire Python ou qu’il soit construit par quelqu’un d’autre
En ce moment, la plupart de mes
pip installviennent de suggestions de Claude Code, et je me contente d’appuyer sur EntréeLe modèle a été entraîné sur des données vieilles de plusieurs mois, donc il ne peut pas savoir ce qui a été compromis cette semaine
J’ai en fait construit le pire filtre possible pour juger si « ce paquet est sûr en ce moment »
Tu dis simplement que tu laisses Claude Code te recommander des logiciels à installer depuis Internet, puis que tu les installes tels quels
Je n’ai jamais entendu personne suggérer que Claude Code, ou n’importe quel LLM, soit un filtre permettant de déterminer si « ce paquet est sûr en ce moment », et vu ce que tu décris, cela semble une très mauvaise heuristique
setup.pyva exécuter sur ma machineParce qu’il n’y a rien qui inspecte réellement le paquet avant exécution
Ce qu’il faut, c’est un outil qui récupère les métadonnées avant exécution pour vérifier quels hooks existent
Claude Code est mis à jour presque tous les jours, parfois plusieurs fois par jour
Le jour où Anthropic sera compromis, on va tous prendre très cher
Mais en ce moment, tout le monde est en mode YOLO
J’ai vu ce message posté sur GitHub le 20 avril, et je suis un peu perplexe
"deependujha hi @thebaptiste, thanks for inquiring. Release of 2.6.2 is blocked due to some internal reasons. Will notify once release is made."Si cela veut dire qu’ils connaissaient le problème depuis ce moment-là sans prévenir jusqu’à aujourd’hui, ça me déplairait vraiment
J’aimerais qu’une personne mieux informée clarifie la situation
https://github.com/Lightning-AI/pytorch-lightning/issues/216...
Avant cela, aucune distribution affectée n’existait et nous n’avions pas connaissance de la fuite
La release d’origine sur GitHub n’avait aucun problème, mais nous l’avons retirée pour éviter toute confusion