ARTICLE · 1135906
让 AI 写代码的命令行工具替黑客「偷家」,只需要一个加密网页

安全公司 Adversa AI 最近演示了一个针对 GitHub Copilot CLI 的攻击:构造一个加密网页,让智能体在自己的 shell 里解密并执行其中的指令,进入自动驾驶模式后,它会在 28 秒内读走本地 .env.prod 这类敏感文件,并发送到攻击者的服务器。整个过程不需要任何漏洞,Copilot CLI 按设计工作到最后一秒。
演示一经披露就在开发者社区刷了屏。很多人第一反应是「赶紧关掉 autopilot」,但这则案例真正值得展开的,是它揭示的一个结构性问题:我们给智能体的「读网页」和「执行指令」两个能力,正在被同一条数据流串起来。
先看清楚流程。Copilot CLI 这类编程智能体有个常见工作流:读取网页、拉取文档、执行命令,全程在本地终端里进行。Adversa AI 的「加密上下文注入」(Cryptographic Context Injection)正是卡在这个流程上:
第一步,攻击者准备好一个网页,页面里的载荷是密文。第二步,智能体抓取这个页面——密文对它来说只是一段待处理的内容,过滤器看不出任何恶意指令,因为它确实不是明文指令。第三步,关键的一跳:智能体在 shell 里解密了这段密文——可能是任务需要,可能是提示词诱导——解出来的明文此刻成了「本地产生的内容」,被它当成了可信指令继续执行。第四步,顺着这些指令,它读取 .env.prod 等本地敏感文件,把内容发往攻击者的端点。全程 28 秒。
妙就妙在第二步和第三步的衔接。传统的提示注入防御主要扫描「进来的内容」里有没有恶意指令,密文在进来的那一刻什么都不是;等它变成指令时,它已经被打上了「我在自己终端里生成的」标签。防御的扫描窗口,被加密这一招干净地绕开了。
有读者可能会说:谁会给编程智能体连陌生网页的权限?问题在于,读网页恰恰是这类工具的核心场景——查报错、找文档、看 issue,哪一样都要访问互联网。你没法关掉联网,就像你没法让程序员不上网。
另一个被低估的风险是「自动驾驶模式」。为了让智能体少打断你,各家工具都在推自动执行:连续跑命令、自动确认。这在可信环境里是效率利器,可一旦上面那条注入链走通,自动执行就意味着攻击者的指令不需要你在场确认。演示里的 28 秒,读文件加外传一气呵成,恰恰说明它就是为「没人盯着」的场景准备的。
还有一个心理层面的盲区:开发者对 .env.prod 这类文件的警惕性,通常远低于对代码本身的警惕性。数据库密码、第三方 API 密钥、支付凭据——全在环境变量文件里躺着,而智能体的本地权限往往足以读到它们。
单靠一层防线挡不住这种攻击,得上纵深。
第一层,隔离数据与指令。智能体读回的任何外部内容,只该当数据,永远不该当指令——听起来简单,实现上要求工具在架构上区分「内容通道」和「命令通道」,而不是都往同一个上下文里塞。当前多数工具还没做到。
第二层,管住解密和执行。shell 里跑的每个命令都过一遍白名单或沙箱:读取 .env*、向陌生域名发请求这类高敏操作,无论如何都该弹人确认。这是最实用的一层,代价是牺牲一些「自动驾驶」的爽感。
第三层,收紧出口。就算前两层都失守,出站流量的目标白名单和量级告警还能兜底——28 秒的外传,在出口日志上会是一条非常扎眼的记录。
一句话总结:智能体的效率来自「读一切、做一切」,安全的要求恰恰是「读之前分级、做之前分级」。这对矛盾没有一劳永逸的解法,只能靠分层把每一跳的风险都摊在阳光下。
一,检查你用的 CLI 智能体有没有自动执行档,高敏环境(有生产密钥的机器)建议全程手动确认。
二,把密钥从工作目录挪出去——密钥管理服务、系统级凭据管理器都行,让智能体「看得见代码、够不着钥匙」。
三,升级到最新版并关注官方的缓解指引,这类攻击的防御措施正在快速迭代。
你的 AI 编程工具开着自动执行吗?评论区聊聊你的配置。觉得有用,转发给团队里管密钥的那个人。
参考文章
#GitHubCopilot #AI安全 #提示注入 #编程智能体 #开发者安全