开发者生态
morning
Ruby 4.0 通用 RCE 反序列化 Gadget 链
2026-08-14
1 阅读
约9分钟阅读
pentestercrab
字号:
简介 2026 年 8 月 5 日,OpenAI 披露,一组接受评估的 AI 代理已突破沙箱,并获得了对其运行的集群的管理控制权。它在一定程度上是通过利用 Ruby 反序列化来执行命令来实现的。这引起了我们的注意,因为在 2018 年,我们发布了第一个适用于 Ruby 的通用 RCE 反序列化 gadget 链,它完全由标准库构建,没有依赖项。该链仅适用于 2.6.10 及以下的 Ruby 版本,而最新的公共链仅适用于 3.4-rc 及以下版本。这篇文章发布了一个新的通用链,它将单个 Marshal.load 转换为 Ruby 4.0.6 上的命令执行,Ruby 4.0.6 是撰写本文时的最新版本,并且可以追溯到 3.3 版本。该链条由来自未开发来源的新设备以及新用途的旧设备构建而成。背景序列化是将对象转换为一系列字节的过程,然后可以通过网络传输这些字节或存储在文件系统或数据库中。这些字节包括重建原始对象所需的所有信息。这个重建过程称为反序列化。每种编程语言通常都有其自己的本机序列化格式,并且可以通过序列化/反序列化以外的名称来引用此过程。对于 Ruby,通常使用术语编组和解组,并且这些操作由 Marshal.dump 和 Marshal.load 提供。 Ruby 反序列化十三年 通用 Ruby 反序列化小工具链于 2018 年开始,建立在针对 Ruby on Rails 的应用程序特定链的早期研究之上,然后该通用工作反馈到随后出现的应用程序特定链中。下面的几个里程碑供应了该链所依赖的部分。 2013 年 1 月 10 日 - Rails 3.2.10 远程代码执行,作者:Hailey Somerville 2013 年 1 月 31 日 - Ruby bug tracker 问题,作者:Hailey Somerville 2016 年 5 月 6 日 - 攻击 Ruby on Rails 应用程序,作者:Phenoelit 的 joernchen 2018 年 11 月 8 日 - Ruby 2.x 通用 RCE 反序列化小工具链,作者:Luke Jahnke (elttam) 2019 年 1 月 2 日 - CVE-2019-5420,作者为 ooooooo_q 2019 年 3 月 2 日 - 使用 Ruby YAML.load 的通用 RCE,作者为 Etienne Stalmans 2019 年 6 月 20 日 - 通过 Ruby on Rails 主动存储不安全反序列化进行远程代码执行,作者为 Sivathmican Sivakumaran 和 Pengsu Cheng(趋势科技安全研究团队) 2021 年 7 月 - William Bowling 的 Ruby 2.x-3.x 通用反序列化小工具 2021 年 1 月 9 日 - Etienne Stalmans 的 Ruby YAML.load 通用 RCE(版本 > 2.7) 2022 年 3 月 28 日 - Ruby 反序列化 - httpvoid 的 Rails 上的小工具 2022 年 4 月 4 日 - 第二轮:更新的通用反序列化William Bowling 的 Ruby 2.x-3.x 小工具 2022 年 5 月 17 日 - Ruby 漏洞:利用危险的打开、发送和反序列化操作 Ben Lincoln (Bishop Fox) 2024 年 3 月 13 日 - Alex Leahu(包括安全)发现 Rubyland 中的反序列化小工具链 2024 年 6 月 20 日 - 通过发送 JSON 执行命令?了解不安全的反序列化漏洞在 Ruby 项目中的工作原理 作者:Peter Stöckli (GitHub) 2024 年 10 月 17 日 - 更新了 Ruby 小工具,用于编组加载,作者:Leonardo Giovannini (Doyensec) 2024 年 11 月 24 日 - Ruby 3.4 通用 RCE 反序列化小工具链,作者:Luke Jahnke 2024 年 12 月 3 日 - Gem::SafeMarshal 逃逸,作者:Luke Jahnke 八月2025 年 2 月 20 日 - Marshal madness:Matt Schwager 的 Ruby 反序列化利用简史(Trail of Bits) 2026 年 8 月 5 日 - OpenAI 在 Black Hat USA 2026 上披露了自主 AI 代理对 Ruby (JRuby) 反序列化的野外利用 2026 - Luke Jahnke 的 Ruby 4.0 通用 RCE 反序列化小工具链(此为帖子)3.4 链如何崩溃最新的公共链于 2024 年末发布,通过以下有效负载在 Ruby 3.4-rc 上实现命令执行:Marshal.dump( [ Gem::SpecFetcher, to_s_wrapper( call_url_and_create_folder( "rubygems.org/quick/Marshal.4.8/bundler-2.2.27.gemspec.rz" ) ), to_s_wrapper(exec_gadget) ] ) 发布十天后,RubyGems 中出现了两次提交,删除了它所依赖的小工具,每一次都引用了该文章作为动机。两者都在 Ruby 3.4.0 中发布,这就是为什么该链针对候选版本但不针对发布版本。第一个提交 62b49465f8 的标题是“改进 marshal_load 方法中的类型检查”,并指出它“使得将这些类用作小工具变得更加困难”。 Gem::Version#marshal_load 已将反序列化值直接传递给构造函数而不进行验证,其中 Gem::Version. Correct?调用 to_s : def marshal_load(array) -initialize array[0] + string = array[0] + raise TypeError, "wrong version string" except string.is_a?(String) + +initialize string end 第二次提交 89ad04db86 的标题是“停止在 ivars 中存储可执行文件名称”,并指出它“删除这些类作为 ACE 小工具的使用”。 Gem::Source::Git 和 Gem::Resolver::GitSet
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱