3 min read

Ruby Marshal反序列化漏洞的十年演变:从打补丁到生态系统改革的警示

文档记录了Ruby Marshal模块中反序列化漏洞的十年演变,揭示了“打补丁然后希望”方法的局限性,以及从早期发现到现代工业化漏洞挖掘的转变。该过程展示了系统性模式如何抵御常规修复,并强调了对Ruby生态系统进行根本性改变的必要性。

该演变始于2013年Charlie Hailey对Marshal.load危险性的早期警示,随后在Phrack杂志上得到关注。2018年Luke Jahnke首次提出程序化挖掘利用链,随后引发了漏洞研究的爆发,包括HackerOne报告、CVE-2019-5420以及YAML和JSON格式的漏洞研究。2021年至2022年间,漏洞利用技术进一步成熟,出现了针对Ruby 2.x-3.x的通用反序列化利用链,但Ruby 3.1.0和3.2.0的更新开始默认启用安全YAML加载并修补Marshal漏洞。

进入“现代时代”,漏洞挖掘呈现出工业化、临床化的特点,使用先进工具进行系统性分析。2024年,Include Security和GitHub Security Lab的研究进一步推动了跨过程分析和代码查询(如CodeQL)在发现反序列化漏洞中的应用。尽管近期Ruby 3.4版本仍出现新的漏洞,并被及时修补,但Marshal模块的根深蒂固的使用表明,单纯的补丁策略已不足以解决问题。

为应对此挑战,建议Ruby开发者审计代码库中的Marshal使用,并转向更安全的替代方案,如YAML的safe_load、JSON的手动对象构建、类型化的数据库列或MessagePack、Protocol Buffers等格式。同时,将反序列化纳入安全审查清单。对Ruby核心团队的建议包括逐步弃用并最终移除Marshal模块,引入Marshal.safe_load,默认运行时警告,以及最终将Marshal.load行为改为安全模式。文章最后指出,像Go和Rust这类语言不存在此类问题,其原因在于避免使用不安全的序列化格式。

Marshal madness: A brief history of Ruby deserialization exploits
This post traces the decade-long evolution of Ruby Marshal deserialization exploits, demonstrating how security researchers have repeatedly bypassed patches and why fundamental changes to the Ruby ecosystem are needed rather than continued patch-and-hope approaches.
订阅情报