为什么 StrictYAML 不解析 Python 对象的直接表示?

常规 YAML 允许直接表示 Python 对象。

例如

--- !python/hash:UserObject
email: [email protected]
password: passwordtoset
type: admin

如果我们将此 YAML 格式的字符串加载进来,我们将得到一个用户对象。这就是 YAML 的设计初衷,因为它允许将对象写入数据库并从数据库中读取对象。

本身,这种行为不一定能够执行成功的攻击,因此并非所有解析不可信 YAML 的代码都是不安全的,但它可以被使用,尤其是在与元编程结合时,在您的系统上执行任意代码。

这与 pickle 模块的行为有很多相似之处,这就是为什么 Python 文档强烈建议不要将其用于 不可信的输入

这个反功能导致了 Ruby on Rails 的惊人 安全漏洞