- Cas d’attaque par ingénierie sociale où un recruteur a approché la cible par message LinkedIn, sous prétexte de recruter un lead engineer, en demandant de relire un dépôt GitHub public
- Le code soumis à revue contenait une porte dérobée déguisée en suite de tests, et la demande de "vérifier un problème de modules Node obsolètes" servait d’appât pour pousser à exécuter
npm install - Après avoir eu des soupçons, le code a été inspecté non pas en local mais sur un VPS jetable, avec un agent en lecture seule ; le fichier problématique a été détecté en quelques secondes
- Les commits du dépôt comme le profil du recruteur usurpaient l’identité de personnes réelles, se faisant passer respectivement pour un vrai développeur et une journaliste du milieu artistique
- L’auteur en tire des enseignements de défense concrets : le doute, une bonne hygiène de sécurité et l’usage d’un agent en lecture seule se sont révélés plus efficaces qu’une lecture manuelle directe du code
Déroulement de l’approche
- La semaine dernière, l’auteur a reçu un message LinkedIn d’un recruteur d’une petite startup crypto
- Ils ont échangé plusieurs messages sur quelques jours, au sujet d’un proof of concept défaillant nécessitant un lead engineer
- Le recruteur a transmis un dépôt GitHub public à examiner, en demandant de « vérifier le problème des modules Node obsolètes »
- Les demandes de revue de code existant sont courantes, mais cette fois une impression étrange a poussé à renforcer la vigilance
Méthode d’inspection
- Au lieu de cloner puis d’installer les dépendances, l’auteur a lancé un VPS jetable chez Hetzner et y a cloné le dépôt
- Pi a été configuré en mode lecture seule, avec uniquement les outils de lecture de fichiers activés
- Commande utilisée :
pi --tools read,grep,find,ls
- Commande utilisée :
- En demandant à l’agent de relire la base de code et de signaler les éléments suspects, il s’est presque immédiatement arrêté sur
app/test/index.js
Structure de la porte dérobée
- Le dépôt se présentait comme un frontend React + backend Node
- Le piège se trouvait dans
app/test/index.js, un fichier d’environ 250 lignes, déguisé en suite de tests - À l’intérieur, une URL était recomposée à partir de fragments pour être dissimulée
- En combinant des variables comme protocol, domain, separator, path, token ou subdomain, le code reconstruisait
https://rest-icon-handler.store/icons/77
- En combinant des variables comme protocol, domain, separator, path, token ou subdomain, le code reconstruisait
- La charge utile était cachée parmi des brouillons de tests commentés, et permettait d’exécuter sur la machine de l’utilisateur tout ce que le serveur renvoyait
- La charge utile se trouvait à la ligne 225
Mécanisme de déclenchement
- Le fichier n’attendait même pas le lancement des tests
app/index.jsexécutaitconst test = require('./test'), ce qui chargeait et lançaitapp/test/index.js
package.jsonreliaitapp/index.jsà la phase de démarrage- L’élément clé était le script
prepare: npm l’exécute automatiquement aprèsnpm install- Autrement dit, la simple installation des dépendances déclenchait la porte dérobée
- La consigne de « vérifier le problème des modules Node obsolètes » n’était donc qu’un appât pour pousser à lancer
npm install - Il aurait été possible d’exécuter la charge utile dans un bac à sable pour observer une charge utile de deuxième étape, mais la preuve qu’un code fourni par le serveur allait être exécuté a suffi pour s’arrêter là
Première identité usurpée
- Les commits étaient signés du nom et de l’e-mail d’un véritable développeur full stack
- Il dispose d’un profil LinkedIn ordinaire, d’un site personnel et d’un compte GitHub ancien
- En prétendant avoir hérité de cette base de code, l’auteur l’a contacté
- Le développeur a répondu n’avoir jamais travaillé pour cette entreprise, avoir déjà été usurpé sur GitHub par le passé avec suppression de dépôts, et n’avoir aucun lien avec ce dépôt-ci
- Il a ajouté qu’il était lui-même en train de signaler ce type de dépôts
- L’ensemble de l’historique, soit 39 commits, était attribué au nom d’un développeur qui n’avait jamais touché à ce dépôt
Deuxième identité usurpée
- Le profil du recruteur appartenait en réalité à une véritable journaliste du monde de l’art, avec un parcours uniquement culturel et aucun élément technique
- Quand l’auteur a répondu que l’installation ne fonctionnait pas, cette journaliste non technique s’est instantanément transformée en experte de npm et des versions de Node, insistant pour faire exécuter
npm install
Cela peut arriver à n’importe qui
- L’auteur connaissait déjà ce type d’attaque et en avait lu sur HN, mais s’est tout de même fait surprendre en étant directement ciblé
- Il avait des doutes dès le premier message, mais un jour de fatigue ou d’urgence, il aurait pu lancer
npm installsans y réfléchir davantage
- Il avait des doutes dès le premier message, mais un jour de fatigue ou d’urgence, il aurait pu lancer
- Les messages LinkedIn demandant de relire un dépôt appellent à un minimum de méfiance et d’hygiène de sécurité
- Relire le code avec un agent en lecture seule s’est révélé plus efficace qu’une inspection manuelle
- La porte dérobée était déguisée en code maladroit de débutant, mais l’agent l’a repérée en quelques secondes
- Le dépôt a été signalé à GitHub et le recruteur à LinkedIn, mais pour l’instant rien n’a changé et le code reste toujours en ligne
1 commentaires
Avis sur Hacker News
Un recruteur d’une petite startup crypto a envoyé un dépôt GitHub public en demandant d’examiner une preuve de concept cassée et de vérifier un « deprecated Node modules issue » : tout cela relevait en fait d’un phishing incitant à faire
npm installLe script
prepares’exécutait automatiquement aprèsnpm installet servait de porte dérobée en lançant en local du code arbitraire fourni par un serveur ; le fait qu’on puisse se faire piéger ainsi sur LinkedIn paraît d’une gravité étonnante$company, et il suffit que ce soit écrit sur le profil pour apparaître sur la page officielle de l’entrepriseNotre société aussi a eu de faux recruteurs menant la même arnaque ; leurs profils semblaient assez crédibles, avec même beaucoup d’activité liée à LinkedIn Premium, mais ce n’étaient pas de vrais employés
On a beau les signaler, ils ne sont pas retirés ; au final, le problème n’a été réglé qu’en payant un verre à une connaissance qui travaille chez LinkedIn, mais toutes les startups n’ont pas ce genre de relais
Vu le nombre de gens qui continuent à se faire avoir, c’est incompréhensible qu’on n’utilise pas un outil comme PNPM pour bloquer cette faille évidente et si souvent exploitée : l’exécution de code arbitraire pendant le téléchargement du code
Les outils qui exécutent du code arbitraire au moment même où l’on veut simplement télécharger du code doivent disparaître
Le dernier exemple dont je me souviens était un téléchargement déguisé en fichier d’écran de veille Windows
.scr, et le fait que ça arrive maintenant sur LinkedIn marque une étape encore pireLa plateforme s’en souciera sans doute peu, puisque cela ressemble à une « hausse des offres d’emploi », un peu comme les réseaux publicitaires de Google ou Meta se soucient peu des publicités frauduleuses
bullshitpowershellladendoucument.pdf.docx, mais l’envoyer directement en DM LinkedIn est une stratégie assez audacieuseÇa relève clairement du crime, et je ne comprends pas pourquoi il n’existe pas de point de contact bien connu, une sorte de 911 de la cybercriminalité, pour signaler ce genre de choses et obtenir de l’aide
La société doit rattraper les risques réels et mettre rapidement en place un réseau de soutien ; face au crime organisé, il faut une défense organisée
Vous n’aurez probablement jamais de réponse, mais pour les citoyens américains, et peut-être même pour tout le monde, c’est à ma connaissance ce qui se rapproche le plus d’un 911 d’Internet
Le deuxième problème, c’est l’asymétrie : créer ce type d’arnaque demande un effort proche de zéro, tandis qu’identifier puis poursuivre les responsables demande énormément de travail et des coûts astronomiques
On est à peu près au même niveau que les appels d’escroquerie se faisant passer pour le support Microsoft et ciblant les personnes âgées, et il est presque impossible de mettre la main sur les suspects
Soit ils cachent extrêmement bien leurs traces, soit, plus souvent, ils vivent dans des pays où les autorités ne se soucient pas des arnaques visant les Occidentaux, voire les tolèrent
Même si vous signalez le crime, il y a de fortes chances qu’on ne vous aide pas et qu’on ne vous contacte pas
C’est désormais dangereusement proche d’un exercice technique d’entretien tout à fait ordinaire
Quelqu’un qui vous envoie un dépôt en disant que l’installation est cassée et vous demande d’y jeter un œil, c’est une situation naturelle, et beaucoup de développeurs, fatigués ou en recherche d’emploi, peuvent lancer
npm installsans trop réfléchirOn ne veut pas avoir l’air lent, donc on saute l’étape qui consisterait à demander si l’on a seulement le droit d’exécuter cela
« J’ai signalé le dépôt à GitHub et le recruteur à LinkedIn, mais rien n’a encore changé et le code est toujours en ligne » : ah, Microsoft
Elle menait vers une fausse vidéo où le Premier ministre canadien annonçait un plan d’investissement crypto pour tous les Canadiens, avec même un lien d’inscription ; après signalement, on m’a répondu qu’aucune violation des règles n’avait été constatée
Les trois ont des problèmes de sécurité ou de fiabilité, et plus Microsoft s’enfonce dans l’IA, plus la situation semble empirer au lieu de s’améliorer
Je ne sais pas où passe cette fameuse productivité interne dopée à l’IA, parfois présentée comme multipliée par 10
Là, ça aurait été retiré immédiatement
Il semble qu’ils utilisent le même domaine pour plusieurs cibles
Un fil Reddit d’il y a 3 mois mentionne quelque chose de similaire : https://www.reddit.com/r/openclaw/comments/1rlet0h/someone_t...
Je ne comprends pas pourquoi tous les systèmes d’exploitation du monde n’ont pas encore bloqué npm
Ces gens-là n’apprendront jamais
Cette arnaque aurait été possible avec de nombreuses autres technologies, et même avec un Makefile
J’aimerais qu’il existe enfin un vrai framework de virtualisation correct sur Mac
Télécharger au hasard des scripts sur Internet sans protection, comme en 1995, commence sérieusement à me lasser
Quand on rencontre des inconnus et qu’on fait entrer leurs affaires au plus profond de son ordinateur, il ne faut pas oublier de porter un équipement de protection
curl | bashvenant de GitHub, AUR ou NPM, c’est tout aussi mauvais, mais beaucoup de développeurs ici gardent encore des présupposés douteux sur cette mauvaise pratiqueLes divers petits incidents de type Shai-Hulud qui ont circulé ces dernières semaines montrent bien à quel point c’est problématique
Dans IntelliJ, on peut configurer l’exécution des commandes npm à l’intérieur d’un conteneur Docker
Toutes les propositions d’emploi que j’ai reçues sur LinkedIn semblaient extrêmement suspectes
Elles demandaient de postuler via la plateforme, d’enregistrer une vidéo de présentation ou de passer un test de code de calibrage caché derrière une plateforme de code
On lui a demandé d’émettre un chèque pour la caution d’un ordinateur portable professionnel ; même si, vu de l’extérieur, cela n’avait aucun sens, après une longue période de recherche il était désespéré et vraiment heureux d’avoir enfin trouvé un travail
Les personnes durablement au chômage peuvent devenir si désespérées qu’elles ignorent des signaux d’alerte majeurs qui ne tromperaient jamais quelqu’un disposant d’une épargne suffisante ou déjà en poste et simplement en train de changer d’emploi
Est-ce que ce n’est pas comme ça que la plupart des auteurs de paquets NPM se font pirater ces jours-ci ?
On dirait aussi que le responsable d’axios a subi la même approche via LinkedIn
Je n’utilise LinkedIn que pour les offres d’emploi, mais depuis quelques mois il y a beaucoup trop d’annonces inutiles
On voit défiler des tonnes d’annonces d’entreprises du genre Ladders, Swooped, et j’ai l’impression qu’il est temps d’abandonner complètement LinkedIn