从HertzBeat聊聊SnakeYAML反序列化

💡 原文中文,约7600字,阅读约需18分钟。
📝

内容提要

上周日与@Ar3h师傅在代码审计知识星球发布了Springboot挑战,探讨PSQL JDBC注入漏洞的离线利用。文章分为两部分:第一部分介绍Apache Hertzbeat的反序列化漏洞,第二部分讨论挑战的预期与非预期答案。Hertzbeat使用SnakeYAML解析YAML,存在反序列化漏洞,作者分析了漏洞历史及利用链,并提出了离线利用方法。最终,Hertzbeat在新版本中修复了该漏洞。

🔎

延伸解读

反序列化漏洞的历史背景

SnakeYAML的反序列化漏洞历史悠久,最早由Moritz Bechler在2017年提出。尽管早期的研究已揭示了该漏洞的存在,但直到2022年才被正式申请CVE编号。这反映了安全漏洞在被广泛认知和修复之间可能存在的时间差,提醒开发者关注依赖库的安全性。

Hertzbeat的修复措施分析

Hertzbeat在v1.4.1版本中尝试修复反序列化漏洞,但补丁效果有限,最终在v1.6.0版本中通过引入SafeConstructor实现了更有效的修复。这表明,简单的黑名单策略可能无法完全防止漏洞利用,开发者应优先考虑安全设计原则。

利用链的多样性与风险

文章中提到的多种利用链展示了反序列化漏洞的复杂性和多样性。尤其是通过构造函数调用实现不出网的攻击方式,强调了在安全审计中需关注的潜在风险。开发者应定期审查代码,确保不易被利用的构造函数不被暴露。

Q&A

Apache Hertzbeat的反序列化漏洞是什么?

Apache Hertzbeat的反序列化漏洞是由于使用SnakeYAML解析YAML时,未使用SafeConstructor且版本低于2.0,导致存在CVE-2022-1471漏洞。

SnakeYAML反序列化漏洞的历史背景是什么?

SnakeYAML反序列化漏洞的历史可以追溯到2017年,最早由Moritz Bechler在marshalsec项目中提出,直到2022年才被申请CVE编号。

Hertzbeat是如何修复反序列化漏洞的?

Hertzbeat在v1.4.1版本中进行了初步修复,但效果有限,最终在v1.6.0版本中通过增加SafeConstructor实现了有效修复。

如何利用SnakeYAML的反序列化漏洞进行攻击?

可以通过构造函数调用和特定的payload实现不出网的攻击,例如利用javax.script.ScriptEngineManager加载本地Jar包。

SnakeYAML与Fastjson的反序列化漏洞有什么相似之处?

SnakeYAML和Fastjson的反序列化漏洞都涉及到利用链的构造,但SnakeYAML无法调用getter,而Fastjson则需要getter来执行某些操作。

反序列化漏洞的利用链需要满足哪些条件?

反序列化漏洞的利用链需要满足版本低于2.0且未使用SafeConstructor,并且可能需要连接外网或使用特定的payload。

🏷️

标签

➡️

继续阅读