# Tsuba: 陌生的程式碼第一次執行之前，先替你看一眼。

> 一款免費的 macOS 選單列應用程式。在 npm install、curl | bash 腳本、下載的 DMG、編輯器擴充功能和 AI 工具外掛執行之前先做檢查，攔下北韓 Contagious Interview 這類假面試惡意程式。

- URL: https://oliverz.dev/zh-hant/products/tsuba
- Author: Oliver Zhang (https://oliverz.dev)
- Language: zh-Hant
- Platform: macOS app
- Status: live
- Price: Free
- License: Apache-2.0
- Version: 0.3.0
- First released: 2026-10-28
- Latest release: 2026-10-31
- Requirements: macOS 13+
- 下載 Apple 晶片版: https://github.com/chihyungchang/Tsuba/releases/download/v0.3.0/Tsuba_0.3.0_aarch64.dmg
- 下載 Intel 版: https://github.com/chihyungchang/Tsuba/releases/download/v0.3.0/Tsuba_0.3.0_x64.dmg
- Source: https://github.com/chihyungchang/Tsuba

Tsuba（鍔）是日本刀上護手的那塊鐵。這個 Tsuba 待在你的選單列裡，在陌生的程式碼第一次執行的那一刻介入：先弄清楚這段程式碼要做什麼、從哪裡來、像不像已知的攻擊手法，再決定**放行**、**提醒**還是**攔截**。

我做它，是因為在 Upwork 上被假客戶盯上了兩次。第一次我中招了，XProtect 和防毒軟體都沒發現。[完整經過在這篇文章裡](https://oliverz.dev/zh-hant/blog/upwork-contagious-interview)。

![24 秒看懂 Tsuba。](https://oliverz.dev/products/tsuba/demo.zh.mp4?v=c21decf9)

![概覽：保護狀態、需要處理的事，以及每一次檢查的即時紀錄。](https://oliverz.dev/products/tsuba/1-overview.zh.webp?v=f2f47b30)

## 為什麼防毒軟體擋不住

假面試專案、假會議軟體、被投毒的 npm 套件、惡意編輯器擴充功能，每次都換一身包裝，用的又都是 node、curl、bash 這些普通工具，傳統防毒軟體找不到可疑之處。所以 Tsuba 不去掃病毒特徵，而是守在程式碼執行的入口。

規模有多大：

- 北韓的 **Contagious Interview（傳染性面試）** 行動至少從 2022 年 12 月就開始了。所謂「測試專案」是放在 GitHub、GitLab 或 Bitbucket 上的 npm 專案，你一旦信任這個儲存庫，VS Code 就會自己執行裡面的任務設定（[Microsoft，2026 年 3 月](https://www.microsoft.com/en-us/security/blog/2026/03/11/contagious-interview-malware-delivered-through-fake-developer-job-interviews/)）。
- Socket 統計到，自 2025 年 1 月以來與這個行動有關的惡意套件 **超過 1,700 個**，分布在 npm、PyPI、Go、crates.io 和 Packagist（[Socket，2026 年 4 月](https://socket.dev/blog/contagious-interview-campaign-spreads-across-5-ecosystems)）。
- GlassWorm 擴充功能把程式碼藏在看不見的 Unicode 字元裡，被發現之前已經被安裝了約 **35,800 次**（[Koi Security，2025 年 10 月](https://web.archive.org/web/20260101202601/https://www.koi.ai/blog/glassworm-first-self-propagating-worm-using-invisible-code-hits-openvsx-marketplace)）。
- Sonatype 在一個季度裡就記錄到 **16,279 個新的開源惡意套件**，累計 845,204 個（[Sonatype，2025 年第二季](https://www.sonatype.com/press-releases/q2-2025-open-source-malware-index)）。

## 執行招募方傳來的專案之前

1. 先別用編輯器打開。受信任的資料夾，打開時就可能自動執行 `.vscode/tasks.json`。
2. 看 `package.json`：有沒有 `preinstall`、`postinstall` 腳本，有沒有沒聽過的、上週才發布的相依套件。
3. 找找不該出現在面試題裡的程式碼：寫死的 IP 位址、對下載內容 `eval`、讀取瀏覽器設定檔、錢包或鑰匙圈。
4. 聊天裡傳來的 `curl … | bash`，沒看過腳本內容之前不要貼進終端機。
5. 如果已經執行過，就當電腦已經中招：先排查痕跡，再用一台乾淨的裝置更換密碼、權杖和金鑰。

Tsuba 會在關鍵時刻替你做前 4 步，第 5 步交給它的「健檢」。

## 它檢查什麼

| 入口 | 例子 | Tsuba 看什麼 |
| --- | --- | --- |
| 終端機指令 | `curl … \| bash`、`npm install`、`npx`、`npm start`、`git clone` | 遠端腳本只下載不執行；npm 套件查惡意套件名單、發布時間和安裝腳本；掃描專案裡有沒有藏起來的程式碼、寫死的伺服器位址，或者偷讀錢包和密碼庫 |
| 貼進終端機 | 網頁要你「把這道指令複製到終端機裡」 | 貼上的那一刻就提醒；經過混淆、直接交給 shell 執行的指令會被標為高風險 |
| 下載資料夾 | 新的 `.dmg`、`.pkg`、`.vsix` 檔案 | 簽署、公證、下載來源和安裝腳本 |
| 編輯器擴充功能 | VS Code、Cursor、Windsurf、VSCodium | 官方惡意擴充功能名單、是否開機自動啟用、是否用不可見字元藏程式碼；高風險擴充功能自動隔離 |
| AI 程式設計工具 | Claude Code、Cursor、Codex 的 MCP 伺服器、技能和 hook | 已知惡意套件、是否從隱藏資料夾啟動、有沒有瞞著使用者的指示 |
| 健檢 | 選單列 → 健檢 | 已知攻擊留下的痕跡、可疑的登入項目 |

拿不準的專案，可以先放進沙箱試跑：用一個放了誘餌的假家目錄，網路請求只記錄、不真正送出，最多執行 60 秒。

![攔下一個假會議軟體的安裝指令：結論、理由和證據，精確到哪一行。](https://oliverz.dev/products/tsuba/2-history.zh.webp?v=81d44900)

![隨時或定期掃描資料夾，有風險的東西移入隔離區。](https://oliverz.dev/products/tsuba/3-scan.zh.webp?v=06edbb3f)

![健檢：查已知攻擊留下的痕跡，順便檢查編輯器擴充功能和 AI 工具。](https://oliverz.dev/products/tsuba/4-doctor.zh.webp?v=c669b756)

## 和其他工具比較

大多數工具只守一個入口。Tsuba 守的是 Mac 上每一次「第一次執行」，可以和下面這些工具搭配使用。

| 工具 | 檢查什麼 | 什麼時候 |
| --- | --- | --- |
| **Tsuba** | 終端機指令、npm 和 npx、複製下來的專案、`.dmg` / `.pkg` / `.vsix`、編輯器擴充功能、MCP 伺服器、skill 和 hook、貼上的指令 | 程式碼第一次執行之前 |
| npq、Socket Firewall、Aikido Safe Chain | npm 的套件（有的也支援 PyPI 等） | 安裝時 |
| mcp-scan 等 MCP 掃描工具 | MCP 伺服器和 AI 代理工具 | 你主動掃描時 |
| LuLu、BlockBlock、KnockKnock（Objective-See） | 對外的網路連線，以及把自己設成登入時啟動的軟體 | 程式碼已經執行之後 |
| 防毒軟體和 XProtect | 已知惡意程式的特徵 | 檔案和已知樣本比對相符時 |

## 它怎麼判斷

先跑離線規則，再搭配每天更新的公開威脅情資，其中包括 [OpenSSF](https://ossf.github.io/malicious-packages/stats/) 收錄的超過 23 萬份惡意 npm 和 PyPI 套件回報。之後可以讓 AI 模型依上下文判斷：Claude 效果最好，也支援其他供應商和本機模型，也可以完全關掉 AI。

送給模型的只有這次判斷需要的證據。程式碼註解會先移除，密鑰永遠不會上傳。設定和檢查紀錄都存放在你 Mac 上的 `~/.tsuba` 裡。

![設定：每道防線各自開關，選擇判斷方式，用不用 AI 都可以。](https://oliverz.dev/products/tsuba/5-settings.zh.webp?v=8320ebf0)

## 取得方式

Tsuba 已經推出，免費，並以 Apache 2.0 授權開源（[GitHub](https://github.com/chihyungchang/Tsuba)）。有兩個版本：M1 及之後的 Mac 選 **Apple 晶片版**，更早的 Mac 選 **Intel 版**。不確定的話：蘋果選單 → 關於這台 Mac → 晶片。

應用程式支援十種語言：English、简体中文、繁體中文、日本語、한국어、Español、Français、Deutsch、Português 和 Русский。介面、通知、終端機檢查、規則說明和 AI 的回答都會跟隨 macOS 的語言，也可以在 **設定 → 外觀** 裡自己選。

Tsuba 還沒有經過 Apple 簽署和公證，所以第一次打開時會被 macOS 擋下。到 **系統設定 → 隱私權與安全性**，點 **強制打開** 就可以了。請不要改用 `xattr` 移除隔離標記：Tsuba 自己就會提醒你小心要求這麼做的安裝檔，它自己也不該例外。

這一步只需要做一次。之後 Tsuba 會自動更新：有新版本時提醒你，而且只有簽章和 App 內建的公鑰相符才會安裝。

想確認下載的 DMG 就是 GitHub 從公開原始碼建置出來的那一個，可以執行 `shasum -a 256 Tsuba_*.dmg`，和 [發布頁面](https://github.com/chihyungchang/Tsuba/releases/latest) 上的 `SHA256SUMS.txt` 比對一下。

## FAQ

### 招募方傳來的專案可以直接執行嗎？

在檢查之前，把它當成不可信的程式碼：假面試裡，測試專案本身就是惡意程式。把資料夾拖進 Tsuba 的視窗，或者在接上 Tsuba 的終端機裡 clone，它會在任何程式碼執行之前檢查相依套件、安裝腳本和 VS Code 任務。如果已經執行過，先跑一次 **健檢**，再看看 [我的經歷](https://oliverz.dev/zh-hant/blog/upwork-contagious-interview)。

### 怎麼在安裝之前檢查一個 npm 套件？

Tsuba 接上終端機後，`npm install` 和 `npx` 執行之前都會先檢查：是否在 OpenSSF 的惡意套件名單上、是不是幾天前才發布、有沒有安裝腳本。npq 這類命令列工具也能針對 npm 做類似的檢查。

### 為什麼 macOS 說無法打開 Tsuba？

Tsuba 還沒有經過 Apple 簽署和公證。第一次打開時，到 **系統設定 → 隱私權與安全性**，點 **強制打開** 就可以了。請不要改用 `xattr` 移除隔離標記：Tsuba 自己就會提醒你小心要求這麼做的安裝檔。想核對下載的檔案，可以對照下方更新日誌裡列出的 SHA-256。

### Tsuba 會上傳我的程式碼嗎？

不會上傳任何檔案。開啟 AI 時，只有這次判斷需要的證據會送到你選的模型，程式碼註解會先移除，密鑰不會送出。關掉 AI 的話，檢查都在你的 Mac 上以離線規則完成。設定和檢查紀錄都存放在 `~/.tsuba` 裡。會送出的每一項，以及何時送出，都列在 [隱私權說明](https://oliverz.dev/zh-hant/products/tsuba/privacy) 裡。

### 需要 AI 訂閱或 API 金鑰嗎？

不需要。離線規則一定先跑，單獨就能用。AI 是選用的：Claude 效果最好，也支援其他供應商和本機模型。

### 它能取代防毒軟體嗎？

不能。辨識已知的惡意程式交給 macOS 內建的 XProtect 和公開的威脅情資。Tsuba 負責的是它們漏掉的部分：每次換一身包裝、沒人見過的程式碼，例如假面試專案、假會議軟體、被投毒的套件和惡意擴充功能，而且在程式碼執行之前就介入。

### 支援哪些 Mac？

macOS 13 以上，Apple 晶片和 Intel 都支援，各有一個下載檔。不確定的話：蘋果選單 → 關於這台 Mac → 晶片。

### 它把正常的東西攔下來了怎麼辦？

每一次提醒和攔截都附上證據：哪個檔案、哪一行、比對到什麼，你可以自己判斷；確認過的提醒可以忽略，信得過的可以加進白名單。也請 [回報這次誤報](#feedback)，每一個誤報都會變成一條回歸測試。
