Skip to content
macOS · 已上线

Tsuba

陌生代码第一次运行之前,先替你看一眼。

Tsuba icon
类型
macOS
版本
0.1.0
发布于
2026年10月28日
规则包
20 条规则 · 2026.10.27
系统要求
macOS 13+
价格
免费

Tsuba(鍔)是日本刀上护手的那块铁。这个 Tsuba 待在你的菜单栏里,在陌生代码第一次运行的那一刻介入:先弄清楚这段代码要做什么、从哪来、像不像已知的攻击手法,再决定放行、提醒还是拦下。

我做它,是因为在 Upwork 上被假客户盯上了两次。第一次我中招了,XProtect 和杀毒软件都没发现。完整经过在这篇文章里。

24 秒看懂 Tsuba。

主界面:保护状态、需要处理的事,以及每一次检查的实时记录。
主界面:保护状态、需要处理的事,以及每一次检查的实时记录。

为什么杀毒软件拦不住

假面试项目、假会议软件、被投毒的 npm 包、恶意编辑器扩展,每次都换一身包装,用的又都是 node、curl、bash 这些普通工具,传统杀毒软件找不到可疑的地方。所以 Tsuba 不去扫病毒特征,而是守在代码运行的入口。

它检查什么

入口 例子 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 服务、技能和钩子 已知恶意包、是否从隐藏目录启动、有没有瞒着用户的指令
健康检查 菜单栏 → 健康检查 已知攻击留下的痕迹、可疑的开机启动项

拿不准的项目,可以先放进沙箱试跑:用一个放了诱饵的假主目录,网络请求只记录、不真正发出,最多运行 60 秒。

拦下一个假会议软件的安装命令:结论、理由和证据,精确到哪一行。
拦下一个假会议软件的安装命令:结论、理由和证据,精确到哪一行。

按需或定期扫描文件夹,有风险的东西进隔离区。
按需或定期扫描文件夹,有风险的东西进隔离区。

体检:查已知攻击留下的痕迹,顺便检查编辑器扩展和 AI 工具。
体检:查已知攻击留下的痕迹,顺便检查编辑器扩展和 AI 工具。

它怎么判断

先跑离线规则,再配合每天更新的公开威胁情报,其中包括 OpenSSF 收录的约 23 万个已确认的恶意 npm 和 PyPI 包。之后可以让 AI 模型结合上下文判断:Claude 效果最好,也支持其他模型和本地模型,也可以完全关掉 AI。

发给模型的只有这次判断需要的证据。代码注释会先去掉,密钥永远不会上传。配置和检查记录都保存在你 Mac 上的 ~/.tsuba 里。

设置:每道防线单独开关,选择判断方式,用不用 AI 都行。
设置:每道防线单独开关,选择判断方式,用不用 AI 都行。

下载

Tsuba 已经发布,免费,源代码在 GitHub 上。有两个版本:M1 及以后的 Mac 选 Apple 芯片版,更早的 Mac 选 Intel 版。不确定的话:苹果菜单 → 关于本机 → 芯片。

第一个版本还没有经过 Apple 签名和公证,所以第一次打开时会被 macOS 拦下。到 系统设置 → 隐私与安全性,点 仍要打开 就行。请不要改用 xattr 删除隔离标记:Tsuba 自己就会提醒你小心要求这么做的安装包,它自己也不该例外。

想确认下载的 DMG 就是 GitHub 从公开源代码构建出来的那个,可以运行 shasum -a 256 Tsuba_*.dmg,和 发布页 上的 SHA256SUMS.txt 对一下。

试一下

真实的输出,真实的规则

选一个样本,看看应用扫描它时实际打印了什么:只用离线规则,版本 0.1.0。样本来自它的测试集,只模仿真实攻击的形态,本身无害。

$ tsuba scan ~/code/fake_interview_project

Tsuba ✗ 建议拦截  ~/code/fake_interview_project
  证据:
   高 解码后动态执行代码(eval/Function + base64),常见于混淆的投毒代码 [server/server.js] 来源:Tsuba 规则 · Apache-2.0
      eval(Buffer.from("Y29uc29sZS5sb2coImxvY2FsZ3VhcmQgdGVzdCBmaXh0dXJlIik=", "base64").toString()); const C2 = "http://203.0.113.7:1224/api"; app.get('/', (q, r) =>
   高 直接连接硬编码的 IP 地址加端口(C2 服务器的典型特征) [server/server.js]
      eval(Buffer.from("Y29uc29sZS5sb2coImxvY2FsZ3VhcmQgdGVzdCBmaXh0dXJlIik=", "base64").toString()); const C2 = "http://203.0.113.7:1224/api"; app.get('/', (q, r) =>
   高 代码被大量空白推到屏幕右侧之外,人眼看不到(典型的隐藏投毒手法) [server/server.js]
      const app = require("express")(); ⟨400 个空格⟩ eval(Buffer.from("Y29uc29sZS5sb2coImxvY2FsZ3VhcmQgdGVzdCBmaXh0dXJlIik=", "base64").toString()); const C2 = "http://2
更新日志

更新日志

订阅新版本 ↗
文件 · v0.1.0大小SHA-256
SHA256SUMS.txt1 KB—
Tsuba_0.1.0_aarch64.dmg17.5 MB9549a3a2931036d9c032e8da07638e07e4d340cdb8f8101c9fbdf8f1130f75d7
Tsuba_0.1.0_x64.dmg19.7 MB412909f63e2b796e453f46fa0ee7171bdb9edc1f0ebdf0559dbcdab1ffa7e0a2
  1. 0.1.02026年10月28日

    首个公开版本。

    全部改动 ↗
常见问题

常见问题

为什么 macOS 说打不开 Tsuba?

第一个版本还没有经过 Apple 签名和公证。打开 系统设置 → 隐私与安全性,点 仍要打开 就行。请不要改用 xattr 删除隔离标记:Tsuba 自己就会提醒你小心要求这么做的安装包。想核对下载的文件,可以对照下面更新日志里列出的 SHA-256。

Tsuba 会上传我的代码吗?

不会上传任何文件。打开 AI 时,只有这次判断需要的证据会发给你选的模型,代码注释先去掉,密钥不会发出去。关掉 AI 的话,检查都在你的 Mac 上用离线规则完成。配置和检查记录都保存在 ~/.tsuba 里。

需要 AI 订阅或者 API key 吗?

不需要。离线规则总是先跑,单独就能用。AI 是可选的:Claude 效果最好,也支持其他服务商和本地模型。

它能代替杀毒软件吗?

不能。识别已知的恶意软件交给 macOS 自带的 XProtect 和公开的威胁情报。Tsuba 管的是它们漏掉的部分:每次换一身包装、没人见过的代码,比如假面试项目、假会议软件、被投毒的包和恶意扩展,并且在代码运行之前就介入。

支持哪些 Mac?

macOS 13 及以上,Apple 芯片和 Intel 都支持,各有一个下载。不确定的话:苹果菜单 → 关于本机 → 芯片。

它把正常的东西拦了怎么办?

每一次提醒和拦截都附带证据:哪个文件、哪一行、匹配到了什么,你可以自己判断;信得过的可以加进白名单。也请 反馈这次误报,每一个误报都会变成一条回归测试。

反馈

发现 bug,或者漏报、误报?

反馈会公开发到 GitHub Issues。不要贴任何密钥;遇到真实的恶意样本,只发哈希和来源,不要上传文件。

关注我

我会持续分享正在做的项目、实验和经验。

YouTube 上发视频,X 上发短笔记。这里的每篇文章都会链接到两边。

YouTube