命令拒绝列表:终端 AI 智能体用错了的防线
俄亥俄州立大学 2026 年 6 月 20 日的一项研究将 1709 份真实智能体命令拒绝列表送入自动绕过检测流水线,发现 69% 至 98.6% 都无法拦截其声称要阻止的操作。
这是什么?
2026 年 6 月 20 日,俄亥俄州立大学的 Chuyang Chen 与 Zhiqiang Lin 发表了 One Goal, Many Commands: Characterizing Denylist Fragility in AI Agents(arXiv 2606.15549)。这是首个对多数终端编码智能体所严重依赖的一项控制机制——命令拒绝列表(denylist),即智能体拒绝执行的 shell 命令清单——所做的系统性研究。
结论毫不含糊。研究者对从 GitHub 收集的 1709 份真实拒绝列表(共 13332 条规则)运行了一条自动化流水线,报告称其中 69.0% 至 98.6% 的拒绝列表是”脆弱的”:它们无法拦截自己明确要拦截的操作。即便是某款广泛使用的智能体默认附带、由其开发者维护的拒绝列表,也会放过那些从另一条路径达到被禁结果的命令。
该结果对应 OWASP Top 10 for Agentic Applications(2026)中”意外代码执行”(ASI05)类别,并成为 Adversa 2026 年 7 月编码智能体安全汇编 的重点条目之一。
工作原理
Claude Code、Codex 等终端智能体通过三列表机制来管控 shell 执行:明显安全的命令进入允许列表(allowlist)自动执行,明显危险的命令进入拒绝列表被直接拒绝,其余一切落入”询问列表”(ask-list),上报给人类或 LLM 裁判审批。
有两个事实使拒绝列表成为该设计的承重构件。其一,拒绝列表中的命令被认定为绝对危险——拒绝理应是无条件的。其二,论文援引的数据显示,用户会批准约 93% 的命令执行请求,因此审批疲劳使询问列表实际退化为一份允许列表。一旦拒绝列表出现漏洞,几乎没有别的东西还在守线。
而它在结构上必然出现漏洞,因为拒绝列表枚举的是字符串,而操作系统提供的是通向同一效果的多条路径。一条封堵某个命令名的规则,对一个能力等价但较冷门的工具无能为力,也管不住一个以某种模式被调用、恰好达到相同结果的合法多用途工具。研究工具 ShellSieve 用 LLM 为每个被拒操作提出候选绕过命令,再在沙箱中执行、检查其留下的副作用来确认——不靠猜测,不产生误报。经统计确认的两个根因正是如此:作者遗漏了自己从未听说过的冷门命令;以及为了保留良性用途而故意将多用途命令排除在列表之外,却没意识到这些命令同时也是绕过手段。
作者还量化了维护陷阱:要补全一份脆弱的拒绝列表、使其真正拦住目标操作,平均需要追加 217 条命令——面对开放式的命令面,这是一场无法取胜的军备竞赛。
为何重要
这不是某个产品的孤立缺陷,而是对一整类控制机制的判断。当团队把智能体接入 shell 时,拒绝列表是最直觉的首选防线,而这份数据恰恰指出它最不可靠。在自主编码智能体的循环中,一份有漏洞的拒绝列表另一侧的操作不是一个警告对话框——而是删除文件、访问凭据、网络外传,或是智能体以用户权限亲手在主机上建立的立足点。
问题随自主性而放大。人类逐条敲命令是个缓慢而审慎的对手;而一个为满足被注入或畸形指令而合成命令的智能体,枚举替代写法的速度远快于任何手工维护的封堵列表的扩张速度。
防御
论文自身的框架已指明方向:不要再把拒绝列表当作主要边界。
- 对任何具有真实影响半径的场景,优先用允许列表而非拒绝列表。 允许列表以”关闭”状态失败——未知命令默认被拒;拒绝列表以”开放”状态失败——未知命令照常执行。对高影响场景,应枚举允许什么,而非禁止什么。
- 在操作系统层执行,而非在字符串层。 检查文本的管控永远落后于 shell 语义。内核与容器层的控制——seccomp、受限挂载、无环境凭据、出站白名单——无论命令如何书写,都能界定任何命令能做什么。
- 隔离智能体的执行面。 临时、隔离、对文件系统与网络最小权限的环境,能把一次拒绝列表绕过从一场沦陷降级为一次可控事件。这正是 2026 年 7 月编码智能体研究所汇聚的方向。
- 不要把人工审批当作后备安全网。 在约 93% 一律批准的情况下,询问列表并非真正的关卡。应把提示保留给真正罕见、真正高风险的操作,使一次提示仍然带有信号。
- 若必须保留拒绝列表,就对抗式地测试它。 本文所述那类自动绕过发现应纳入 CI,从而让拒绝列表的真实覆盖率被度量,而非被假定。
状态
| 项目 | 参考 | 日期 | 备注 |
|---|---|---|---|
| 拒绝列表脆弱性研究 | arXiv 2606.15549 v2 | 2026-06-20 | Chen 与 Lin,俄亥俄州立大学;69.0–98.6% 拒绝列表脆弱 |
| 分析语料 | — | 2026-06 | 1709 份真实拒绝列表,来自 GitHub 的 13332 条规则 |
| 审批疲劳数据 | 论文引用 | 2026 | 约 93% 的命令请求被用户批准 |
| 类别 | OWASP Top 10 for Agentic Apps 2026 | 2026 | ASI05 — 意外代码执行 |
这是一项研究性刻画,而非针对具名产品的已披露漏洞利用,文中也未给出任何可直接复制的绕过 payload。其运营层面的教训与模型、厂商无关:如果一个握有 shell 的智能体的安全,寄托于一份它拒绝执行的命令清单,那么依据这些数据,这份安全在很大程度上只是一种错觉——而修复之道在于隔离与最小权限,而非更长的封堵列表。