智能体的 harness 才是真正的特权边界 — 而大多数团队都把这条边界划错了位置
Pillar Security 在 2026 年 5 月 26 日的分析指出:harness — Claude Code、Cursor、Codex — 持有智能体永远看不到的密钥、工具与 hook。近期 harness 层的 bug 与 CVE-2026-22708 将这一观点落到了实处。
这是什么?
2026 年 5 月 26 日,Pillar Security 的 Dor Sarig 发表了 Your Agent Harness Has More Privilege Than Your Agent。论点简短而具有承重意义:在现代编程智能体 — Claude Code、Cursor、Codex、Aider、Cline — 中,模型是引擎,而 harness 是整辆车。是 harness 持有 API 密钥、调度工具调用、掌控文件系统权限、写入会话日志,并决定模型在每一轮看到什么。如果你的安全模型把智能体(在循环中的 LLM)当作风险的基本单位,那你就把边界划错了位置。
两个近期且彼此独立的信号让这个论点变得具体。Pillar 在 2026 年 1 月 14 日披露的 Cursor 漏洞(CVE-2026-22708)显示,落在 harness 允许列表之外的 shell 内建命令,使攻击者得以污染环境变量,把一条本应”安全”的 git branch 变成任意代码执行。而 Anthropic 在 4 月 23 日的事故复盘中把 Claude Code 用户感知到的两个月质量下降,归因于 harness 层(而非模型层)的三次变更,其中包括一个静默丢弃推理历史的缓存 bug。杠杆在 harness 里,bug 也在 harness 里。
它是如何运作的
Harness 是把单轮 LLM 变成可执行操作的智能体所需的固定脚手架。它持有若干智能体本身从不直接接触的资源:
组件 是否由 harness 持有? 是否由模型持有?
-------------------------------- ---------------------- ----------------------
API 密钥 / 秘密 是 否
工具实现 是 否(仅描述)
权限分类器 是 否
文件系统访问 是 由工具中转
会话事件日志 是 否
上下文压缩 是 否
System prompt 组装 是 否
Hook(pre / post tool) 是 否
子智能体生成与策略 是 否
Sarig 在文中详述了由此产生的攻击面,引用了 Pillar 自己对 Cursor 的研究,并整合了如今在主要编程 harness 中都能看到的模式。
工具描述是 prompt 注入的入口面。 模型由 harness 在每一轮加载的描述所引导。被污染的描述 — 通过供应链入侵、恶意 MCP 服务器或注册表更新 — 可以悄悄改变工具选择,而日志里通常不会出现”上周二描述变了”这一条。
System prompt 组装会递归扫描文件树。 现代 harness 会向上扫描父目录,寻找 CLAUDE.md、AGENTS.md、.cursor/rules 等文件并将其内容注入。放在树上任意位置的恶意文件最终都会进入 system prompt。这是有意为之的设计,也正因如此,只要智能体面对不可信仓库,这就是一条实打实的攻击路径。
Hook 是最强大也最危险的扩展点。 Pre-tool hook 可以放行、拒绝或改写工具调用。被入侵的 hook 等同于对每一次工具调用进行静默的中间人攻击。Post-tool hook 看到每一个结果。企业级的 harness 应用越来越依赖 hook,这意味着企业级的入侵也越来越可能通过 hook 实现。
上下文压缩是一种有选择的失忆。 当上下文窗口被填满时,harness 会摘要或丢弃较旧的内容。被丢弃的部分 — 包括第 12 轮看到的恶意指令 — 仍然可能在第 47 轮影响智能体的行为,却已无法被审计者检视。压缩策略多数是启发式的,几乎没有被针对对抗输入做过测试。
权限分类器解析的是字符串。 Bash 风格的允许列表通常在分发命令时通过解析来决策:rm 走完全审批,ls 保持只读。可是 find . -delete 呢?别名呢?先 export PAGER="open -a Calculator" 再跑一个被允许的 git branch 呢?最后这一序列正是 CVE-2026-22708 的核心:shell 内建命令完全绕开了 Cursor 的允许列表,prompt 注入借此污染环境,使被允许的命令变成漏洞利用。
子智能体可能绕开父级策略。 子智能体拥有自己的工具列表和权限。如果父级 harness 在生成边界两侧没有一致地执行策略,能够影响子智能体生成的攻击者就可以借助子级完成父级被禁止的动作。
会话日志是本地的秘密存储。 仅追加的事件日志是所有现代 harness 的持久化故事。它们同时也是上下文中流过的每一条秘密的完整文字记录,落在开发者磁盘上,通常并未加密。
为什么重要
两类变化值得跟踪。
第一,bug 落在哪里。Anthropic 的事故复盘在这一点上罕见地透明:“Claude 变差了”的用户反馈并非模型回退,而是默认推理强度的变更、一个跨轮累积的缓存淘汰 bug,以及 system prompt 中关于简洁度的一条指令。这三件事都没有触及 API 或推理层,三件事都活在 harness 里。Simon Willison 的评论值得引用:“影响 harness 的这类 bug 异常复杂 — 就算把模型本身的不确定性放到一边,情况也是如此”。对构建者而言,这就是教训。如今需要防范的 bug 范畴,已经包括 harness 的内部状态。
第二,攻击落在哪里。CVE-2026-22708 是教科书式的案例。模型并没有做出什么新花样;真正充当信任锚的是 harness 的允许列表,而它可以被解析器从未分类的 shell 内建命令绕过。Cursor 2.3 的补丁堵上了那一处特定的绕过路径,但 Pillar 的分析说得很清楚:这是类问题。一个用允许列表而非执行隔离来防护的 harness,只要智能体可以被说服去键入有创造性的输入,就会持续被绕过。相邻披露 — 智能体之间的上下文投毒、恶意 AGENTS.md 文件、MCP 工具描述漂移 — 形态完全一致。
防御
把 harness 当作它本来就是的特权边界来对待。具体而言:
-
把 harness 而不仅仅是模型纳入资产清单。 对于生产环境中每一个编程智能体,记录 harness 能够触达的密钥、文件、套接字和工具。这个集合 — 而不是模型名义上的能力 — 才是你的爆炸半径。多数威胁模型停在”LLM 被欺骗”; 你的模型应当继续到”于是 harness 又做了 X”。
-
把 shell 内建命令与参数展开当作安全敏感操作。 CVE-2026-22708 的教训可以推广:任何在”外部命令 vs 内建命令”上做分类的允许列表,都会在内建命令可以改写外部命令所依赖的环境时漏掉特权。审计你自己的权限分类器,看是否存在同一类绕过。
-
从允许列表走向执行隔离。 Pillar 的建议,以及 Cursor 在修复后给出的新指引都指出:允许列表充其量是 best-effort。更稳健的答案是沙箱化执行 — 容器、虚拟机、受限的进程树 — 让”智能体执行了一条命令”永远不等同于”智能体拥有访问开发者主目录的环境权限”。
-
审计动态 system prompt 组装。 如果你的 harness 会向上扫描
CLAUDE.md、AGENTS.md、.cursor/rules或.windsurfrules之类的文件,那么当智能体运行在受攻击者影响的工作区中时,这些文件必须被视为不可信输入。日志中记录被注入了什么。在第一轮前让用户看到注入。 -
审计工具描述与 MCP 注册表。 描述本身就是 prompt 注入的入口面。固定版本。每次更新都对比描述。拒绝静默的注册表变更。你对依赖所做的供应链卫生工作,在这里同样适用。
-
添加独立的校验步骤。 智能体在失败时经常会汇报成功 — 同样的失效模式也覆盖了被攻击者驱动的行为。一个独立于智能体读取轨迹、并且本身不在智能体控制范围内的校验步骤,是对抗”智能体说自己做了 X”与”harness 的工具日志说做了 Y”之间分歧的最便宜的防御。
-
把会话日志当作秘密对待。 静态加密。写入时按已知秘密模式做脱敏。设定保留策略。在共享工作站上,
~/.claude、~/.cursor、~/.codex及其同类目录都应进入你的敏感文件清单。 -
重新校准事件响应。 当编程智能体出问题时,第一个问题现在是”哪个 harness 版本、带哪些 hook、面对哪个工作区”,而不是”哪个模型”。在事件模板中把这些字段补上。
状态
| 项目 | 来源 | 日期 | 备注 |
|---|---|---|---|
| 《Your Agent Harness Has More Privilege Than Your Agent》 | Pillar Security(Dor Sarig) | 2026-05-26 | 概念性文章 — harness 是特权边界 |
| 《The Agent Security Paradox》 / CVE-2026-22708 | Pillar Security(Dan Lisichkin) | 2026-01-14 | Cursor 通过 shell 内建命令绕过允许列表 |
| Cursor 安全公告 GHSA-82wg-qcm4-fp2w | GitHub | 2026-01-14 | 已在 Cursor 2.3 中修复;受影响版本 ≤ 2.2 |
| CVE-2026-22708 (NVD) | NIST | 2026-01-14 | 高危;CWE-15 / CWE-20 / CWE-74 / CWE-77 / CWE-78 / CWE-94 / CWE-269 |
| Claude Code 事故复盘 | Anthropic Engineering | 2026-04-23 | 定位到 harness 层三处 bug;均已在 4 月 20 日 (v2.1.116) 修复 |
| Simon Willison 评论 | simonwillison.net | 2026-04-24 | 对复盘的独立解读 |
可以带走的结论不是某一个 harness 出了问题。而是 harness — Claude Code、Cursor、Codex、Aider、Cline 以及同类 — 已经悄然成为智能体栈中最具特权的组件,安全工作必须随之转移。值得追问的问题,已经不再是”模型安全吗?”或”prompt 安全吗?”。而是:harness 能访问到什么、由谁控制、以及你如何知道它实际做了什么?
Sources
- → https://www.pillar.security/blog/your-agent-harness-has-more-privilege-than-your-agent
- → https://www.pillar.security/blog/the-agent-security-paradox-when-trusted-commands-in-cursor-become-attack-vectors
- → https://github.com/cursor/cursor/security/advisories/GHSA-82wg-qcm4-fp2w
- → https://nvd.nist.gov/vuln/detail/CVE-2026-22708
- → https://www.anthropic.com/engineering/april-23-postmortem
- → https://simonwillison.net/2026/Apr/24/recent-claude-code-quality-reports/