使用 SnakeYAML 从不受信任的来源加载 YAML 文件时会发生啥?
Posted
技术标签:
【中文标题】使用 SnakeYAML 从不受信任的来源加载 YAML 文件时会发生啥?【英文标题】:What can happen when loading a YAML file from an untrusted source with SnakeYAML?使用 SnakeYAML 从不受信任的来源加载 YAML 文件时会发生什么? 【发布时间】:2013-09-13 06:15:31 【问题描述】:SnakeYAML 文档says:
警告:使用从不受信任的来源收到的任何数据调用
Yaml.load()
是不安全的!
是安全问题吗?恶意 YAML 文件能做什么?
【问题讨论】:
它可以运行恶意代码。 @Brian 所以 YAML 文件可以包含 Java 代码,会在解析时执行? 【参考方案1】:我也想知道这一点,并在文档中找到以下内容:
注意是否要将对象限制为标准 Java 对象,例如 List 或者你需要to use SafeConstructor。
Yaml yaml = new Yaml(new SafeConstructor());
上面引用的链接指向一个测试用例,其中 YAML 文档包含对 Java 对象的引用。如果没有SafeConstructor
,yaml.load
将调用对象的无参数构造函数,这对于类路径中的某些类可能是一件坏事。使用SafeConstructor
,只会调用SafeConstructor
nested classes (Java code)。
【讨论】:
【参考方案2】:SnakeYAML 允许使用任何类加载器。创建类的实例时,它会调用构造函数。它将在那里运行任何代码。如果您自己加载课程 - 不用担心。
【讨论】:
“自己加载类”是什么意思?以上是关于使用 SnakeYAML 从不受信任的来源加载 YAML 文件时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
CWE-501: Trust Boundary Violation违反信任边界的代码漏洞缺陷
查看此处解析的 XML 是不是来自受信任的来源,否则将 settings.DtdProcessing 设置为 System.Xml.DtdProcessing.Prohibit 或 .Ignore