通过发送 JSON 执行命令?了解 Ruby 项目中的不安全反序列化漏洞

通过发送 JSON 执行命令?了解 Ruby 项目中的不安全反序列化漏洞

💡 原文英文,约4100词,阅读约需15分钟。
📝

内容提要

本文介绍了如何检测Ruby项目中的不安全反序列化漏洞,并提供了使用Oj JSON序列化库的示例。不安全反序列化漏洞可以通过构建恶意类链来执行任意命令。文章还提到了如何使用CodeQL检测此类漏洞,并提供了一个包含样本利用代码的存储库。最后,文章总结了不同Ruby序列化库中的不安全反序列化漏洞的可疑点。

🔎

延伸解读

触发机制:hash 方法为何成为关键

在 Oj 等 Ruby 反序列化库中,攻击者无法依赖构造方法或 _load 等魔术方法触发代码执行,而是利用 hash 方法作为起点。当反序列化库将对象作为哈希键插入时,会调用该对象的 hash 方法。因此,若恶意类在 hash 方法中执行命令,且被放入哈希键位置,反序列化时就会触发。这提醒开发者:即使反序列化库不调用构造方法,仍可能通过哈希操作触发恶意代码。

检测思路:带外请求验证漏洞

文章构建的检测 gadget 链最终会向攻击者指定的 URL 发起 GET 请求,从而通过带外通道确认漏洞存在。这种方法无需直接执行命令,降低了检测风险,但前提是目标系统允许出站连接。若目标网络限制外连或使用白名单,检测可能失败。因此,在实际评估中需结合网络策略判断,并优先在授权环境中使用。

利用限制:Ruby 版本与依赖影响

文章指出,完整的 RCE gadget 链在 Ruby 3.2 后因 strip 方法报错而失效,且 Marshal 链仅支持到 Ruby 3.2.4。作者通过改用 zip 命令的 -TT 参数绕过限制,使链在 Ruby 3.3.3 仍有效。这表明反序列化漏洞的利用高度依赖 Ruby 版本和可用类,防御时需关注版本升级和依赖库变化,不能仅依赖单一修复。

防御重点:识别不安全反序列化点

文章总结了不同 Ruby 序列化库的危险接收点:Oj.load(未启用安全模式)、Ox.parse_obj、YAML.unsafe_load、Marshal.load 等。其中 JSON.load 因仅支持有限类,暂未发现通用 gadget 链。开发者应避免使用这些不安全方法,或改用安全模式。若需代码审计,可利用 CodeQL 查询检测不可信数据流向这些接收点的路径,从而系统性发现风险。

❓

Q&A

什么是不安全的反序列化漏洞?

不安全的反序列化漏洞是指攻击者利用反序列化库的多态性,构建恶意类链,从而执行任意命令的安全漏洞。

如何检测Ruby项目中的不安全反序列化漏洞?

可以使用CodeQL工具检测Ruby项目中的不安全反序列化漏洞,识别不安全的反序列化接收点。

Oj JSON序列化库的默认行为是什么?

Oj库默认支持实例化JSON中指定的类,这可能导致不安全的反序列化漏洞。

攻击者如何利用hash方法触发代码执行?

攻击者可以通过将类作为hash的键来触发hash方法,从而执行恶意代码。

在Ruby中,如何构建有效的恶意载荷?

构建有效的恶意载荷需要使用目标Ruby项目或其依赖项中的类,并通过组合不同的类和方法形成完整的恶意载荷链。

不安全反序列化漏洞的风险有哪些?

不安全反序列化漏洞可能导致远程代码执行,攻击者可以利用此漏洞获取系统控制权。

🏷️

标签

➡️

继续阅读