本文へスキップ
macOS · 公開中

Tsuba

見知らぬコードが初めて実行される前に、ひと目確認します。

Tsuba app icon
種類
macOS
バージョン
0.3.0
リリース
2026年10月31日
ダウンロード数
24
ルールパック
20 件のルール · 2026.10.27
動作環境
macOS 13+
価格
無料
プライバシー
読む →

Tsuba(鍔)は日本刀の鍔のこと。この Tsuba はメニューバーに常駐し、見知らぬコードが初めて実行される瞬間に介入します。そのコードが何をしようとしているのか、どこから来たのか、既知の攻撃に似ていないかを調べ、許可、警告、ブロック のどれにするかを決めます。

つくったきっかけは、Upwork の偽クライアントに 2 回、Mac を感染させられそうになったことです。1 回目は感染し、XProtect もアンチウイルスも気づきませんでした。経緯はこちら。

24 秒でわかる Tsuba。

ダッシュボード:保護の状態、対応が必要なもの、すべてのチェックのライブログ。
ダッシュボード:保護の状態、対応が必要なもの、すべてのチェックのライブログ。

アンチウイルスがこうした攻撃を見逃す理由

偽の面接プロジェクト、偽の会議アプリ、汚染された npm パッケージ、悪意あるエディタ拡張機能は、毎回新しい包装でやってきます。node、curl、bash のような普通のツールを通して動くので、従来のスキャナーには検出する手がかりがありません。だから Tsuba は入口を見張ります。

規模はこれほどです:

  • 北朝鮮の Contagious Interview キャンペーンは、少なくとも 2022 年 12 月から続いています。「テストプロジェクト」は GitHub、GitLab、Bitbucket 上の npm プロジェクトで、リポジトリを信頼すると VS Code がそのタスクファイルを自動で実行します(Microsoft、2026 年 3 月)。
  • Socket は、2025 年 1 月以降このキャンペーンに関連する 1,700 以上の悪意あるパッケージ を、npm、PyPI、Go、crates.io、Packagist で追跡しています(Socket、2026 年 4 月)。
  • GlassWorm の拡張機能は、見えない Unicode 文字にコードを隠し、発見されるまでに約 35,800 回インストール されました(Koi Security、2025 年 10 月)。
  • Sonatype は、わずか 1 四半期で 16,279 件の新たな悪意あるオープンソースパッケージ を記録し、累計は 845,204 件にのぼります(Sonatype、2025 年第 2 四半期)。

採用担当者から送られたプロジェクトを実行する前に

  1. まだエディタで開かないこと。信頼したフォルダは、開いた時点で .vscode/tasks.json を実行することがあります。
  2. package.json を読む:preinstall と postinstall のスクリプト、聞いたことのない依存パッケージや先週公開されたばかりのもの。
  3. 課題にあるはずのないコードを探す:ハードコードされた IP アドレス、ダウンロードしたテキストの eval、ブラウザのプロファイル、ウォレット、キーチェーンの読み取り。
  4. チャットで渡された curl … | bash の行を、スクリプトを読まずにターミナルに貼り付けないこと。
  5. すでに実行してしまったなら、マシンは侵害されたものと考える:痕跡を確認し、クリーンなデバイスからパスワード、トークン、キーを変更します。

Tsuba は手順 1〜4 をここぞというタイミングで代わりに行い、ヘルスチェックが手順 5 をカバーします。

チェックする対象

入口 例 Tsuba が見るもの
ターミナルのコマンド curl … | bash、npm install、npx、npm start、git clone リモートのスクリプトを実行せずにダウンロード。npm パッケージを悪意あるパッケージのリスト、公開からの日数、インストールスクリプトと照合。プロジェクト内の隠しコード、ハードコードされたサーバー、ウォレットやパスワードストアの読み取りをスキャン
ターミナルへの貼り付け ページが「このコマンドをターミナルにコピーして」と指示する 貼り付けた瞬間に警告。難読化されたコマンドをシェルにパイプするものは高リスクとして検出
ダウンロードフォルダ 新しい .dmg、.pkg、.vsix ファイル 署名、公証、ダウンロード元、インストールスクリプト
エディタ拡張機能 VS Code、Cursor、Windsurf、VSCodium 公式の悪意ある拡張機能リスト、起動時の自動有効化、見えない文字に隠されたコード。高リスクの拡張機能は隔離
AI コーディングツール Claude Code、Cursor、Codex の MCP サーバー、スキル、フック 既知の悪意あるパッケージ、隠しフォルダからの起動、ユーザーから隠された指示
ヘルスチェック メニューバー → ヘルスチェック 既知の攻撃が残した痕跡と、怪しいログイン項目

不安なプロジェクトは、まずサンドボックスで試しに動かせます。おとりを置いた偽のホームフォルダ、記録はされても実際には送信されないネットワークリクエスト、60 秒の制限つきです。

ブロックされた偽の会議アプリのインストール:判定、理由、証拠を 1 行ずつ。
ブロックされた偽の会議アプリのインストール:判定、理由、証拠を 1 行ずつ。

フォルダをその場で、またはスケジュールでスキャン。危険なものは隔離されます。
フォルダをその場で、またはスケジュールでスキャン。危険なものは隔離されます。

ヘルスチェックは既知の攻撃の痕跡を探し、エディタ拡張機能と AI ツールを監査します。
ヘルスチェックは既知の攻撃の痕跡を探し、エディタ拡張機能と AI ツールを監査します。

ほかのツールとの比較

ほとんどのツールがカバーする入口は 1 つです。Tsuba は Mac 上のあらゆる初回実行をカバーし、ほかのツールと併用できます。

ツール チェックする対象 タイミング
Tsuba ターミナルのコマンド、npm と npx、クローンしたプロジェクト、.dmg / .pkg / .vsix、エディタ拡張機能、MCP サーバー、スキルとフック、貼り付けたコマンド コードが初めて実行される前
npq、Socket Firewall、Aikido Safe Chain npm のパッケージ(一部は PyPI なども) インストール時
mcp-scan などの MCP スキャナー MCP サーバーとエージェントのツール スキャンを実行したとき
LuLu、BlockBlock、KnockKnock(Objective-See) 外向きの通信と、ログイン時に起動するよう自分を登録するソフトウェア コードが実行された後
アンチウイルスと XProtect 既知のマルウェアのシグネチャ ファイルが既知のサンプルに一致したとき

判定のしくみ

まずオフラインルールが必ず動きます。その裏には毎日更新される公開の脅威インテリジェンスがあり、OpenSSF に報告された 23 万件以上の悪意ある npm・PyPI パッケージも含まれます。そのうえで AI モデルが文脈から証拠を判断できます。Claude がいちばんよく機能し、ほかのプロバイダーやローカルモデルにも対応、AI を完全にオフにすることもできます。

モデルに送るのは、チェックに必要な証拠だけです。コードのコメントは先に取り除かれ、シークレットがアップロードされることはありません。設定と履歴は Mac 上の ~/.tsuba に残ります。

設定:防御を一つずつオン・オフし、判定のしかたを AI ありかなしかで選べます。
設定:防御を一つずつオン・オフし、判定のしかたを AI ありかなしかで選べます。

入手方法

Tsuba は公開中で、無料、Apache 2.0 ライセンスのオープンソースです(GitHub)。ビルドは 2 種類あります。M1 以降の Mac なら Apple シリコン、それより前の Mac なら Intel を選んでください。どちらかわからなければ、Apple メニュー →「この Mac について」→ チップで確認できます。

アプリは 10 の言語に対応しています:English、简体中文、繁體中文、日本語、한국어、Español、Français、Deutsch、Português、Русский。日本語ももちろん含まれます。画面、通知、ターミナルのチェック、ルールの説明、AI の回答はすべて macOS の言語設定に従い、設定 → 外観 で選ぶこともできます。

Tsuba はまだ Apple の署名と公証を受けていないため、初めて開くときに macOS がブロックします。システム設定 → プライバシーとセキュリティ で このまま開く をクリックしてください。代わりに xattr で検疫フラグを外すのはやめてください。Tsuba はそれを求めるインストーラーに警告を出すので、自分だけ例外にするべきではありません。

これが必要なのは最初の 1 回だけです。その後は Tsuba が自分でアップデートします。新しいバージョンが出たら知らせ、アプリに組み込まれた鍵と署名が一致した場合にだけインストールします。

DMG が GitHub で公開ソースからビルドされたものか確かめるには、shasum -a 256 Tsuba_*.dmg の結果を リリースページ の SHA256SUMS.txt と照合してください。

試してみる

本物の出力、本物のルール

サンプルを選ぶと、アプリがそれをスキャンしたときの実際の出力が表示されます。オフラインルールのみ、バージョン 0.1.1。サンプルはテストスイートから取ったもので、実際の攻撃の形をまねていますが無害です。

$ 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:
変更履歴

変更履歴

リリースフィード ↗
ファイル · v0.3.0サイズ
Tsuba_0.3.0_aarch64.dmg19.5 MB4b8ff8f2cc343864f63be59c43460f4396ab61ad4ae2ddd368d13ff61a58d1d3
Tsuba_0.3.0_x64.dmg22.3 MB02cfbea2b133032c5207c9e1dcbd1432ecc737408db29fbc1d9fb92fb5962122
  1. 0.3.02026年10月31日
    • 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
    すべての変更 ↗
  2. 0.2.12026年10月29日
    すべての変更 ↗
  3. 0.2.02026年10月29日
    • 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
    すべての変更 ↗
  4. 0.1.22026年10月28日
    • 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
    すべての変更 ↗
よくある質問

よくある質問

採用担当者から送られたプロジェクトを実行しても大丈夫?

チェックが済むまでは信頼できないものとして扱ってください。偽の採用面接では、テストプロジェクトそのものがマルウェアです。フォルダを Tsuba のウィンドウにドラッグするか、Tsuba をつないだターミナルでクローンすれば、何かが実行される前に依存パッケージ、インストールスクリプト、VS Code のタスクをチェックします。すでに実行してしまったなら、ヘルスチェック を実行し、私に起きたこと を読んでください。

npm パッケージをインストール前にチェックするには?

Tsuba をターミナルにつなぐと、npm install と npx は実行前にチェックされます。OpenSSF のリストにある既知の悪意あるパッケージ、公開されて数日しか経っていないパッケージ、インストールスクリプトを確認します。npq のようなコマンドラインツールも、npm に限って似たチェックをします。

macOS が「Tsuba を開けません」と表示するのはなぜ?

Tsuba はまだ Apple の署名と公証を受けていないため、初めて開くときは システム設定 → プライバシーとセキュリティ で このまま開く をクリックしてください。代わりに xattr で検疫フラグを外すのはやめてください。Tsuba はそれを求めるインストーラーに警告を出します。ダウンロードを確認するには、変更履歴に載っている SHA-256 と照合してください。

Tsuba は私のコードをアップロードしますか?

ファイルは一切アップロードしません。AI をオンにした場合も、チェックに必要な証拠だけを選んだモデルに送り、コードのコメントは取り除き、シークレットは含めません。AI がオフなら、チェックは Mac 上のオフラインルールで行います。設定と履歴は ~/.tsuba に残ります。Tsuba が何をいつ送るかは、すべて プライバシーについて に載っています。

AI のサブスクリプションや API キーは必要?

いいえ。オフラインルールが必ず先に動き、それだけで機能します。AI は任意です。Claude がいちばんよく機能し、ほかのプロバイダーやローカルモデルにも対応しています。

アンチウイルスの代わりになりますか?

いいえ。既知のマルウェアの識別は macOS の XProtect と公開の脅威インテリジェンスに任せています。Tsuba が受け持つのは、それらが見逃すもの、つまり偽の面接プロジェクト、偽の会議アプリ、汚染されたパッケージ、悪意ある拡張機能のように、新しい包装でまだ誰も見たことのないコードで、それが実行される前に介入します。

どの Mac で動きますか?

macOS 13 以降の Apple シリコンと Intel で動き、それぞれ別のダウンロードがあります。どちらかは、Apple メニュー →「この Mac について」→ チップで確認できます。

安全なものを検出してしまったら?

警告とブロックにはすべて証拠(どのファイルのどの行が、何にマッチしたか)が表示されるので、自分で判断できます。確認した警告は無視でき、信頼するものは許可リストに入れられます。ぜひ 誤検出を報告 してください。一つひとつが回帰テストになります。

フィードバック

バグや見逃しを見つけましたか?

報告は GitHub Issues に公開で届きます。シークレットは絶対に貼り付けないでください。本物の悪性サンプルは、ファイルではなくハッシュと入手元を送ってください。

フォローする

つくったもの、実験、学んだことを随時シェアしています。

新しい動画は YouTube に、短いメモは X に。ここの記事はすべて両方にリンクしています。

YouTube