← 返回全部文章
实战指南 · 2026年7月10日 · 8 分钟阅读

GhostApproval 符号链接漏洞讲清楚:恶意仓库如何诱导 AI 编程代理写到工作区外

人还在审批环节里,但环节展示给他的却是错的文件。GhostApproval 把符号链接藏进仓库,让你以为自己批准的是对 project_settings.json 的普通修改,实际写入的却可能是攻击者的 SSH 公钥,并落到你的登录文件里。Cursor、Amazon Q DeveloperGoogle Antigravity 已发布修复;Anthropic 表示它不在 Claude Code 当前威胁模型内。下面拆机制、版本矩阵和应对办法。

2026 年 7 月 8 日,云安全公司 Wiz 披露 GhostApproval:一个带恶意设计的代码仓库,可以诱导 6 个热门 AI 编程代理把攻击者控制的数据写到你打开的文件夹之外。被点名的代理包括 Claude CodeCursorAmazon Q DeveloperWindsurfAugmentGoogle Antigravity。在 Wiz 的演示里,被写进去的是一个 SSH 公钥,目标文件是 ~/.ssh/authorized_keys;如果成功,攻击者就可能拿到对这台机器的持久登录能力。

底层技巧并不新:它利用的是符号链接,一个很老的 Unix 文件系统特性。真正值得警惕的不是“符号链接还能这样用”,而是这些工具用来证明安全性的审批弹窗。它本该让人确认代理要写什么文件;但在这个场景里,弹窗展示的是一个文件,实际落盘的是另一个文件。

这篇文章讲清楚 GhostApproval 做了什么,为什么“认真看审批弹窗”不足以挡住它,哪些代理已经修复,以及如何中立理解 Anthropic 对 Claude Code 不修复的决定。主要来源在文末。

30 秒速览

  1. 它是什么: Wiz 在 2026 年 7 月 8 日披露的一个信任边界缺口。恶意仓库藏入一个符号链接,文件名看起来无害,例如 project_settings.json,实际指向 ~/.ssh/authorized_keys 这样的敏感文件。
  2. 会发生什么: 仓库的 README.md 让代理给 project_settings.json “加一行”。那一行其实是攻击者的 SSH 公钥。代理沿着符号链接写入后,密钥就进了真实登录文件,攻击者可能获得持久 SSH 访问。
  3. 审批为什么失效: 审批弹窗只显示 project_settings.json。按 Wiz 的测试,Claude Code 自己的内部推理已经注意到真实目标,但确认框没有告诉开发者。Wiz 把这称为知情同意被绕过
  4. 哪些已经修: 已修复:Cursor(v3.0)、Amazon Q Developer(语言服务器 1.69.0)、Google Antigravity。处理中:AugmentWindsurf。拒绝修复:Anthropic 的 Claude Code(理由是不在当前威胁模型内)。
  5. 你该做什么: 升级已修复的代理;不要把代理指向未经审查的仓库;先查新克隆仓库里的符号链接;处理不可信代码时用沙箱。

攻击实际做了什么

先把 AI 拿掉,这就是一个老式文件系统问题。符号链接是一种会透明跳转到另一路径的文件:你写的是链接,文件系统真正写的是目标。Wiz 构造的仓库里有一个名为 project_settings.json 的符号链接,实际目标是 ~/.ssh/authorized_keys。这个文件保存着哪些公钥可以通过 SSH 登录你的账号。

ln -s ~/.ssh/authorized_keys project_settings.json

接下来才是社会工程部分。仓库的 README.md 会要求助手在初始化时给 project_settings.json “添加一行”;这一行被包装成普通配置值,实际内容是攻击者自己的 SSH 公钥。开发者克隆仓库后,如果让代理“设置工作区”或“按 README.md 执行”,代理会机械地完成这个任务:把那一行追加到 project_settings.json。文件系统随后跟随符号链接,把内容写进 authorized_keys。从那一刻起,攻击者就可能登录这台机器。

Wiz 把这个问题归到两类:符号链接跟随(CWE-61)界面误导(CWE-451)。前者解释了数据为什么会写到目标文件;后者才是 AI 编程代理这里真正的缺口。

为什么“仔细审批”不够

这些代理通常会在写文件前弹出确认框。安全叙事也建立在这里:没有人点同意,就不会写盘。GhostApproval 指出的不是“没有审批”,而是审批弹窗省掉了最关键的信息。

WizClaude Code 的测试,代理的内部推理已经判断出目标是一个指向敏感设置文件的符号链接。可是开发者看到的确认框只是在问,是否要修改 project_settings.json。它没有告诉你,这次写入最终会触达 ~/.ssh/authorized_keys。人还在审批环节里,但环节展示的是错的文件。你可以非常认真地读每个弹窗,仍然批准这次攻击,因为真正危险的信息没有出现在弹窗里:这个文件会重定向到你的 SSH 密钥配置。

在部分代理上,审批甚至更弱。按 Wiz 的说法,Windsurf 会在接受/拒绝按钮出现之前就把文件写入磁盘;这时弹窗更像事后撤销。Amazon Q Developer 同样只给了撤销入口(Undo)。Augment 还可能在没有对话框的情况下静默读取和写入。只要写入发生在同意之前,等你看到提示时,密钥已经进了 authorized_keys

版本矩阵

Wiz 发布前已经把问题报告给 6 家厂商。按 2026 年 7 月 8 日披露时的状态,各家的处理如下:

代理状态修复 / 标识
Cursor已修复v3.0 · CVE-2026-50549(评级 Critical)
Amazon Q Developer已修复语言服务器 1.69.0 · CVE-2026-12958(自动更新)
Google Antigravity已修复已修复 · CVE 待定
Augment处理中2026 年 6 月 24 日确认
Windsurf处理中2026 年 6 月 23 日确认
Anthropic Claude Code拒绝修复“不在我们当前威胁模型内”;关闭为信息性

还有两点需要单独看。第一,AWS 的公告还提到一个独立的 Amazon Q Developer 问题:CVE-2026-12957。在那个问题里,一旦工作区被信任,被投毒的仓库可以自动加载配置文件并运行命令,从而窃取开发者的 AWS 密钥。这提醒我们,“信任这个文件夹”授出的权限,比界面上看起来更大。

第二,Amazon Q Developer 的语言服务器通常会自动更新,但如果客户网络配置阻止了更新,就不会自动到位。所以隔离网络、代理受限或企业代理环境里的机器,仍然需要确认版本已经是 1.69.0。

如何理解 Claude Code

Anthropic 是唯一拒绝发布修复的厂商。它给 Wiz 的回应不适合被简化成“不管安全”,也不能被当成“没有问题”。中立的拆法是两层。

Anthropic 的说法是,这个场景“不在我们当前威胁模型内”(原文:“falls outside our current threat model”)。理由是:用户第一次在某个目录里启动 Claude Code 时,必须先确认自己信任这个目录;而 Wiz 描述的场景里,用户是在一个包含恶意符号链接的目录内,再次明确确认了权限提示。Anthropic 因此把报告关闭为“信息性”(原文:“informative”)。

这个论点内部是自洽的:Claude Code 在开始工作前要求用户确认信任目录;从 Anthropic 的口径看,打开恶意仓库本身已经是用户做出的信任决定。而且 Claude Code 也不是完全没有防线。它早在 v2.1.32(2026 年 2 月 5 日) 就加入过符号链接告警,比这次报告早几个月。因此,不能把它说成“Claude Code 独有地疏忽”。

但这也不等于“没什么可修”。Wiz 的发现很窄、很具体:在写入发生的那一刻,Claude Code 的审批界面显示了错误的文件名,而它自己的内部推理知道真实目标。“你已经信任目录”回答的是一个问题;“你的同意弹窗有没有准确描述这次操作”是另一个问题。开发者信任一个公开仓库到“可以让代理帮我初始化”,不等于同意让自己的 SSH 登录文件被改写。能把这个差别说清楚的唯一界面,没有说清楚。

6 家厂商里有 3 家把这个缺口当成需要修的漏洞处理。Anthropic 把它归为用户的信任选择。这是关于信任边界放在哪里的真实分歧。你在把 Claude Code 指向陌生代码前,应该知道这个分歧存在。

该怎么做

  • 升级已经修复的代理。 Cursor 升到 v3.0+Amazon Q Developer 的语言服务器升到 1.69.0+,如果你的网络会阻止自动更新就手动确认;Google Antigravity 使用当前版本。
  • 不要把代理直接指向未经审查的仓库。 这条攻击路径需要你在恶意代码目录内运行代理。对陌生仓库里的“按 README.md 执行”“设置工作区”这类请求,尤其要小心。对 Claude CodeWindsurfAugment 这类未修或当时尚未修复的代理,风险更集中。
  • 先查符号链接。 git ls-files -s 会把符号链接标成 mode 120000find . -type l 会列出符号链接。一个看起来像 settings.json 的文件,如果实际指到你的主目录,整条攻击就成立了。
  • 把不可信代码放进沙箱。 用容器、虚拟机或专门的用户账号运行代理,确保它碰不到你真实的 ~/.ssh。这和处理其他“工具写出了项目目录”的问题是同一套卫生习惯。相邻的文件系统信任边界,可以继续看 AI 编程代理会在磁盘上写什么;仓库如何隐形影响代理行为,可以看 CLAUDE.md 攻击面

真正的教训

GhostApproval 不是一个很新奇的利用链。它更像是 1990 年代的文件系统老问题,从 2026 年 AI 编程工具的正门走了进来。新东西在界面层:这些代理拿到了写文件、跑命令、改配置的权限,同时把“人类会确认”作为安全边界。GhostApproval 说明,确认环节的有效性取决于它展示了什么;如果弹窗显示的是错的文件,“用户批准了”这句话就开始失去意义。

这和 Claude Code「中国后门」争议提出的是同一个信任问题,只是方向相反:那次是工具可能从厂商侧在你脚下改变,这次是仓库可能从项目侧把代理带偏。结论不是停止使用编程代理;Claude Code 在很多工作里仍然是很强的代理。结论更朴素:知道你把它跑在什么代码上。

配套阅读

Sources

  1. GhostApproval: A Trust Boundary Gap in AI Coding Assistants — Wiz
  2. GhostApproval Symlink Flaws Could Let Malicious Repos Run Code in AI Coding Agents — The Hacker News
  3. Bug in top AI coding agents shows that Unix-era security headaches never really die — The Register
  4. AI Coding Tools Tricked Into Hacking Developer Machine via Decades-Old Technique — SecurityWeek
  5. GhostApproval Flaw Hits Six Major AI Coding Assistants — Infosecurity Magazine

FAQ

GhostApproval 漏洞是什么? 这是 Wiz 在 2026 年 7 月 8 日披露的一个信任边界缺口,影响 6 个主流 AI 编程代理。恶意仓库放入一个看起来像项目内普通文件的符号链接,例如 project_settings.json,实际指向工作区之外的敏感文件,例如 ~/.ssh/authorized_keys。代理按 README.md 修改它时,会沿着符号链接写到真实目标;审批弹窗却只显示无害文件名。Wiz 把它称为知情同意被绕过:你还在审批环节里,但环节展示的是错的文件。

Claude Code 受影响吗?Anthropic 修复了吗? Claude CodeWiz 认为受影响的 6 个代理之一。Anthropic 拒绝修复,表示该场景“不在我们当前威胁模型内”(原文:“falls outside our current threat model”),因为用户已经确认信任该目录;报告被关闭为“信息性”(原文:“informative”)。同时,Claude Code 已在 v2.1.32(2026 年 2 月 5 日)加入过符号链接告警。Wiz 的具体发现是:它的推理识别了真实目标,但确认框只显示了无害文件。

符号链接攻击具体怎么发生? 攻击者提交一个符号链接,例如 ln -s ~/.ssh/authorized_keys project_settings.json,让文件看起来在项目内,实际解析到敏感目标。README.md 要求代理给 project_settings.json 添加“一行”,这一行其实是攻击者的 SSH 公钥。你让代理“按 README.md 执行”后,密钥会沿着符号链接写进 ~/.ssh/authorized_keys,攻击者就可能获得持久 SSH 访问。这是符号链接跟随(CWE-61)加界面误导(CWE-451)。

哪些代理受影响,哪些已经修复? Wiz 报告的受影响代理包括 Amazon Q DeveloperClaude CodeAugmentCursorGoogle AntigravityWindsurf。披露时已修复的是 Cursor(v3.0,CVE-2026-50549)、Amazon Q Developer(语言服务器 1.69.0,CVE-2026-12958)和 Google Antigravity。处理中的是 AugmentWindsurfClaude Code 被 Anthropic 判定为不在范围内。

我该怎么防范? 升级已经修复的代理:Cursor v3.0+、Amazon Q Developer 语言服务器 1.69.0+、Google Antigravity 当前版本。对未修或不修的代理,不要在未经审查的仓库里运行;警惕陌生代码里的“按 README.md 执行”;先用 git ls-files -s 检查 mode 120000,或用 find . -type l 列出符号链接;处理不可信代码时用容器或沙箱,避免代理触达真实的 ~/.ssh

这篇对你有帮助吗?

相关阅读


文章独立产出 · 编辑政策

继续阅读 →