当智能体执行自己生成的代码:PraisonAI 的 CodeAgent 把提示注入变成 RCE
2026 年 7 月 11 日披露的 PraisonAI 最高危漏洞,会执行 LLM 生成的 Python,却没有 AST 校验、导入限制或沙箱——一个精心构造的提示即可在主机上运行任意代码。
这是什么?
2026 年 7 月 11 日,一个最高危的远程代码执行漏洞针对 PraisonAI 被公开披露。PraisonAI 是一个流行的开源多智能体编排框架,漏洞出在其 CodeAgent 组件上——该组件的设计初衷正是让 LLM 编写 Python 并随后执行它。在 1.6.78 之前的所有版本中,这段代码在运行时毫无防护:没有语法树检查,没有对可导入模块的限制,也没有隔离进程的沙箱。该漏洞在 CVSS 4.0 上被评为 10.0(严重),归类为代码注入(CWE-94),属于那种能把普通提示变成主机上一个 shell 的发现。
它也是我们反复讨论的一类问题的典型范例:一旦智能体框架能够执行模型所生成的内容,提示注入就不再只是内容问题,而变成了代码执行问题。本文是对一个已公开披露且已修复问题的防御性解读,而非利用指南。
工作原理
CodeAgent 的设计很简单,问题恰恰就出在这里。一个任务被交给智能体,LLM 生成一段它认为能解决该任务的 Python,框架随即执行这段代码以获取结果。危险之处在于执行步骤,即 _execute_python() 例程。
任务 / 提示 ──▶ LLM 生成 Python ──▶ _execute_python() ──▶ 在主机上运行
(攻击者可引导 │
这段内容) └── 无 AST 检查
└── 无导入白名单
└── 无沙箱 / 隔离
由于生成的字符串被原封不动地交给一个运行中的解释器,只要模型能被诱导写出什么,主机就会运行什么——并以 PraisonAI 进程的权限执行。而且攻击者无需直接访问解释器。引导发生在更上一层,即提示层面:智能体所摄入的任何不可信文本(检索到的文档、工具返回结果、网页、用户消息)都可能促使模型生成读取环境变量、打开网络连接或触碰文件系统的 Python。披露将其具体影响描述为窃取全部环境机密并在主机上执行任意命令。
严重性向量道出了其余的一切:可经网络触达、复杂度低、无需权限也无需用户交互(AV:N/AC:L/PR:N/UI:N),且对机密性、完整性和可用性均为高影响。该公告未附带任何公开的概念验证,在发布之时也未被报告为在野利用(EPSS 约 0.5%)。CVE 的保留日期为 2026 年 7 月 9 日,随后于 2026 年 7 月 11 日公开发布。
为何重要
人们的第一反应可能是把它归入”又一个框架里的又一个 RCE”。这低估了它的意义。CodeAgent 这类组件——一个编写代码的 LLM,加上一个执行它的运行时——如今已是整个智能体生态的标准构件,被作为让智能体”干真活”的功能来推销。每一个这样的组件都继承了同样的结构性暴露:执行器信任模型,模型信任它的输入。破坏输入,你就破坏了主机。
有两个特性让它比经典注入漏洞更糟。首先,攻击面是语义的,而非语法的。没有单一的恶意字符串可供拉入黑名单;攻击者只需让模型生成危险但合法的 Python,而表达这一请求的方式几乎是无穷的。其次,智能体在设计上越来越多地连接不可信内容——检索语料、工具输出、抓取的页面——因此到达模型的”提示”很少是由可信人类输入的。这正是致命三要素(私有数据、不可信内容、代码执行/网络出口)被压缩进单一进程的情形。
对任何运行 PraisonAI 的人来说,现实利害立竿见影:一个暴露在网络上、或被信任边界之外的文档所喂养的自托管实例,在升级之前都应被视为可远程执行代码。对其他所有人而言,这是一次提醒,去审计你技术栈中是否有任何智能体在执行由模型编写的代码,以及是在何种约束下执行的。
防御
厂商补丁是第一步;其余的是即便下一个 CodeAgent 形态的功能上线也依然成立的架构。
- 升级到 PraisonAI 1.6.78 或更高版本。 这是该漏洞的官方修复方案。在依赖清单中锁定版本,并重建任何捆绑了旧版本的容器镜像。
- 切勿在主机上运行模型生成的代码。 若某个智能体必须执行代码,请在一次性、禁网的沙箱中执行——锁定的容器、gVisor/microVM,或专用的代码解释器服务——采用只读根文件系统、不挂载任何机密、出站流量默认拒绝。代码注入的爆炸半径由代码在哪里运行决定,而非由它如何被生成决定。
- 不要把机密放进执行环境。 环境变量是这类漏洞中最先被窃取的东西。通过沙箱无法触达的代理,在最后一刻注入凭据,让被攻陷的解释器无物可偷。
- 约束解释器所能表达的内容。 在你掌控执行器的地方,运行任何代码前先施加 AST 白名单和导入白名单,并拒绝触及
os、subprocess、socket、动态导入或反射的代码。这是缓解而非壁垒——应作为沙箱之后的纵深防御,而非替代它。 - 将一切非人类输入视为敌意的。 检索到的文档、工具响应和抓取的页面都可被攻击者控制。标注它们的来源,并禁止经由这些渠道到达的内容影响任何代码执行步骤。记录智能体所执行的确切代码,并对网络或文件系统调用发出告警。
- 盘点你的智能体。 对你部署的每个智能体框架自问:它是否执行由模型编写的代码、shell 命令或 SQL?若是,这种执行发生在哪里、能触及什么、其身份为何?PraisonAI 并非孤例——这是智能体框架中提示注入通往 RCE 的反复出现的失效模式。
Status
| 项目 | 参考 | 日期 | 备注 |
|---|---|---|---|
| CVE 保留 | VulnCheck(CNA) | 2026-07-09 | 分配给 PraisonAI CodeAgent 代码执行漏洞 |
| 公告发布 | NVD / GitHub 安全公告 GHSA-2xv2-w8cq-5gxw | 2026-07-11 | CVSS 4.0 基础分 10.0,CWE-94 |
| 受影响版本 | GitHub 公告 | — | 1.6.78 之前的 PraisonAI(praisonaiagents) |
| 修复版本 | GitHub 公告 | 2026-07 | 1.6.78 及更高版本 |
| 在野利用 | OffSeq / NVD | 2026-07-11 | 发布时未观察到;EPSS ≈ 0.5% |
| 参考 CVE | NVD | 2026-07-11 | CVE-2026-61447 |
这个教训并不局限于某一个框架。每当你让语言模型编写代码然后执行它,你就把提示注入从”模型说了坏话”推进到了”模型做了坏事”。持久的防御在于:假定注入终将得逞,并确保它所生成的代码运行在无法伤害你的地方。