Aller au contenu
macOS · Disponible

Tsuba

Jette un œil au code inconnu avant sa première exécution.

Tsuba app icon
Type
macOS
Version
0.3.0
Sortie
31 oct. 2026
Téléchargements
24
Jeu de règles
20 règles · 2026.10.27
Configuration
macOS 13+
Prix
Gratuit
Confidentialité
Lire →

La tsuba (鍔) est la garde d’un sabre japonais. Celle-ci se loge dans votre barre des menus et intervient aux moments où du code inconnu s’exécute pour la première fois : 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 d’Autoriser, d’Avertir ou de Bloquer.

Je l’ai construite après que de faux clients Upwork ont tenté à deux reprises d’infecter mon Mac. La première fois, ils ont réussi, et ni XProtect ni l’antivirus n’ont rien remarqué. Voici toute l’histoire.

Tsuba en 24 secondes.

Le tableau de bord : état de la protection, ce qui demande votre attention, et un journal en direct de chaque vérification.
Le tableau de bord : état de la protection, ce qui demande votre attention, et un journal en direct de chaque vérification.

Pourquoi les antivirus ratent ces attaques

Faux projets d’entretien, fausses apps de réunion, paquets npm piégés et extensions d’éditeur malveillantes arrivent chaque fois sous un nouvel emballage. Ils passent par des outils ordinaires comme node, curl et bash : un scanner traditionnel n’a rien à signaler. Tsuba surveille plutôt les points d’entrée.

L’ampleur du phénomène :

  • La campagne nord-coréenne Contagious Interview sévit depuis au moins décembre 2022. Le « projet de test » est un projet npm sur GitHub, GitLab ou Bitbucket, et dès que vous faites confiance au dépôt, VS Code exécute de lui-même son fichier de tâches (Microsoft, mars 2026).
  • Socket recense plus de 1 700 paquets malveillants liés à la campagne depuis janvier 2025, sur npm, PyPI, Go, crates.io et Packagist (Socket, avril 2026).
  • Les extensions GlassWorm cachaient leur code dans des caractères Unicode invisibles et ont atteint environ 35 800 installations avant d’être repérées (Koi Security, octobre 2025).
  • Sonatype a enregistré 16 279 nouveaux paquets open source malveillants en un seul trimestre, 845 204 au total (Sonatype, T2 2025).

Avant d’exécuter un projet envoyé par un recruteur

  1. Ne l’ouvrez pas encore dans votre éditeur. Un dossier approuvé peut exécuter son .vscode/tasks.json à l’ouverture.
  2. Lisez package.json : scripts preinstall et postinstall, et dépendances dont vous n’avez jamais entendu parler ou publiées la semaine dernière.
  3. Cherchez du code qui n’a rien à faire dans un test technique : adresses IP codées en dur, eval de texte téléchargé, lecture des profils de navigateur, des portefeuilles ou du trousseau.
  4. Ne collez jamais dans votre terminal une ligne curl … | bash reçue dans une discussion sans avoir lu le script.
  5. Si vous l’avez déjà exécuté, considérez la machine comme compromise : cherchez des traces, puis changez mots de passe, tokens et clés depuis un appareil sain.

Tsuba fait les étapes 1 à 4 pour vous au moment où elles comptent, et son Bilan de santé couvre l’étape 5.

Ce qu’elle vérifie

Point d’entrée Exemples Ce que Tsuba examine
Commandes du terminal curl … | bash, npm install, npx, npm start, git clone Télécharge le script distant sans l’exécuter ; vérifie les paquets npm contre les listes de paquets malveillants, leur ancienneté et leurs scripts d’installation ; analyse le projet à la recherche de code caché, de serveurs codés en dur et de lectures de portefeuilles ou de gestionnaires de mots de passe
Collage dans le terminal Une page vous dit de « copier cette commande dans votre terminal » Avertit dès que vous collez ; les commandes obfusquées envoyées dans un shell sont signalées à haut risque
Dossier Téléchargements Nouveaux fichiers .dmg, .pkg, .vsix Signature, notarisation, source du téléchargement et scripts d’installation
Extensions d’éditeur VS Code, Cursor, Windsurf, VSCodium La liste officielle des extensions malveillantes, l’activation au démarrage, le code caché dans des caractères invisibles ; les extensions à haut risque partent en quarantaine
Outils de code IA Serveurs MCP, skills et hooks pour Claude Code, Cursor, Codex Paquets malveillants connus, lancements depuis des dossiers cachés, instructions cachées à l’utilisateur
Bilan de santé Barre des menus → Bilan de santé Traces laissées par des attaques connues et éléments d’ouverture suspects

Les projets dont vous doutez peuvent d’abord être essayés dans un bac à sable : un faux dossier personnel garni de leurres, des requêtes réseau enregistrées mais jamais envoyées, et une limite de 60 secondes.

L’installation bloquée d’une fausse app de réunion : le verdict, les raisons et les preuves, ligne par ligne.
L’installation bloquée d’une fausse app de réunion : le verdict, les raisons et les preuves, ligne par ligne.

Analysez des dossiers à la demande ou selon un calendrier. Tout ce qui est risqué part en quarantaine.
Analysez des dossiers à la demande ou selon un calendrier. Tout ce qui est risqué part en quarantaine.

Le Bilan de santé cherche les traces d’attaques connues et audite les extensions d’éditeur et les outils d’IA.
Le Bilan de santé cherche les traces d’attaques connues et audite les extensions d’éditeur et les outils d’IA.

Tsuba face aux autres outils

La plupart des outils couvrent une seule porte d’entrée. Tsuba couvre chaque première exécution sur un Mac, et fonctionne en complément des autres.

Outil Ce qu’il vérifie Quand
Tsuba Commandes du terminal, npm et npx, projets clonés, .dmg / .pkg / .vsix, extensions d’éditeur, serveurs MCP, skills et hooks, commandes collées Avant la première exécution du code
npq, Socket Firewall, Aikido Safe Chain Les paquets npm (et, pour certains, PyPI et d’autres) À l’installation
mcp-scan et autres scanners MCP Serveurs MCP et outils d’agent Quand vous lancez une analyse
LuLu, BlockBlock, KnockKnock (Objective-See) Connexions sortantes et logiciels qui s’installent pour démarrer à l’ouverture de session Après l’exécution du code
Antivirus et XProtect Signatures de malwares connus Quand un fichier correspond à un échantillon connu

Comment elle décide

Les règles hors ligne s’exécutent toujours en premier, appuyées par des renseignements publics sur les menaces mis à jour chaque jour, dont plus de 230 000 paquets npm et PyPI signalés comme malveillants par l’OpenSSF. Un modèle d’IA peut ensuite juger les preuves en contexte. Claude donne les meilleurs résultats, d’autres fournisseurs et des modèles locaux sont pris en charge, et vous pouvez désactiver complètement l’IA.

Seules les preuves dont une vérification a besoin sont envoyées au modèle. Les commentaires du code sont retirés au préalable, et les secrets ne sont jamais envoyés. La configuration et l’historique restent dans ~/.tsuba, sur votre Mac.

Réglages : activez ou désactivez chaque défense, et choisissez comment les verdicts sont rendus, avec ou sans IA.
Réglages : activez ou désactivez chaque défense, et choisissez comment les verdicts sont rendus, avec ou sans IA.

Disponibilité

Tsuba est disponible, gratuite et open source sous licence Apache 2.0 (sur GitHub). Il existe deux versions : choisissez Apple silicon pour les Mac M1 et plus récents, Intel pour les plus anciens. Vous ne savez pas lequel vous avez ? Menu Apple → À propos de ce Mac → Puce.

L’app parle dix langues, dont le français : English, 简体中文, 繁體中文, 日本語, 한국어, Español, Français, Deutsch, Português et Русский. L’interface, les notifications, les vérifications dans le terminal, les explications des règles et les réponses de l’IA suivent la langue de macOS, ou choisissez-en une dans Réglages → Apparence.

Tsuba n’est pas encore signée ni notarisée par Apple : macOS la bloque donc la première fois que vous l’ouvrez. Allez dans Réglages Système → Confidentialité et sécurité et cliquez sur Ouvrir quand même. Merci de ne pas retirer plutôt l’attribut de quarantaine avec xattr : Tsuba avertit à propos des installeurs qui vous le demandent, et le sien ne doit pas faire exception.

Vous ne le faites qu’une fois. Ensuite, Tsuba se met à jour toute seule : elle vous prévient quand une nouvelle version sort, et ne l’installe que si sa signature correspond à la clé intégrée à l’app.

Pour vérifier que votre DMG est bien celui que GitHub a compilé à partir du code public, comparez shasum -a 256 Tsuba_*.dmg avec SHA256SUMS.txt sur la page de la version.

Essayer

Vrais résultats, vraies règles

Choisissez un échantillon pour voir ce que l’app a affiché en l’analysant : règles hors ligne uniquement, version 0.1.1. Les échantillons viennent de sa suite de tests. Ils reprennent la forme d’attaques réelles mais sont inoffensifs.

$ tsuba scan ~/code/fake_interview_project

Tsuba ✗ Block recommended  ~/code/fake_interview_project
  Evidence:
   High Decodes and then dynamically runs code (eval/Function + base64), common in obfuscated poisoned code [server/server.js] Source: Tsuba rules · Apache-2.0
      eval(Buffer.from("Y29uc29sZS5sb2coImxvY2FsZ3VhcmQgdGVzdCBmaXh0dXJlIik=", "base64").toString()); const C2 = "http://203.0.113.7:1224/api"; app.get('/', (q, r) =>
   High Connects straight to a hard-coded IP address and port (typical of a C2 server) [server/server.js]
      eval(Buffer.from("Y29uc29sZS5sb2coImxvY2FsZ3VhcmQgdGVzdCBmaXh0dXJlIik=", "base64").toString()); const C2 = "http://203.0.113.7:1224/api"; app.get('/', (q, r) =>
   High Code is pushed off the right edge of the screen by whitespace, out of sight (a typical way to hide a poisoned payload) [server/server.js]
      const app = require("express")(); ⟨400 spaces⟩ eval(Buffer.from("Y29uc29sZS5sb2coImxvY2FsZ3VhcmQgdGVzdCBmaXh0dXJlIik=", "base64").toString()); const C2 = "http:
Journal des modifications

Journal des modifications

Flux des versions ↗
Fichiers · v0.3.0Taille
Tsuba_0.3.0_aarch64.dmg19.5 MB4b8ff8f2cc343864f63be59c43460f4396ab61ad4ae2ddd368d13ff61a58d1d3
Tsuba_0.3.0_x64.dmg22.3 MB02cfbea2b133032c5207c9e1dcbd1432ecc737408db29fbc1d9fb92fb5962122
  1. 0.3.031 oct. 2026
    • f8aa092Give other languages' relative times room in the terminal log
    • d4a8ac6Translate the README into nine languages and refresh its screenshots
    • 7c0a4a6Add seals, a crest and gold fittings to the samurai look
    • 9de218fSpeak ten languages
    • 52826a5Restyle the shell as held-back samurai armor
    • c103f41Show the guard on a laptop and open the app through it
    • 1d22fd0Replace the katana logo with a 3D tsuba
    • 0cfcdfdAdd pnpm app to start the app from the repo root
    • 54bf89dDeclare all four MCP tool hints and test quarantine_list
    • 51a757fAdd the M8ven Verified badge to the README
    • 4ccb857Give the README a product page look with screenshots
    Toutes les modifications ↗
  2. 0.2.129 oct. 2026
    Toutes les modifications ↗
  3. 0.2.029 oct. 2026
    • be28cfaPlay a short, soft sound with Block notifications
    • 14d4349Redesign Settings, Health Check and the window chrome
    • 42754edUpdate Tsuba in the app from GitHub Releases
    • 4392c89Let users ignore warnings and choose which notifications they get
    Toutes les modifications ↗
  4. 0.1.228 oct. 2026
    • d0353e4Add the Apache-2.0 LICENSE
    • e7f620eLeave folders the sandbox hides out of its PATH
    • d8fc3b7Let the website workflow run by hand to test the hook
    • a1f8191Rebuild the website when a release is published
    Toutes les modifications ↗
Questions

Questions

Puis-je exécuter sans risque un projet envoyé par un recruteur ?

Considérez-le comme non fiable tant qu’il n’a pas été vérifié : dans les faux entretiens d’embauche, le projet de test est le malware. Glissez le dossier sur la fenêtre de Tsuba, ou clonez-le avec Tsuba connectée à votre terminal : elle vérifie les dépendances, les scripts d’installation et les tâches VS Code avant que quoi que ce soit ne s’exécute. Si vous l’avez déjà exécuté, lancez un Bilan de santé et lisez ce qui m’est arrivé.

Comment vérifier un paquet npm avant de l’installer ?

Avec Tsuba connectée à votre terminal, npm install et npx sont vérifiés avant leur exécution : paquets malveillants connus de la liste OpenSSF, paquets publiés il y a quelques jours à peine, et scripts d’installation. Des outils en ligne de commande comme npq font une vérification similaire, pour npm seulement.

Pourquoi macOS dit-il que Tsuba ne peut pas être ouverte ?

Tsuba n’est pas encore signée ni notarisée par Apple : la première fois que vous l’ouvrez, allez dans Réglages Système → Confidentialité et sécurité et cliquez sur Ouvrir quand même. Merci de ne pas retirer plutôt l’attribut de quarantaine avec xattr : Tsuba avertit justement à propos des installeurs qui le demandent. Pour vérifier votre téléchargement, comparez-le au SHA-256 indiqué sous Journal des modifications.

Tsuba envoie-t-elle mon code ?

Aucun fichier n’est envoyé. Si vous activez l’IA, seules les preuves dont une vérification a besoin partent vers le modèle que vous avez choisi, sans les commentaires du code et sans les secrets. IA désactivée, les vérifications tournent sur votre Mac avec les règles hors ligne. La configuration et l’historique restent dans ~/.tsuba. La politique de confidentialité liste tout ce que Tsuba envoie, et quand.

Faut-il un abonnement à une IA ou une clé d’API ?

Non. Les règles hors ligne s’exécutent toujours en premier et fonctionnent seules. L’IA est facultative : Claude donne les meilleurs résultats, et d’autres fournisseurs ainsi que des modèles locaux sont pris en charge.

Remplace-t-elle mon antivirus ?

Non. La reconnaissance des malwares connus est laissée à XProtect de macOS et aux renseignements ouverts sur les menaces. Tsuba couvre ce qui leur échappe : du code sous un nouvel emballage que personne n’a encore vu, comme les faux projets d’entretien, les fausses apps de réunion, les paquets piégés et les extensions malveillantes, et elle intervient avant que ce code ne s’exécute.

Sur quels Mac fonctionne-t-elle ?

macOS 13 ou version ultérieure, sur Apple silicon et Intel, avec un téléchargement distinct pour chacun. Menu Apple → À propos de ce Mac → Puce vous indique lequel vous avez.

Et si elle signale quelque chose qui est en fait sûr ?

Chaque « Avertir » et chaque « Bloquer » affiche ses preuves (quel fichier, quelle ligne, ce qui a correspondu) pour que vous puissiez juger par vous-même, et un avertissement que vous avez vérifié peut être ignoré, ou ce en quoi vous avez confiance ajouté à la liste d’autorisation. Merci de signaler le faux positif : chacun devient un test de régression.

Retours

Un bug, ou une attaque ratée ?

Les signalements vont dans GitHub Issues, en public. Ne collez jamais de secrets. Pour un vrai échantillon malveillant, envoyez son hash et sa provenance, pas le fichier.

Suivre

Je partage mes projets, expériences et leçons au fil de l’eau.

Les nouvelles vidéos sur YouTube, des notes plus courtes sur X. Chaque article ici renvoie aux deux.

YouTube