SymJack:一次被批准的文件复制变成六款 AI 编码助手中的 RCE
Adversa AI 于 2026 年 5 月 26 日披露了一种符号链接劫持模式,只需一次看似无害的 shell 复制命令,就能在 Claude Code、Cursor、Gemini、Antigravity、Copilot、Grok Build 和 Codex CLI 上覆写配置并在主机获得 RCE。
这是什么?
2026 年 5 月 26 日,Adversa AI 的 Rony Utevsky 发表了 SymJack: the approval prompt is lying to you,记录了一种攻击模式可在六款 AI 编码助手的用户主机上实现远程代码执行:Claude Code 2.1.128(在 2.1.129 中部分修补)、Cursor CLI v2026.05.20、Gemini CLI 0.43.0、Antigravity CLI 1.0.2、Copilot CLI 1.0.51、Grok Build CLI 0.1.216 以及 OpenAI Codex CLI v0.133.0(于 5 月 27 日更新中加入)。目前尚未为 SymJack 分配新 CVE,但该家族延续了 Check Point 此前披露的 CVE-2025-59536(2025 年 10 月)以及 Adversa 五月初公布的 TrustFall 模式。
触发条件就是一个动作:打开一个恶意仓库,在看上去像普通文件复制的提示框上点击「批准」。
工作原理
编码助手把文件写入分为两类。原生写入工具(write_file、apply_diff 等)带有路径敏感的护栏:当目标是 MCP 配置、设置文件或 shell rc 时,它们会拒绝或要求额外强提示。Shell 命令(cp、mv、install、tee、重定向)则是通过检查命令字符串本身来过滤——而不是检查在文件系统上的真实效果。
SymJack 正是利用这个差距。Adversa 指出:
「这些指令要求助手使用原始的 shell 复制命令,而不是助手自带的文件写入工具。原生写入工具有护栏,会标记配置文件等敏感路径。一条原始的
cp就能绕过这些检查,因为权限提示框检查的是命令文本,而不是其真实效果。」
批准提示框中显示的目标路径在仓库之内。这个路径是仓库里提交的一个符号链接,指向助手自己的 MCP 配置或设置文件。内核解析链接后,攻击者的内容就直接落在了下次启动时决定助手将拉起哪些 MCP 服务器的那个文件里:
repo/ ~/.config/<agent>/
├── payload.txt ─ cp ─> mcp_servers.json ← symlink 目标
└── docs/destination ─ symlink ─> mcp_servers.json
# 在批准提示框里用户看到的是:
$ cp ./payload.txt ./docs/destination
# 内核解析 symlink 后真实发生的写入是:
# ./payload.txt → ~/.config/<agent>/mcp_servers.json
助手下一次重启时加载被改写的配置,实例化攻击者控制的 MCP 服务器,并以用户的完整权限执行其命令。来自 README.md、隐藏的 AGENTS.md 或 .mcp.json 描述字段的间接 prompt 注入就足以诱使助手率先建议这条恶意的 cp。
为什么重要
这个 bug 的类别是结构性的,不是单点失误:
- 批准提示框的保真度被打破:提示框显示的是参数字符串,内核执行的却是解析后的路径。
- 两条写入路径只配一套策略是错误的默认。被审计的每一款产品在其原生写入工具上的护栏都比 shell 文件操作严格。
- 配置即代码。
mcp_servers.json里的一条 MCP 服务器条目对应一次进程拉起。把它当作数据,同时把 shell 命令当作命令,信任模型就被反转了。
同一模式在 TrustFall、在 CVE-2025-59536、以及现在的 SymJack 横跨六款互不相关的助手中独立反复出现——这强烈说明攻击面在于设计,而非某个实现 bug。
防御
Adversa 的建议原文照录:
- 「在每一条文件写入路径上,包括 shell 命令,在做出任何权限决策之前都先把符号链接解析到真实目标。」
- 「把 shell 上的文件操作(
cp、mv、install、tee、重定向、dd of=)视为一等的写入,接受与原生写入工具相同的路径敏感性检查。」 - 「在批准提示框中向用户显示规范化后的目标,而不是字面参数字符串。」
- 「禁止启用 MCP 执行的敏感配置键由项目范围的文件来设置。」
- 「让启动时被包含的指令文件可见,以便几乎空白的文件中藏匿的指令不能默默运行。」
运营方还应:在未信任的仓库中关闭 shell 文件操作的自动批准;在陌生项目中工作时,把助手的配置目录以只读方式挂载;监控 ~/.config/<agent>/ 和 ~/.<agent>/ 目录的变更,识别非用户主动操作所产生的 diff;并升级到各 CLI 的最新版本(Claude Code ≥ 2.1.129 含部分修复,加固了批准流程,但据 Adversa 所述,并未在 shell 路径上完全解析符号链接)。
状态
| 助手 | 测试版本 | 厂商回应 |
|---|---|---|
| Claude Code | 2.1.128 | 2.1.129 部分加固 |
| Gemini CLI | 0.43.0 | 拒绝 |
| Antigravity CLI | 1.0.2 | (同 Gemini 通道) |
| Cursor CLI | 2026.05.20 | 以重复为由拒绝 |
| Copilot CLI | 1.0.51 | 等待回应 |
| Grok Build CLI | 0.1.216 | 等待回应 |
| Codex CLI | 0.133.0 | Bugcrowd 报告已关闭 |
SymJack 在 GitHub 上有概念验证仓库,并配有按助手分类的演示视频。请将任何运行在你并未亲自编写的仓库中的 AI 编码助手,视为有能力通过一次批准点击在你的主机上达到代码执行——直至批准 UI 显示解析后的真实路径,且 shell 写入路径与原生写入工具走相同的护栏。
Sources
- → https://adversa.ai/blog/the-approval-prompt-is-lying-to-you-symlink-rce-in-five-ai-coding-agents-claude-code-cursor-antigravity-copilot-grok-build/
- → https://research.checkpoint.com/2026/rce-and-api-token-exfiltration-through-claude-code-project-files-cve-2025-59536/
- → https://adversa.ai/blog/trustfall-coding-agent-security-flaw-rce-claude-cursor-gemini-cli-copilot/
- → https://github.com/adversa-ai/research/tree/main/artifacts/symlink-to-rce