找回密码
 立即注册
注册 登录
×
热搜: 活动 交友 discuz
查看: 108|回复: 1

漏洞深度分析|CVE-2022-1471 SnakeYaml 命令执行漏洞

[复制链接]

2

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2022-12-21 16:42:57 | 显示全部楼层 |阅读模式
项目介绍

YAML是一种数据序列化格式,设计用于人类的可读性和与脚本语言的交互。
SnakeYaml是一个完整的YAML1.1规范Processor,支持UTF-8/UTF-16,支持Java对象的序列化/反序列化,支持所有YAML定义的类型。
项目地址

https://github.com/snakeyaml/snakeyaml
漏洞概述

SnakeYaml通常使用方法如下:
new Yaml(new Constructor(TestDataClass.class)).load(yamlContent);
默认情况下,SnakeYaml在解析用户提供恶意yamlContent时,即使yamlContent不满足TestDataClass类型,也会执行恶意代码。
影响版本

Snakeyaml 全版本
环境搭建

导入存在漏洞的Snakeyaml组件并编写demo测试即可
漏洞复现

下面demo通过反序列化一个恶意类,该恶意类可以请求远程jar文件并实例化。


漏洞分析

该漏洞并不被官方认可,官方认为通过yaml文件反序列化对象是正常功能并不会修复。


这里我仅对snakeyaml反序列化的流程进行分析,为了简洁易懂,下面仅列举关键代码:


上述代码需要层层展开,简单说就是根据snakeyaml的构造器解析yaml文件内容并返回对应实例。下面对实例化的关键步骤展开介绍:

  • 获取构造器
    在下面代码中根据节点获取对应的类并从yamlClassConstructors中获得对应的构造器。



这里的Constructor有三种类型,分别对应不同的yaml




  • 实例化对象
获得构造器后就是装配对象。这里仅分析ConstructSequence。在下面代码中,根据节点的不同类型分别进行处理。


如果不是上述三种基本类型,那么获取默认的构造函数并递归构造参数节点


最后通过反射初始化实例


以上梳理了snakeyaml大概的反序列化流程。当yaml可以被攻击者控制时,通过传入恶意的yaml内容就可以实例化任意对象,从而造成命令执行。
修复方式

在参考链接中,官方认为snakeyaml的使用场景仅接收可信的数据源,因此不认为cve-2022-1471是漏洞,因此目前还没有修复,后续可能也不会修复。这里建议开发人员排查snakeyaml的使用情况,判断是否接收外部数据,并加入new SafeConstructor()类进行过滤,如下:
Yaml yaml = new Yaml(new SafeConstructor());
参考链接

https://bitbucket.org/snakeyaml/snakeyaml/issues/561/cve-2022-1471-vulnerability-in
https://github.com/advisories/GHSA-mjmj-j48q-9wg2
https://nvd.nist.gov/vuln/detail/CVE-2022-1471
回复

使用道具 举报

1

主题

7

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2025-3-23 21:44:41 | 显示全部楼层
好,很好,非常好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋| 黑客通

GMT+8, 2025-4-6 04:59 , Processed in 0.092865 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2020, LianLian.

快速回复 返回顶部 返回列表