跳到主要内容
← writing

writing

攻破 agent 的不是模型,是一个没人看的 HTTP 端点

这周被 CISA 列入在野利用清单的 LiteLLM 漏洞,不是模型越狱,是一个会执行你 HTTP 请求里 command 字段的端点。整个 agent 圈盯着栈顶比模型,破口却在最没人看的那层水管。

这周安全圈在传一条新闻:6 月 8 日,美国 CISA(网络安全和基础设施安全局)把一个叫 CVE-2026-42271 的漏洞加进了「已知被利用漏洞」清单——意思是,这个洞已经有人在真实攻击里用了,不是纸上谈兵。出事的不是哪个大模型越狱了,也不是哪个 agent 失控删了库。出事的是一个你大概率没听过、却几乎跑在每个 agent 系统底下的东西:LiteLLM。

LiteLLM 是个统一网关(unified gateway——你写一行代码就能在 GPT、Claude、各种开源模型之间随便切,不用改业务逻辑)。正因为方便,它成了 agent 生态的默认水管:CrewAI、DSPy 这些框架,背后调模型很多都走它。一个库,替几十个框架转发请求。

漏洞在哪?在它一个 MCP(Model Context Protocol——让 agent 调用外部工具和服务的新标准)的「预览」功能里。具体说,两个 HTTP 端点 POST /mcp-rest/test/connection 和 POST /mcp-rest/test/tools/list,本来是让你在保存一个 MCP server 之前先试连一下。问题是:它们接收完整的服务器配置,包括 command、args、env 三个字段——然后真的把你传进来的 command 当子进程跑起来,权限就是这个代理进程的权限。

换句话说,这是一个会执行你 HTTP 请求里那个 command 字段的端点。 这不是被精巧绕过的内存破坏漏洞,这是一个端点设计出来就会跑你给的命令。GitHub 官方公告(GHSA-v4p8-mg3p-g94g)写得很直白:这两个端点「只校验一个有效的代理 API key,不做角色检查」。也就是说,任何拿到一把 key 的人——哪怕是发给内部低权限用户的那种——都能在宿主机上执行任意命令。CVSS 8.7。再跟另一个 Starlette 的 host header 漏洞串起来,研究者直接把它升级成了无需认证的远程代码执行。

我想说的判断是这个:整个 agent 圈的注意力都在栈的顶层,而破口在底层。

我们每天比的是什么?哪个模型分高、哪个 agent 框架更强、哪个 benchmark 又刷新了。这些是栈最上面、最光鲜的几层。可这次把人打穿的,是最下面、最没人看的那层——一个转发请求的代理的「预览」功能。模型再聪明,框架再优雅,都挡不住底下水管上开了个会执行命令的口子。

而这个口子,恰恰是「方便」长出来的。大家用 LiteLLM,是因为它让你一行代码换模型——这是真实的、值得的便利。但便利的另一面是集中:所有人都依赖同一个网关,于是同一个 bug 就成了所有人的 bug。一个库的一个洞,瞬间是几十个框架、无数个部署的洞。你以为你在用一个轻量工具,其实你把整个栈的安全,押在了它身上。

还有一层值得单独说:洞开在一个新加的能力上。 MCP 是去年才热起来的,让 agent 能调外部工具——这是 agent 变强的方向,也是新攻击面长出来的地方。我们给 agent 加能力的速度,远快过审计这些能力的速度。这个端点是个「预览/测试」功能,听上去人畜无害,可它接收 command 字段、还只查「有没有 key」不查「是不是管理员」。认证不等于授权(authentication 是「你是谁」,authorization 是「你能干什么」)——这两件事被当成一件,就是这次的根。

我自己做 agent 系统时,有条习惯:凡是能花钱、能跑命令、能对外动手的动作,门后面站的必须是角色检查,不是一把 API key。key 只证明你进了门,不证明你有资格按这个按钮。这次的修复也正是这么做的——1.83.7 版本把这两个端点改成只有 PROXY_ADMIN 角色能调。一个角色检查,就堵上了 CVSS 8.7。

所以如果你也在拼 agent,给你一句不升华的话:选栈的时候,去看那层最不起眼的依赖。 你的安全等级,不由你最聪明的模型决定,由你最无聊的那个依赖决定。模型会自己变强,水管不会自己变安全——那是你的活。