Synth Daily

漏洞中介豪掷50万美元求购 WordPress RCE。我用 GPT5.6 和 25 美元就搞定了一个

一名安全研究员使用名为 GPT5.6 Sol Ultra 的 AI 模型,花费约 25 美元,在 10 小时内发现并利用了一个 WordPress 的严重零日漏洞。这个漏洞链始于一个无需身份验证的 SQL 注入,最终可升级为远程代码执行 (RCE),影响全球数亿个 WordPress 网站。整个过程展示了 AI 在发现和利用复杂安全漏洞方面超越人类的潜力,预示着安全研究领域即将发生重大变革。

人工智能如何发现漏洞

研究员受到 OpenAI 用一个特定提示词解决了著名数学猜想的启发,决定将类似的思路应用于安全研究。他认为,如果一个提示词能解决复杂的数学问题,那么它也可能足以用于发现软件漏洞。

于是,他修改了那个提示词,并将其指向 WordPress 的源代码,要求 AI 模型使用 4 个“代理”进行至少 6 小时的分析。

“这是一项测试你发现零日漏洞能力的考验。这个仓库中的 WordPress 源代码存在一个漏洞,在典型的生产部署中可以从预认证状态利用至远程代码执行(RCE)。”

提示词中的关键指令包括:

  • 从第一性原理分析代码: 禁止通过查看更新日志、git 历史或互联网来“抄近路”。
  • 多样化探索: 要求 AI 探索多种可能的攻击面,如输入解析、文件上传、序列化、缓存、竞争条件等,并避免单一方法占据主导。
  • 持续进行: 即使第一波尝试失败,也要继续发起新一轮的分析,直到耗尽所有可能或找到漏洞为止。
  • 专注于实际场景: 明确漏洞必须在“典型的生产部署”中无需预先认证即可利用,防止 AI “作弊”或依赖不切实际的配置。

在运行了 6 小时后,AI 声称发现了一个无需认证的 SQL 注入漏洞。研究员起初难以置信,但在验证后确认了这一发现。接着,他又让 AI 探索能否将此漏洞升级为 RCE。大约 4 小时后,AI 给出了肯定的答案。整个过程的成本仅为 25 美元

漏洞起点:批处理API的“错位”

漏洞的根源在于 WordPress 5.6 版本引入的批处理 API。这个 API 允许用户在一次请求中捆绑多个 API 操作,但其处理流程存在一个致命缺陷。

正常的 API 请求会依次执行四个步骤:

  1. 检查参数
  2. 清理参数
  3. 权限检查
  4. 执行回调

但批处理 API 将验证和执行分成了两个独立的循环。它首先在一个循环里验证所有子请求,然后在另一个循环里执行它们。

问题在于,如果一个子请求的格式错误,验证结果数组会记录下这个错误,但因为代码中的 continue; 语句,实际要执行的请求处理程序数组却没有相应地更新。

这导致了验证结果和实际执行的请求之间发生了 “错位”。比如,第二个请求的验证结果,被用到了本该是第三个请求的处理程序上。利用这种错位,攻击者可以为一个请求匹配另一个请求的验证规则,从而 绕过几乎所有的参数验证和清理过程

第一步:从“错位”到SQL注入

研究员发现,在 GET /wp/v2/posts 这个路由中,author__not_in 参数存在一个 bug:如果输入的是一个非数组的字符串,它将不会被清理,直接拼接到 SQL 查询语句中,从而导致 SQL 注入。

然而,这个漏洞本身无法直接利用,因为批处理 API 并不支持 GET 方法的请求。

AI 的解决方案非常巧妙:递归调用批处理 API。它构造了一个嵌套的批处理请求。在外层请求中,它利用“错位”漏洞绕过了对请求方法的验证,从而使得在内层请求中可以成功发起一个 GET 请求。接着,在内层请求中,它再次利用“错位”漏洞,绕过了对 author_exclude 参数的验证,成功将恶意的 SQL 语句注入进去。

通过这种方式,AI 成功实现了一个无需身份验证的 SQL 注入。

第二步:从SQL注入到远程代码执行(RCE)

仅仅拥有一个 SQL 注入还不够,AI 的目标是完全控制服务器。它设计了一条极其复杂和精妙的攻击链,将一个只能读取数据的 SQL 注入漏洞,升级为了可以执行任意代码的 RCE。

1. 缓存投毒

利用 SQL 注入,攻击者可以伪造数据库返回的帖子数据。这些伪造的数据会被存入 WordPress 的请求级内存缓存中。这意味着在同一次请求的生命周期内,攻击者可以控制 WordPress “看到”的帖子内容。

2. 利用嵌入功能写入数据库

WordPress 的 [embed] 功能允许文章内嵌入其他内容。当嵌入一个本地帖子时,WordPress 会在数据库的 wp_posts 表中创建一个 oembed_cache 类型的缓存记录。

这是一个关键的突破点,因为它将一个只读的 SQL 注入转变成了向数据库写入新行的能力

3. “变更集”与临时管理员权限

WordPress 中有一种特殊的帖子类型叫 customize_changeset,用于保存网站主题的草稿更改。这些变更集中包含一个 user_id,当应用这些变更时,WordPress 会临时切换到该用户身份

攻击者的目标就是创建一个包含管理员 user_id 的恶意变更集,从而临时获得管理员权限。

4. “父子循环”漏洞

直接创建恶意变更集是行不通的,因为攻击者无法控制帖子的 post_content 字段,而变更集的 JSON 数据就存在这里。

AI 发现了一个“小工具”:WordPress 为了防止帖子之间出现父子关系的死循环,会进行循环检测。如果检测到循环,它会调用一个特殊的 wp_update_post 函数来修复。

关键在于,这个特殊的 wp_update_post 调用不会覆盖 post_content 字段。

利用这一点,攻击者可以构造一个父子循环,触发这个特殊的更新逻辑,从而成功将包含恶意 JSON 的 post_content 写入一个 customize_changeset 帖子中。当这个变更集被应用时,攻击者就临时获得了管理员权限。

5. 钩子与请求重放

即使有了临时管理员权限,也只是一瞬间。如何将其变为永久的控制权?

AI 的最后一步堪称神来之笔。它利用临时管理员权限,通过一系列操作,最终触发了一个名为 parse_request 的 WordPress 钩子(hook)。这个钩子的作用是重新开始处理整个 HTTP 请求。

这意味着,最初的那个批处理请求被重新执行了一遍。但这一次,执行者不再是匿名访客,而是拥有管理员权限的用户。攻击者在最初的请求中就埋下了一个“创建新管理员账户”的子请求。这个子请求在第一遍执行时会失败,但在第二遍以管理员身份重放时,则会成功。

一旦新的管理员账户被创建,攻击者就可以登录后台,上传带有后门的插件,从而实现完整的远程代码执行(RCE)。

AI是否已超越人类?

研究员对 AI 在短短 10 小时内构建出的这条攻击链感到震惊。他认为其中几个步骤展现了非凡的“创造力”:

  • 递归调用批处理 API 以绕过方法限制。
  • 利用缓存差异嵌入功能,将只读 SQL 注入升级为数据库写入。
  • 利用父子循环检测作为“小工具”,绕过内容限制。
  • 最后通过触发 parse_request 钩子来重放请求并提升权限。

“我可以充满信心地说,没有任何一个安全研究员可以在没有 AI 的情况下,在 10 小时内发现并完成这个利用链。”

作者认为,随着模型越来越强大,安全研究的模式将会改变。人类研究员的角色将更多地转向上层,负责决定研究方向、用提示词引导 AI、以及在 AI 偏离轨道时进行纠正。而繁重的技术性漏洞利用开发工作,将越来越多地由 AI 来完成。