免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

Ruby 4.0 通用 RCE 反序列化利用链:突破版本限制,深入底层构建

Ruby 4.0 通用 RCE 反序列化利用链:突破版本限制,深入底层构建 引言2026 年 8 月 5 日OpenAI 披露一组正在接受评估的 AI 代理突破沙盒限制取得运行所在集群的管理员控制权部分通过利用 Ruby 反序列化漏洞执行命令。早在 2018 年就发布了首个 Ruby 通用 RCE 反序列化利用链不过仅适用于 Ruby 2.6.10 及以下版本最新公开利用链也仅能在 3.4 - rc 及以下版本使用。本文将发布新的通用利用链能在 Ruby 4.0.6 上把单次 Marshal.load 操作转化为命令执行且无需修改可在 3.3 及以上版本使用结合了新利用点和旧利用点新用法。背景序列化是将对象转换为字节序列的过程这些字节可网络传输、存储在文件系统或数据库重建过程叫反序列化。Ruby 中常用“编组”和“解编组”对应 Marshal.dump 和 Marshal.load 操作。十三年的 Ruby 反序列化历程通用 Ruby 反序列化利用链始于 2018 年基于早期 Ruby on Rails 特定应用利用链研究成果又影响后续特定应用利用链。以下是重要里程碑本文利用链基于部分成果构建2013 年 1 月 10 日 - Hailey Somerville 发布 Rails 3.2.10 远程代码执行2013 年 1 月 31 日 - Hailey Somerville 提交 Ruby 漏洞跟踪问题2016 年 5 月 6 日 - Phenoelit 的 joernchen 发表攻击 Ruby on Rails 应用程序2018 年 11 月 8 日 - Luke Jahnke 发布 Ruby 2.x 通用 RCE 反序列化利用链2019 年 1 月 2 日 - ooooooo_q 报告 CVE - 2019 - 54202019 年 3 月 2 日 - Etienne Stalmans 发表使用 Ruby YAML.load 实现通用 RCE2019 年 6 月 20 日 - Sivathmican Sivakumaran 和 Pengsu Cheng 发表通过 Ruby on Rails Active Storage 不安全反序列化实现远程代码执行2021 年 1 月 7 日 - William Bowling 发布适用于 Ruby 2.x - 3.x 的通用反序列化利用点2021 年 1 月 9 日 - Etienne Stalmans 发表使用 Ruby YAML.load版本 2.7实现通用 RCE2022 年 3 月 28 日 - httpvoid 发布 Ruby 反序列化 - Rails 上的利用点2022 年 4 月 4 日 - William Bowling 发布第二轮适用于 Ruby 2.x - 3.x 的更新版通用反序列化利用点2022 年 5 月 17 日 - Ben Lincoln 发表 Ruby 漏洞利用危险的打开、发送和反序列化操作2024 年 3 月 13 日 - Alex Leahu 发表在 Ruby 领域发现反序列化利用链2024 年 6 月 20 日 - Peter Stöckli 发表通过发送 JSON 执行命令了解 Ruby 项目中不安全反序列化漏洞的原理2024 年 10 月 17 日 - Leonardo Giovannini 提交更新用于 Marshal 加载的 Ruby 利用点2024 年 11 月 24 日 - Luke Jahnke 发布 Ruby 3.4 通用 RCE 反序列化利用链2024 年 12 月 3 日 - Luke Jahnke 发表 Gem::SafeMarshal 逃逸2025 年 8 月 20 日 - Matt Schwager 发表编组疯狂Ruby 反序列化漏洞利用简史2026 年 8 月 5 日 - OpenAI 在 2026 年美国黑帽大会上披露自主 AI 代理在实际场景中利用 RubyJRuby反序列化漏洞2026 年 - Luke Jahnke 发布 Ruby 4.0 通用 RCE 反序列化利用链3.4 利用链失效的原因2024 年末发布的最新公开利用链通过特定有效载荷在 Ruby 3.4 - rc 版本实现命令执行。但发布十天后RubyGems 中提交两个代码更改移除了它依赖的利用点导致该利用链在正式版本失效。第一个提交改进 marshal_load 方法中的类型检查使相关类更难用作利用点第二个提交停止在实例变量中存储可执行文件名称移除相关类作为 ACE 利用点的用法。这两个提交导致 to_s_wrapper 和 exec_gadget 失效但 Gem::SpecFetcher 和 call_url_and_create_folder 未受影响在 Ruby 4.0 中仍可用。构建新的利用链扩展可用的利用点集合利用链以 Gem::SpecFetcher 开头因 Marshal.load 解析该常量会触发 RubyGems 自动加载机制增加可供利用的类集后续利用链依赖 Gem::URI::Generic、Gem::RequestSet::Lockfile 和 Gem::StubSpecification 等类。寻找新的代码执行途径Gem::Specification.load 方法为 exec_gadget 提供替代方案该方法从磁盘读取文件并将内容传递给 eval 函数控制文件名和内容的利用链可实现任意代码执行。调用加载方法现有利用点集合中无灵活利用点但 Gem::StubSpecification 可通过调用 hash 方法间接调用 Gem::Specification.load(loaded_from)loaded_from 可通过反序列化设置。触发 hash 方法调用对象作为 Hash 的键时Ruby 会调用其 hash 方法Marshal.load 重建哈希表时插入键可触发。这种触发方式是语言基本特性交互移除会改变核心数据结构行为。将代码写入文件系统利用链复用 call_url_and_create_folder 将攻击者控制的代码写入磁盘其 URL 下载功能可获取内容并通过目录遍历写入文件系统。触发下载操作3.4 利用链的调用方法因类型检查提交移除Ruby 自身的 Time 反序列化机制提供新调用者time_mload 方法会丢弃异常。Gem::URI::Generic 可将 to_str 调用转换为 to_s 调用。构造托管文件3.4 利用链指向真实 gemspec 文件此次文件需包含 Ruby 代码需先压缩。call_url_and_create_folder 设置相关属性触发目录遍历文件通过 HTTPS 提供解压后保存到 /tmp/quick/Marshal.4.8/name-.gemspec。序列化 Marshal 无法直接转储的 Time 对象利用链中其他利用点可正常序列化但 Time 对象不同。可先序列化替代对象再修补字节。生成流时需注意避免提前触发利用点可暂时覆盖 Gem::StubSpecification 的 hash 方法。生成器给出了生成器代码每个利用点负责写入或执行代码。运行生成器输出最终利用链。有效载荷运行生成器输出的最终利用链使用前需满足两个条件压缩有效载荷由指定主机通过 HTTPS 以 poc - id.rz 文件名提供目标系统可写入 /tmp 目录。目标系统无需其他额外条件。运行测试使用 Docker 镜像 ruby:4.0.6 运行生成的有效载荷id 命令成功执行后续异常可避免可在被评估源代码末尾添加 Gem::Specification 对象。复现过程中被评估源代码会保留在 /tmp/quick/Marshal.4.8/name-.gemspec 文件中。结论新利用链可在 Ruby 4.0.6 上把单次 Marshal.load 操作转化为命令执行无需修改可在 3.3 及以上版本使用只需可访问的 HTTPS 主机和可写目录。大部分内容非从头构建call_url_and_create_folder 用途改变利用点生命周期长。新突破在于深入底层容错调用者和触发机制用 C 语言编写难以移除。建议处理不可信输入时不用 Marshal.load使用仅处理数据的格式代替。
返回列表