安全的 YAML 解析器?

信息安全 应用安全 攻击预防 网络服务 注射
2021-08-29 19:01:36

我最近读到 YAML 并非“旨在处理恶意用户输入”,因为恶意 YAML 输入“可以创建目标 Rails 应用程序中定义的所有类的实例”。维基百科也解释说

YAML 允许使用特定于语言的标签,因此支持这些标签的解析器可以创建任意本地对象。任何允许执行复杂对象实例化的 YAML 解析器都可能引发注入攻击。

因此,使用某些 YAML 解析器解析不受信任的输入似乎是不安全的。

谁能解释如何在 Rails、Python 和 Perl 中安全地解析不受信任的 YAML 输入?是否有安全的 YAML 解析库,或者调用它们的方法来确保它们是安全的,即使输入来自不受信任的来源?

2个回答

就在同一篇维基百科文章中,您正在寻找的答案是:

请注意,如果您从 Internet 等不受信任的来源收到 YAML 文档,那么构造任意 Python 对象的能力可能会很危险。该函数yaml.safe_load将这种能力限制为简单的 Python 对象,如整数或列表。

重点补充

YAML 规范允许对任意数据结构进行全保真序列化和反序列化,其中包括反序列化(并因此实例化)应用程序中定义的任何对象的能力。可以把它想象成 python 的内置序列化例程pickle,只是语法不同。

PyYAML 上的safe_load方法是专门为解决这样一个事实而创建的,即这本质上是非常不安全的。它允许您仅反序列化为通用的、简单的面向数据的类型,这些类型已知没有副作用(即数字、字符串、列表等)。

至于其他语言的实现,可能默认受限(即“安全”),也可能默认不受限。您必须检查相关文档。我只知道 Python 的实现。

不幸的是,Ruby 没有内置的安全模式。我现在写了 SafeYAML gem来堵住这个漏洞;从 1.9.2 开始,关于将这个功能添加到 Psych(Ruby 的 YAML 解析引擎的讨论正在进行中。

目前,如果您是 Ruby 应用程序开发人员,最好的选择可能是使用 SafeYAML 或找到适合您需求的类似库。