AndrewXuTurtle/mcpaudit
GitHub: AndrewXuTurtle/mcpaudit
一款零依赖的 MCP 服务器安全审计工具,通过静态分析检测工具投毒、凭据暴露和供应链风险,扫描过程不执行任何代码。
Stars: 0 | Forks: 0
# mcpaudit
**在他们审查你之前,先审查你的 MCP 服务器。**
你安装的每一个 MCP 服务器都在你的机器上运行,并掌握着你提供给它的凭据。大多数人有五六个这样的服务器,却从未阅读过它们的任何一行源代码。这个工具替你阅读。
零依赖。不安装任何东西,不执行任何东西。
```
npx github:AndrewXuTurtle/mcpaudit
```
## 它在第一天就发现了一个真实的抢注包
在测试扫描器时,我编造了一个看起来很逼真的假包名作为测试夹具。结果发现它是真实的,并且现在就在 npm 上:
```
@modelcontextprotoco1/server-filesystem ← digit 1, not letter l
@modelcontextprotocol/server-filesystem ← the official package
```
这个冒充包**与官方发布版本 2026.1.14 在字节上完全一致**。`dist/` 中的每个文件都具有与真实文件相同的 SHA-256。整个包中唯一的区别就是其名称中的一个字符:
```
- "name": "@modelcontextprotocol/server-filesystem"
+ "name": "@modelcontextprotoco1/server-filesystem"
```
它还附带了伪造的来源信息 —— `"author": "Anthropic, PBC"`,`homepage: modelcontextprotocol.io`,以及一个指向官方 GitHub 仓库的 `repository` 字段。由 npm 用户 `eliav.livneh` 于 2026-04-13 发布。它不会出现在 npm 搜索结果中。
**目前里面没有恶意代码。** 这正是问题的关键所在。这是“撤资骗局”(rug pull)的设置阶段:发布干净且完全相同的内容,等待安装量积累,然后在后续版本中植入 payload —— 而每个 `npx` 用户和每个未固定版本的配置都会在毫无审查的情况下自动拉取它。
内容扫描器无法捕获这一点。内容中没有任何坏东西;内容*就是*官方代码。只有来源能捕获它。`mcpaudit` 在你运行它之前就将其标记为 `CRITICAL`。
我探测了官方作用域的 790 个同形异义字变体,发现恰好有一个真实的冒充包。一个就足够了。
## 为什么需要另一个扫描器
独立测试表明,YARA 风格的 MCP 扫描器的误报率大约为 **78%**。一个五次中错四次的工具一周内就会被卸载,然后你根本就没有扫描器了。
`mcpaudit` 优化了精确率而不是召回率:
- **每一项发现都引用了其证据。** 确切的环境变量,确切的参数,确切的代码行。
- **发现带有置信度等级。** 低置信度的猜测会被抑制,除非你使用 `--paranoid` 请求它们。
- **检查是上下文感知的。** 文件系统服务器访问文件系统不是一个发现 —— 它的*作用域*才是。标记前者正是导致扫描器被删除的噪音。
- **受信任的发布者会有不同的评分。** 未固定的官方包是 `LOW`。未固定的未知包是 `MEDIUM`。
## 检查内容
| | 检查项 |
|---|---|
| **工具投毒 (Tool poisoning)** | 隐藏在描述中的 Agent 指令;对你不可见但对模型可读的零宽字符和双向字符 |
| **凭据暴露** | 以明文配置存储的可用 API 密钥;当一个进程同时持有多个凭据家族时的爆炸半径 |
| **权限** | 被授予 `/` 或你整个主目录的服务器;启动路径中的 shell |
| **供应链** | 同形异义作用域、抢注、未固定版本、安装钩子、年轻且不受欢迎的包 |
| **传输** | 通过明文 HTTP 的远程服务器;缺少身份验证;硬编码在 headers 中的 token |
| **来源** *(`--deep`)* | 环境扫描、对 `~/.ssh` 和 `~/.aws` 的引用、运行时获取的代码执行、混淆的 blob |
## 用法
```
npx github:AndrewXuTurtle/mcpaudit # scan every MCP config on this machine
npx github:AndrewXuTurtle/mcpaudit --deep # also download and read each package source
npx github:AndrewXuTurtle/mcpaudit --paranoid # include lower-confidence findings
npx github:AndrewXuTurtle/mcpaudit --markdown -o audit.md
npx github:AndrewXuTurtle/mcpaudit --fail-on critical # for CI
```
会自动发现 Claude Desktop、Claude Code、Cursor、Windsurf、VS Code 的配置,以及工作目录中的任何 `.mcp.json`。传入一个路径以扫描特定文件。
**退出代码** —— `0` 表示干净,`1` 表示存在达到或高于 `--fail-on` 阈值(默认为 `high`)的发现,`2` 表示扫描本身失败。
### 在 CI 中
```
- run: npx github:AndrewXuTurtle/mcpaudit .mcp.json --fail-on critical
```
## 设计说明
**零运行时依赖。** 一个引入了四十个传递依赖项的安全扫描器本身就是一种供应链风险。`mcpaudit` 仅使用 Node 标准库 —— 包括一个小型的手写 tar 读取器,因为为了审查依赖项而引入依赖项是一笔不划算的交易。
**不执行任何东西。** `--deep` 从 registry 下载 tarball 并在内存中读取它。服务器永远不会启动,包也永远不会被安装。通过运行一个不受信任的服务器来审查它,这不叫审查。
**绝不打印密钥。** 检测到的凭据会被脱敏,只显示前缀、后缀和长度。
## 报告
发现了一个不该触发却触发的检查?[提交一个 issue](https://github.com/AndrewXuTurtle/mcpaudit/issues),并附上导致该问题的配置(请对你的密钥进行脱敏)。误报被视为与漏报同等严重程度的 bug —— 这正是该工具的全部前提。
## 许可证
MIT
标签:GNU通用公共许可证, MITM代理, Node.js, 云安全监控, 依赖混淆检测, 域名收集, 文档安全, 文档结构分析, 自定义脚本, 配置审计, 静态分析