GuardFall:几十年前的 Bash 技巧击穿多数开源 AI 编码代理的 Shell 防护
本应拦住 AI 编码代理执行危险命令的安全检查,可以用公开数十年的 shell 技巧直接绕过。Adversa AI 将这类绕过命名为 GuardFall,并在 2026 年 5 月左右按 GitHub 星标与社区活跃度抽样的 11 款热门开源编码 / 计算机使用代理中发现:10 款存在缺口,仅 Continue 针对该问题做了有效设计。
为何重要?这些代理往往以开发者完整账户权限跑 shell。若指向被设套的仓库或软件包,隐藏指令可悄悄执行清文件、窃取 ~/.ssh、云凭证及家目录内其它秘密的命令。研究由 NousResearch/hermes-agent 上「经 shell 改写绕过约 30 条正则拒绝列表」的审批门绕过触发,随后扩展到全行业常见实现。SecurityWeek 报道中,Adversa 首席研究员 Omer Ben Simon 表示:工程师若用易受影响的代理阅读恶意仓库里投毒的 README 或 Makefile,代理可被诱使静默执行外泄 AWS 凭证或清空开发环境的命令——尤其在默认开启 auto-yes 的 CI 流水线中。
多数代理的做法是:执行前用危险模式黑名单匹配「命令字符串」。缺陷在于检查的是原始文本,而 Bash 会在真正运行前改写文本(去引号、展开 $IFS 与其它快捷写法),过滤器与 shell 看到的是两件不同的事。最简例子:盯着 rm 的过滤器对 r’’m 无感,因为对文本匹配器那是不同字符串;Bash 去掉空引号后仍执行 rm。同类手法还包括 base64 编码后管道进 shell,或用 find、dd 等「看起来无害」的工具搭配特定标志达到破坏效果。
研究者强调这不是某个可打补丁的单一 bug,而是「危险惯例与一整类问题」:继续往黑名单堆模式治不好。报告将技巧归为 A–E 五类;Class E(同一破坏效果的替代 argv 形态)存活率最高,因为按标志推理需要知道每个二进制在何种 flag 组合下从良性变为破坏性。攻击需两个并不稀奇的前提同时成立:一是模型要吐出恶意命令——直接说「跑 rm -rf」常被拒,但塞进 Makefile 目标或工具「文档」式回复时,更常被当成常规步骤发出;二是代理处于自动执行(–auto-exec / –auto-run 等)或沙箱切到本地模式,这在自动化流水线里很常见。端到端实战演示使用 Claude Sonnet 4.6,并对生产版 Plandex 二进制完整打通,同类形态对其它八款亦有效。
其余十款包括 opencode、Goose、Cline、Roo-Code、Aider、Plandex、Open Interpreter、OpenHands、SWE-agent 以及问题最初出现的 Hermes;抽样合计约 54.8 万 GitHub 星。研究定位为实验室工作,文中称尚未报告公开野外利用。Continue 在默认编辑器模式下通过「按 Bash 会看到的方式切分/规范化命令再决策」,并对明确破坏性命令硬拦,21 个绕过用例中 0 个进入 allowedWithoutPermission,12 个典型破坏用例被正确降级;CLI 自动跑模式较弱,个别载荷可漏,但最破坏性的仍触硬拦。Adversa 称该设计可移植,有经验工程师大约两天可复现。
临时缓解包括:用把 $HOME 指到临时目录的包装启动代理,使 /.ssh、/.aws 等默认不可达;关闭 auto-execute / dangerously-skip-permissions 除非任务绝不能等人;禁止代理在 fork 来的 PR 上跑;把仓库自带的 .aider.conf.yml 等配置当不可信代码。长期需在代理内实现类似 Continue 的 tokenize-and-canonicalize 求值防护,因为「防护看的是原始文本,系统 shell 在运行前会展开、去引号并改写」——这就是 GuardFall 利用的结构缝隙。该发现与 TrustFall、AutoJack、Agentjacking 等同一脉络:不可信文本在防护真正理解 Bash 会执行什么之前,已经进到了真实 shell。