SevenTnewS

终端安全

'$HOME'陷阱:AI编程代理需要沙箱,而不是'允许?'提示

Qoder的终端沙箱每天拦截近一百条破坏性代理命令。这些拦截背后的案例解释了为什么'允许?'提示会失效:一个名为$HOME的项目文件夹、一次指向/root的清理操作,以及一次险些毁掉整个磁盘的点击。

Emmanuel Fabrice Omgbwa Yasse AI 辅助

2026-08-13 · 阅读需 7 分钟

'$HOME'陷阱:AI编程代理需要沙箱,而不是'允许?'提示

据该团队自己的数据,每天有100万条终端命令通过Qoder的沙箱运行。其中超过一万条被标记;近一百条触及了不该触及的内容,一行命令就足以毁掉开发者一周的工作。

幻觉可能将项目目录误认为临时文件夹;环境不匹配可能把清理操作引向系统路径。Qoder的文档记录了两类情况,并论证:当代理为你执行命令时,'允许?'提示并不够。

每天百万条命令,近百次险情

案例一是Windows清理操作出了岔子。代理执行了cmd /c "rmdir /s /q "C:\Users\...\SuperMarioGame\src""。意图:文件清理。模型将项目源代码目录视为可丢弃内容,而rmdir /s /q会递归删除且无需确认。这看起来像一次普通的开发操作,而这正是其危险之处。

案例二是环境不匹配,不需要攻击者介入。开发者让代理运行一个包含rm -rf "$OUTPUT/root"的构建清理脚本。在本地,$OUTPUT指向构建产物;当代理执行时,变量尚未加载,$OUTPUT展开为空,命令变成了rm -rf "/root"。沙箱拒绝了这次写入:/root不在工作区白名单中。

'$HOME'陷阱:当'允许?'保护不了任何东西

还有第三个案例,Qoder团队一直将其钉在墙上。一位开发者让AI清理项目根目录中的临时文件。项目中有一个名为$HOME的子目录。模型生成了rm -rf "$HOME":看上去是项目内部的删除操作。但shell一执行,$HOME就展开成了用户真实的主目录。

确认对话框确实出现了。开发者确实点击了确认,以为自己批准的是删除一个项目文件夹。磁盘差点被清空。操作系统无法启动。

这个故事本身就是论点。对话框只能展示用户认为命令的含义;shell执行的则是展开之后命令的真实含义。按钮无法弥合这一差距。黑名单匹配的是字符串,而字符串可以被绕过:cmd /c "rmdir /s /q" 与rm -rf效果相同,看起来却毫无相似之处;而被包装的脚本则完全隐藏了命令名。对话框把决定权交给了一个已经点击过数百次提示、大多时候凭条件反射点击的人。一旦被批准,命令就会以完整的用户权限运行:文件、网络、环境、系统资源。

Cursor、Codex、Claude Code:行业正在超越对话框

Qoder对主流AI编程工具的终端安全进行了调研。终端执行是入场券;沙箱化正在跟上;悬而未决的问题是失败时的回退方案。Cursor通过sandbox.json支持带网络、文件系统和白名单策略的沙箱执行,在macOS和Linux上原生支持,Windows则依赖WSL2。Codex暴露了文件写入、网络和批准方面的操作系统级策略,是一个面向高级用户的CLI优先界面。Claude Code在macOS上使用Seatbelt、在Linux上使用bubblewrap来减少权限提示。

工具隔离机制Windows情况设计重点
Cursor通过sandbox.json实现网络、文件系统和白名单策略需要WSL2macOS和Linux原生支持
Codex针对文件写入、网络和批准的操作系统级策略CLI优先的策略界面高级用户、自动化
Claude CodemacOS上的Seatbelt,Linux上的bubblewrap调研中未详述更少的提示、受限执行
Qodersandbox-exec + Seatbelt、bubblewrap、自定义Rust受限令牌原生支持,自Windows 7起四层流水线加AI Review

要点:权限对话框本身已不再是主要控制手段。工具之间的区别在于平台覆盖范围以及回退到用户确认的流畅程度。Qoder针对每个平台集成了最合适的操作系统级机制,让保护生效而无需用户了解具体实现。

四层过滤,再加一次复核

在执行之前,每条命令都要经过一条流水线:LLM风险评估、多平台解析、沙箱包装、操作系统隔离。LLM在生成时判断意图;三个AST解析器分别处理PowerShell、Bash/Zsh和CMD,将命令分解为结构化的命令名和参数列表。内置列表会标记rm、format、del、rmdir。

在AST层面,黑名单失去了存在的理由。一次提示注入可能让模型生成whoami `rm -rf /`。看上去是whoami;解析器却提取出两个命令名,并捕捉到反引号中的rm。结构化分析能看到字符串匹配看不到的东西。

但"这条命令危险吗?"并不是决定开发者体验的问题。问题在于该如何处理。被标记的命令不一定具有破坏性:删除已提交的、由git跟踪的文件是可恢复的;删除由未解析变量构建的路径则不可恢复。因此Qoder推出了AI Review层,即第二次轻量级模型调用,在两个节点判断后果而非意图。在沙箱入口,它接收仓库的git状态作为自然语言上下文来推理可恢复性;安全意味着沙箱执行,否则弹确认对话框。在权限提升关口,当沙箱执行失败且模型要求以完整权限重新运行时,它会更加保守,只检查工作区之外的系统文件是否会被破坏;允许,否则再弹一个对话框。

两次审查都在低温下运行,返回带有判定和理由的JSON,超时时间为10秒并重试三次。这种不对称是有意为之:开关关闭时,入口默认允许,而权限提升默认阻止;不可达时,一切都被阻止。多弹一个对话框代价很小;漏掉一条破坏性命令则不然。

Windows是最难的部分

在macOS上,Qoder复用sandbox-exec,从默认拒绝的基线生成Seatbelt策略。Git带来了一些边界情况:对临时文件和设备文件的写入访问,以及只读的.git,这样git log和git diff可以工作,而git commit和git push需要权限提升。启动开销为43至72毫秒,在秒级命令上不到5%。Linux使用bubblewrap:根文件系统只读,敏感路径用空的tmpfs覆盖,一条标志即可切断网络。

Windows开箱即用没有等效方案,Qoder称这是项目中最难的部分。团队评估了15种隔离技术,从Hyper-V、Windows Sandbox到AppContainer和Sandboxie;很少有能适配IDE的约束:高调用频率、启动延迟、向后兼容。最终方案是自定义Rust解决方案,自Windows 7起即可运行,启动时间为毫秒级,使用受限令牌让子进程只能写入被授权的路径。AppContainer落选:隔离性更强,但动态授权困难且仅支持Windows 8及以上。两轮测试平均开销为7.7%,集中在进程启动上;PowerShell的spawn运行速度慢约19%,相当于每次调用多出约4.8秒。

沙箱作为代理基础设施

更大的转变在于沙箱的用途。代理过去是生成代码,风险存在于代码审查中。现在它们运行命令、修改文件、调用技能并访问网络,因此IDE必须承担执行安全的责任。Qoder将终端沙箱定位为代理框架的基础设施:让独立开发者少了一次删掉整个项目的机会;对团队而言,则是治理和审计的起点。路线图:用户自定义和按命令的策略覆盖、企业分发、审计日志报告。

阿里巴巴的其他代理工具也指向同一方向。Qoder 1.0放弃了单一工作区的IDE,改用隔离的工作树,让并行任务不再冲突;根据阿里巴巴的A/B数据,其作用域内存引擎将输入token减少了40%。Anolisa v0.3阻止隐藏在外部输入中的恶意指令,在代理生成的代码运行前进行扫描,并对第三方技能进行加密签名。赌注是:编程代理下一轮竞争的关键是流程,而不是原始模型性能。

每天早晨用 3 分钟掌握科技要闻

每个工作日一封邮件,只讲真正重要的 AI 与科技动态。