# Deux fausses missions Upwork, un Mac infecté : mes rencontres avec Contagious Interview, la campagne nord-coréenne

> Un projet de test avec un paquet npm piégé, et une fausse app de visioconférence installée avec curl | bash. Ce qui s’est passé les deux fois, comment j’ai trouvé le malware avec Claude Code, et l’outil que j’ai construit ensuite.

- URL: https://oliverz.dev/fr/blog/upwork-contagious-interview
- Author: Oliver Zhang (https://oliverz.dev)
- Language: fr
- Published: 2026-10-28
- Tags: security, upwork, malware, macos, contagious-interview

> **En bref :** Contagious Interview est une attaque par faux recrutement menée par des hackers nord-coréens. Ils se font passer pour des clients ou des recruteurs sur des plateformes comme Upwork et LinkedIn, et finissent par vous faire exécuter vous-même un « projet de test » ou installer une « app de réunion ». Une règle suffit à la repérer : si un processus de recrutement vous demande d’exécuter du code inconnu sur votre propre machine, arrêtez. Si vous l’avez déjà exécuté, coupez Internet, cherchez des processus en arrière-plan et des dossiers inconnus, changez vos mots de passe et déconnectez tous les appareils connectés sur les sites qui comptent.

## La première fois : juin 2026

Un client qui se disait ukrainien m’a contacté sur Upwork. Il avait un projet et voulait mon aide, et il m’a envoyé un projet de test Node.js appelé « Online_Store ».

Le code malveillant était caché dans l’une de ses dépendances npm. Je ne me souviens plus exactement du paquet ; je crois que c’était quelque chose lié à Tailwind. Une fois le projet lancé, il a discrètement créé sur ma machine un dossier `~/.node_modules` contenant axios et socket.io-client, prêts à envoyer mes données à l’extérieur.

Quand je m’en suis aperçu, il tournait en arrière-plan depuis des jours. Je ne l’ai découvert que par chance : un collègue au Royaume-Uni avait vécu exactement la même chose, et quand il me l’a raconté, j’ai compris que j’avais sans doute été touché aussi.

## La deuxième fois : octobre 2026

Cette fois, la personne se disait lituanienne, d’une société d’investissement appelée Veyron Capital (veyron[.]capital), qui avait publié toute une série d’offres Web3 sur Upwork.

Il m’a écrit en premier, puis a organisé un appel vidéo sur Upwork. Il a gardé sa caméra éteinte, et m’a parlé en chinois du début à la fin. Ensuite, il m’a demandé de l’ajouter sur Telegram et m’a fait entrer dans un groupe, où l’on m’a demandé de construire une démo Web3 et de la présenter à l’équipe en réunion.

Au moment de la présentation, on m’a dit qu’un collègue était en déplacement et ne pouvait pas utiliser l’outil de réunion habituel, et qu’il fallait donc passer à une app de réunion appelée « Zeff » (zeff[.]app). Quelqu’un d’autre du groupe m’a « aidé » à l’installer et m’a proposé deux options : lancer une commande `curl | bash` dans le terminal, ou télécharger un DMG.

Je ne l’ai pas installée. Échaudé la première fois, dès que j’ai vu « lancez cette commande inconnue dans votre terminal pour qu’on puisse faire la réunion », j’ai su que c’était le même piège.

## Avec le recul

Les deux étaient des attaques « Contagious Interview » de la Corée du Nord : faux recrutements et faux entretiens. Ils gagnent votre confiance avec ce qui ressemble à une mission ordinaire, puis vous font exécuter leur code de vos propres mains.

![Les deux attaques ont suivi le même scénario : contact, mise en confiance, la demande, la charge. La deuxième fois, je me suis arrêté à la charge.](https://oliverz.dev/posts/upwork-contagious-interview/attack-flow.en.svg?v=4f6772d3)

Ce qui m’a le plus dérangé, c’est que ni XProtect, intégré à macOS, ni les antivirus traditionnels n’ont réagi, ni l’une ni l’autre fois.

## Claude Code, mon enquêteur forensique

Après la première infection, c’est Claude Code qui a vraiment déterré le problème. J’ai utilisé Fable 5 (Max), je lui ai donné les autorisations nécessaires, et je lui ai fait passer en revue tout mon disque et mes processus en arrière-plan, comme un enquêteur. Il a vite découvert que le malware tournait encore, puis m’a guidé pas à pas pour tout nettoyer.

## Ce que j’ai perdu

Heureusement, rien. Ce que ce type de malware cherche avant tout, ce sont les portefeuilles crypto, et je n’en ai aucun sur cette machine. Les comptes qui comptent pour moi ont tous la double authentification activée : même avec mes mots de passe, personne n’a pu se connecter.

Un avertissement tout de même : ce malware vole généralement aussi les sessions de connexion (cookies) enregistrées dans votre navigateur. Avec elles, un attaquant peut contourner la double authentification et entrer directement dans vos comptes. Donc, si vous êtes touché, changez vos mots de passe, et déconnectez aussi tous les appareils connectés sur les sites qui comptent.

## Alors j’ai construit un outil : Tsuba

Après ces deux rencontres, je voyais bien où était la faille. Ces attaques arrivent chaque fois sous un nouvel emballage et utilisent les outils les plus ordinaires qui soient, comme node, curl et bash : les antivirus traditionnels n’ont aucune raison de les trouver suspectes.

J’ai donc construit une petite app macOS pour la barre des menus, appelée Tsuba (鍔, la garde d’un sabre japonais). L’idée est simple : avant que du code inconnu s’exécute pour la première fois, elle y jette un œil pour vous. Elle détermine ce que le code s’apprête à faire, d’où il vient et s’il ressemble à une attaque connue, puis décide de l’autoriser, de vous avertir ou de le bloquer.

![Avant de s’exécuter, le code inconnu passe par les quatre vérifications de Tsuba, qui décident d’autoriser, d’avertir ou de bloquer.](https://oliverz.dev/posts/upwork-contagious-interview/tsuba-check.en.svg?v=b30d64d2)

Voici comment cela s’applique à mes deux cas :

- **Un faux projet d’entretien, comme le premier** : avant que vous lanciez `npm install` ou `npm start`, elle vérifie si les dépendances figurent sur des listes publiques de paquets malveillants, et parcourt le code source du projet à la recherche de code caché, d’adresses distantes codées en dur ou de code qui lit les portefeuilles et les gestionnaires de mots de passe. En cas de doute, vous pouvez faire un essai du projet dans un bac à sable et voir ce qu’il fait réellement.
- **Une fausse app de réunion, comme la deuxième** : quand elle voit `curl | bash`, elle télécharge le script distant sans l’exécuter et vérifie ce qu’il ferait. Les DMG téléchargés voient aussi leur signature, leur notarisation et leur provenance vérifiées.

Tsuba est gratuite et open source ([sur GitHub](https://github.com/chihyungchang/Tsuba), Apache 2.0). Le téléchargement pour les Mac Apple silicon et Intel, et tout le reste, se trouve sur [la page de Tsuba](https://oliverz.dev/fr/products/tsuba). Si vous prenez des missions sur Upwork ou des plateformes similaires, ou exécutez souvent du code envoyé par d’autres, essayez-la.
