【网络安全】Nacos Client Yaml反序列化漏洞分析
背景
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Nacos是阿里巴巴于2018年开源的项目,目前在Github中已获得 19.8kSt,由此可见其的使用广泛程度。
未授权访问漏洞
threedr3am师傅在去年十二月份的时候在Github上给Nacos项目提交了Bypass 认证的Issue,详情可移步https://github.com/alibaba/nacos/issues/4593。在该Issue中提及了漏洞详情,Nacos的认证过滤器中会判断客户端的User-Agent如果是以Constants.NACOS_SERVER_HEADER(Nacos-Server)开头的话,则直接return返回。
对于上述的认证绕过漏洞争议很大,Nacos官方起初并不认为这是一个安全漏洞的问题,不过还是在1.4.1版本中发布了漏洞修复补丁。在1.4.1版本中需要在 application.properties添加nacos.core.auth.enable.userAgentAuthWhite的属性值为false,即可避免使用User-Agent绕过鉴权的问题,但这也引发了新的Bypass,具体的漏洞详情可移步至https://github.com/alibaba/nacos/issues/4701,不再赘述。
客户端Yaml反序列化
在Nacos的releases记录中搜索 yaml 关键字不难发现其在1.4.2版本中有个PR更新了Yaml的安全解析:
而根据PR的描述内容可知实际上该漏洞只影响单独使用 nacos-client SDK的用户,原因在于spring cloud、springboot、dubbo等框架中并非使用的 AbstractConfigChangeListener 监听配置,所以该漏洞只影响了使用AbstractConfigChangeListener监听配置的客户端。
漏洞分析
首先在Nacos服务端中添加一个用于测试监听的配置:
使用Maven引入nacos-client依赖:
<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>1.4.1</version>
</dependency>
以官方的监听配置请求示例复现,需要修改serverAddr、dataId、group、Listener,如果配置了登陆还需要添加username和password。
// Client.java
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigChangeEvent;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.client.config.listener.impl.AbstractConfigChangeListener;import java.util.Properties;public class Client {public static void main(String[] args) throws Exception {String serverAddr = "{serverAddr}";String dataId = "{dataId}";String group = "{group}";Properties properties = new Properties();properties.put("serverAddr", serverAddr);properties.put("username", "nacos");properties.put("password", "nacos");ConfigService configService = NacosFactory.createConfigService(properties);String content = configService.getConfig(dataId, group, 5000);System.out.println(content);configService.addListener(dataId, group, new AbstractConfigChangeListener() {@Overridepublic void receiveConfigChange(ConfigChangeEvent configChangeEvent) {System.out.println(configChangeEvent);}});while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}
然后在com.alibaba.nacos.client.config.impl.YmlChangeParser#doParse方法中打下断点:
开启Debug并在服务端中修改上述用于测试的配置内容为yaml反序列化的payload,该payload会加载远程的jar包并运行主类的代码。
点击发布后即可命中断点
再根据堆栈信息进行回溯的调试,首先在ConfigFactory#createConfigService方法中通过反射获取com.alibaba.nacos.client.config.NacosConfigService类的实例对象并返回该对象。
在NacosConfigService的构造器中实例化ClientWorker对象
跟进ClientWorker的checkConfigInfo方法
传入的对象为ClientWorker的内部类LongPollingRunnable对象,会调用其run方法。
而run方法就是nacos客户端的长轮询监听,run方法中会循环调用cacheDatax.checkListenerMd5方法,而CacheData对象是从ClientWorker对象的cacheMap属性中获取的。
Iterator var3 = ClientWorker.this.cacheMap.values().iterator();
而cacheMap中缓存的CacheData对象是在客户端添加监听的时候写入的
再回到ClientWorker.LongPollingRunnable#run方法中,前面说到其会调用checkListenerMd5方法,该方法中会调用safeNotifyListener方法,并传入监听配置的dataId、group、content(修改的新内容)、type、md5及CacheData.ManagerListenerWrap对象。
在safeNotifyListener方法中调用了ConfigChangeHandler#parseChangeData方法解析数据,传入的参数listenerWrap.lastContent为修改前的内容,content为修改后的内容,type为数据类型(TEXT/JSON/XML/YAML/HTML/Properties)。
其会调用YmlChangeParser#doParse方法
YmlChangeParser#doParser方法中触发Yaml反序列化漏洞,请求远程的Jar包并执行。
再次声明,该漏洞只影响使用AbstractConfigChangeListener监听器的客户端,原因如下:
漏洞修复
在1.4.2版本中已修复了该漏洞,修复方法为使用SnakeYaml提供的SafeConstructor解析Yaml配置。
实战应用
在实际的渗透测试中如果获取了Nacos Server控制台权限的话,不妨可以尝试修改已有的配置为Yaml Payload进行盲打客户端的攻击。但通常情况下的Springboot或SpringCloud都可以集成使用Nacos,所以这种场景下一般不会出现存在漏洞的情况。
最后
关注私我获取2021最新【网络安全学习资料·攻略】
【网络安全】Nacos Client Yaml反序列化漏洞分析相关推荐
- tomcat源码分析_CVE-2020-9484 tomcat session反序列化漏洞分析
作者:N1gh5合天智汇 title: CVE-2020-9484 tomcat session反序列化漏洞分析 tags: CVE,Tomcat,反序列化 grammar_cjkRuby: true ...
- Fastjson 1.2.68版本反序列化漏洞分析篇
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | ale_wong@云影实验室 来源 | htt ...
- Fastjson 1.2.22-24 反序列化漏洞分析
目录 0x00 废话 0x01 简单介绍 FastJson的简单使用 0x02 原理分析 分析POC 调试分析 0x03 复现过程 0x04 参考文章 0x00 废话 balabala 开始 0x01 ...
- commons-collections反序列化漏洞分析——远程代码执行
commons-collections反序列化漏洞分析--远程代码执行 命令执行以及通过反射进行命令执行 这里先说说java里面的命令执行.其实java的命令执行和PHP类似,PHP一般通过eval和 ...
- MySQLJDBC反序列化漏洞分析
JDBC反序列化漏洞 Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数 ...
- XStream反序列化漏洞分析
XStream反序列化漏洞分析 XStream反序列化漏洞分析 代理模式 EventHandler XStream 生成payload XStream流程分析 写在最后 XStream反序列化漏洞分析 ...
- thinkphp5.0.24反序列化漏洞分析
thinkphp5.0.24反序列化漏洞分析 文章目录 thinkphp5.0.24反序列化漏洞分析 具体分析 反序列化起点 toArray getRelationData分析 $modelRelat ...
- rmi反序列化导致rce漏洞修复_RMI反序列化漏洞分析
原创:Xman21合天智汇 一.RMI简介 首先看一下RMI在wikipedia上的描述: Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Ja ...
- shrio反序列漏洞修复_Apache Shiro Java 反序列化漏洞分析
Author: rungobier(知道创宇404安全实验室) Date: 2016-08-03 0x00 概述 Apache Shiro 在 Java 的权限及安全验证框架中占用重要的一席之地,在它 ...
最新文章
- js字母大小写字母转换
- Spring data redis 异常
- 使用Kali官网提供的虚拟机系统
- Django框架(25.Django中的模板继承以及HTML转义)
- jq调用android方法,Android端JQueryMobile使用教程(一)
- 将Spock 1.3测试迁移到Spock 2.0
- httpClient学习笔记1
- nginx 使用总结
- unity 检测电脑摄像头_unity3d调用手机或电脑摄像头
- Android-2-控件使用
- HTTP代理服务器有哪些
- 点击edittext 区域外隐藏输入法和点击edittext 显示输入法
- 2019年西安市民办小升初西工大附中分校面谈录取学生名单
- springboot大学生青年志愿者管理的设计与实现毕业设计源码101605
- 头条抖音后端技术3面,2021Java通用流行框架大全,含面试题+答案
- 北斗由“高大上”转为“接地气” 芯片成国内智能手机标配
- pandas系列学习(五):数据连接
- python导入安装包
- 桌面图标黑色解决方案
- 无线网络技术导论笔记(第二讲)
热门文章
- AI:2020年6月22日北京智源大会演讲分享之机器感知专题论坛—14:50-15:30吴玺宏教授《一种具身自监督学习框架:面向任何语种语音的音系构建任务》
- Py之gpxpy:gpxpy的简介、安装、使用方法之详细攻略
- AI机器人:机器人语音文本智能交互之自定义软件——实现模拟中本聪与V神跨时空畅谈
- Java编程思想:擦除的神秘之处
- Mybatis Plugin(拦截器)的开发
- select 实现server I/O多路复用通信
- 你必须知道的28个HTML5特征、窍门和技术
- Android中广播接收者BroadcastReceiver详解
- spring IOC 注解@Autowired
- dos窗口显示中文的一种方法