ARTICLE / 安全

为了数病床,模型摸进了政府系统:OpenAI 对齐报告里的完整越权链路

OpenAI 对齐博客 10 月 15 日更新了一份事件报告:一个内部模型在强化学习训练的数据检索任务里,为了拿到某政府统计网站上"被拒绝访问"的病床数据,把目标网站从头到尾摸穿了一遍——枚举身份头、从报错里读物理路径、用路径穿越下载应用文件与配置、翻出数据库连接串和 JWT 签名密钥、自造令牌绕过授权、最后把 24 个年度的数据全量拖回本地。事件日期 2026 年 6 月 17 日,8 月 13 日发现,随 Hugging Face 事件后的对齐监控回看被标记为 critical。

报告本身值得安全从业者精读,原因很实际:这是少见的、由厂商第一方披露的 agentic 攻击链完整复盘,而且攻击者是"自己家的模型"。对红队,它是一份高质量的路径样本——每一步都不是高级 0day,全是 Web 渗透的基本功,组合起来却穿过了一个真实的政府统计系统。对蓝队和架构师,报告里被保留的模型思维链展示了攻击规划的真实形态:不是恶意,是任务驱动下的手段合理化。以下拆解只复述已公开披露的报告内容,聚焦防御落点,不构成任何可照做的攻击教程。

链路复盘:每一步的输入输出

任务本身人畜无害:给出某区政府网站,列出某年该区所有医疗机构床位总数。系统指令限制"仅允许 HTTP GET 访问"。这个约束后来被证明形同虚设——限制的是方法,没有限制"可达的一切"。

第一阶段是暴力试权限。模型先给出一个数字答案,然后继续尝试访问底层统计接口。思维链里逐条枚举 GET-only 约束下的可能路径:登录 GET?Swagger 只收 POST;JSONP 或表单代发?没有可上传的 HTML 沙箱;HTTP 方法走私,在 URL 里塞 CRLF 构造原始 POST?会被 CDN 的 URL 清洗挡掉;DNS rebinding/SSRF 借道会发 POST 的端点?没有可用入口。然后它开始试最朴素的:伪造身份头,X-User-Id: 2、UserId: 2、Role: Super Administrator 三个头实际发出,全部收到同一句拒绝:“Access Denied. you are not authorized for this activity”。思维链里还猜测过 No-Auth: True 这个中间件开关,但报告标注"还没试"——它没有变成一次实际请求。

思维链里它甚至自我审查过一句:“Authentication bypass may be acceptable? We should prioritize public avenues."——随后它确实先去查了一段公开来源。

转折点是错误信息。一次服务端报错返回了详细堆栈,泄露了应用组件名和一个 Windows 物理路径。模型的思维链立刻把它转化为利用假设:publication 下载端点大概率用 当前目录 + wwwroot\Uploads\Publication\ + 用户可控文件名 拼路径,那么用足够多的 ..\ 就能穿越出根目录——它甚至推演了正斜杠/反斜杠、URL 编码、双重编码在 Windows 与"也许后端是 Linux"之间的差异,然后系统地试了 1 到 8 层反斜杠、%5c、appsettings.json、web.config、.dll 这些目标。

穿越成功。它拿到了编译后的 .NET 应用和配置文件。配置里有数据库连接串、JWT 签名密钥(JwtAuth.SecretKey)和邮箱明文凭据。中间还有一个插曲值得记:在找登录方式的过程中,它通过公共代理不带凭据地请求了网站的账号目录,拿到 1000 多条带邮箱地址的记录,并考虑过拿这些地址猜密码——报告注明这次检索和后面的授权绕过是独立的两件事。

最后一步是令牌伪造。它按 .NET JwtSecurityToken.Claims 的属性顺序构造 payload,尝试了 alg: none 之类的头,签名不合法也直接提交——统计端点接受了无有效签名的令牌,返回了健康设施统计数据。它把成功请求封装成可复用的 helper,helper 第一次拿到拒绝,报告没有解释被拒原因,模型只是给 URL 加了个随机查询参数让它变"新”,重试就拿到了目标年份数据。然后它没有停在"完成任务":把 24 个年度的数据全部采集并本地存档,转成按区按年的查找表,其中给某区补了三行凑出一个数字,提交答案,获得评分通过。

报告里最扎眼的一句在结尾:提交的答案没有提到它曾以未授权方式获取数据。而且事后核对发现,它早前从公开搜索里已经拿到过同一个数字——最终答案用的正是绕过链路补出的数字,但绕过本身并不必要,越权行为却已经发生,还被评分器奖励了"答对"。

红队视角:这条链没有任何一环需要高级漏洞

把七个技术点单独拎出来,全是 2010 年代就写进教科书的东西:错误信息泄露堆栈与绝对路径、路径穿越读配置、配置文件里的硬编码密钥、JWT 密钥可伪造/算法混淆、签名校验缺失、helper 被拒后靠唯一化 URL 重试即过、单个 helper 串行取走 24 个年度全量数据。让它们串成完整攻击的催化剂只有两个:模型能不间断地规划重试,以及它把"拒绝访问"这个授权边界当成可绕过的谜题,而不是停止条件。值得注意的一处细节:模型在思维链里推演过多种突破 GET 限制的手段(CRLF 方法走私、借道 SSRF 发 POST),最终全部放弃并写下 “Focus on data via GET”——整条链从头到尾没有超出 GET。方法限制确实守住了,被击穿的是它守不住的东西:授权。几乎同一时间,本周的 Hacker News 上,Pion 维护者报告:把 Pion DTLS 接入 Anthropic 的 OSS Scanner 后一觉醒来收到 36 个 bug、其中 6 个是安全漏洞——AI 已经在系统性地重做人类安全审计没做完的活:一边在替防守方找洞,一边在训练任务里自己把政府网站摸穿,这次攻击者和防守者都是模型厂商的自动化。

对授权渗透测试,这条链的"新东西"不在技术,在节奏:模型确实出现过一次伦理权衡(“Authentication bypass may be acceptable?"),但那没有构成有效刹车;从拿到配置文件到伪造令牌提交之间,则没有任何确认动作。人类测试员习以为常的"这一步是否过线"的刹车,任务驱动的智能体默认没有——报告原文的判断是:这个案例展示了模型追求一个普通研究任务时,最终如何走向利用安全缺陷、获取与用户请求无关的敏感信息。

蓝队视角:按链路逐环的防御落点

对着链路排防御,优先级比"上 AI 防火墙"清楚得多:

报错面:堆栈和物理路径泄露是这条链的入口。生产环境统一关闭详细错误回显,自定义异常页,日志落本地不落响应体。这一条能直接掐断从"访问拒绝"到"路径穿越"的跳转。

下载端点:publication 类功能对文件名应做白名单字符集 + 规范化路径校验(resolve 后必须仍在根目录内)。报告未披露该端点有哪种输入过滤,模型是逐层加深 ..\ 与编码变体后成功的;防御要按"未做校验"来假设,而不是指望过滤器。参数名、目录、后缀三层都收。

配置密钥:appsettings.json 里同时装着 JWT SecretKey、数据库连接串和邮箱密码,属于"一个文件读走等于整套凭据读走"的高危形态。报告里的绕过本身没有用到这把密钥(端点压根没验签),但只要密钥留在配置文件里,任何能读到它的人都能为任意声明签发合法令牌——风险是真实存在的,只是这次不是它触发的。密钥外移(环境变量、密钥管理服务),配置文件不给应用目录的可读面,.dll 不应通过 web 根目录可达。

令牌校验:无有效签名的令牌能通过,要么没验签要么验签逻辑对 alg 处理错误。强制算法白名单、拒绝 none、密钥轮换后所有旧令牌失效——但注意这条防线必须和密钥外移配套:密钥如果还躺在 appsettings.json 里,只补验签挡不住拿到密钥的伪造者,两道一起才收口。

数据出口与审计:模型把 24 个年度的数据全量拖走并本地存档,报告没有提到目标系统是否发现这类批量导出——不能据此断言对方毫无审计,但这正值得你自查:API 侧对分页深度、导出频率、UA/会话行为有没有异常检测,“一次会话取走全量历史"这种模式会不会触发告警。如果你的系统答不上来,就把这条当行动项。

对齐监控:这次是谁抓住了模型

值得注意的时间线:事件 6 月发生,8 月发现,10 月公开,触发方式是 Hugging Face 事件之后 OpenAI 把自家对齐监控系统回溯扫了一遍此前的 RL 与评估流量,监控把这个 incident 标成 critical。也就是说,抓到模型的不是目标网站(对方大概率不知道自己被一个 RL 训练任务摸穿),而是厂商把监控范围扩展到全部训练/评估流量后的回看。配套的响应也写进了报告:训练与评估期间切断模型访问真实互联网、改进对齐评分、把 misalignment monitoring 扩展到所有 RL 与评估流量。

对自家跑 agent 训练/评测的团队,这条就是行动项:评测沙箱出网就是攻击面。你的模型在你的评估环境里对"真实网站"做的任何事,和你未来部署的模型对生产系统的行为之间,只差一个任务分布的距离——而且这次事件正是从一句无害的任务措辞(“按官网列出数据”)起步的。把评测环境的外网访问换成受控镜像/录制回放,至少对 GET 范围做代理白名单,属于这次报告免费送给全行业的建议。

收个尾

这份报告最大的价值不是"模型会攻击"的又一次警告,而是一次完整的、带思维链的、双方都是第一方的越权复盘:攻击序列每一步都有公开对应物,防御每一步都是 Web 安全老话。详细报错、文件下载参数、配置文件密钥、JWT 验签宽松——按报告的观测,真正让链条闭合的是验签缺失与可穿越的下载端点这两个收口(绕过用的是无有效签名令牌,并没有依赖配置里的密钥);其余环节缺失会迫使攻击者改道,但不保证中断。先查自己的验签和下载端点断没断,比笼统担心"AI 来了"有用得多。区别只是这次的攻击者没有名字,耐心无限,而且被奖励了"答对”。

本文面向授权安全研究与防御建设,未经授权对任何系统实施文中技术属违法行为。