首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ruamel.yaml中使用默认负载安全吗?

在ruamel.yaml中使用默认负载安全吗?
EN

Stack Overflow用户
提问于 2022-02-28 17:28:09
回答 1查看 312关注 0票数 1

我可以使用ruamel.yaml加载和转储带有标记的YAML文件,并保留标记。

如果我让我的客户编辑YAML文档,他们会因为任意python模块代码执行而利用YAML漏洞吗?据我所知,ruamel.yaml是从PyYAML派生出来的,根据其文档,PyYAML存在这样的漏洞。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-28 17:56:55

从您的问题中,我推断您正在对一个.load()实例使用YAML()方法,如下所示:

代码语言:javascript
复制
import ruamel.yaml
yaml = ruamel.yaml.YAML()
data = yaml.load(some_path)

而不是旧的PyYAML load兼容函数(它不能处理未知的标记,而且可能不安全)。简单地说,这是安全的,因为在不调用任何标记相关代码的情况下,不会对标记进行解释,标记只会被分配给已知类型(CommentedMapCommentedSeqTaggedScalar,分别用于映射、序列和标量)。

PyYAML中的漏洞来自其Constructor,这是不安全Loader的一部分。这是PyYAML默认使用时间最长的一次,而且大多数人甚至可以使用safeloader,因为他们没有使用任何标记(或者可以针对SafeLoader/Constructor重新定位所需的标记)。不安全的ConstructorSafeConstructor的一个子类,使其不安全的是为解释python/{name,module,object,apply,new):....标记注册的多个方法,本质上是动态地解释这些标记以加载模块并运行代码(即执行函数/方法/实例化类)。

ruamel.yaml背后的最初想法是它的RoundTripConstructor,它也是SafeConstructor的一个子类。您以前使用现在不再推荐的round_trip_load函数来获得这个值,现在通过.load()方法在使用YAML(typ='rt')之后,这也是没有typ参数的YAML()实例的默认设置。RoundTripConstructor,而不是注册任何标记,或者有任何代码来解释SafeConstructor使用的普通标记之外的标记。

只有旧的PyYAML load和使用typ='unsafe'的ruamel.yaml可以通过通过!!python/..标记执行代码来对被修改的YAML输入执行任意的!!python/..代码。

使用typ='rt'时,即使没有注册标记,节点上的标记也会被保留。这是可能的,因为在处理节点时(在往返模式下),这些标记将被赋值为字符串到标记节点的构造类型上的属性(映射、序列或标量,标记null除外)。当转储这些类型时,如果它们有一个标记,它将被重新插入到表示处理代码中。在任何时候都不是计算、用于导入代码的标记,等等

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71298807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档