jackson-databind远程代码执行漏洞分析(CVE-2020-10673)
1. 漏洞描述
近日,百度云安全团队跟踪到jackson-databind在github上更新了一个新的反序列化利用类com.caucho.config.types.ResourceRef,issue编号2660,该类绕过了之前jackson-databind维护的黑名单类。如果项目中包含resin-kernel库,并且JDK版本较低的话,请及时升级jackson-databind到安全版本。
2. 影响范围
jackson-databind < 2.9.10.4
JDK < 6u201、7u191、8u182、11.0.1(LDAP)
3. 漏洞分析
该漏洞本质是java的JNDI注入,我们先来了解下JNDI基础知识。简单来说,JNDI是一组应用程序接口,它为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定位用户、网络、机器、对象和服务等各种资源。比如可以利用JNDI在局域网上定位一台打印机,也可以用JNDI来定位数据库服务或一个远程Java对象。JNDI底层支持RMI远程对象,RMI注册的服务可以通过JNDI接口来访问和调用。JNDI接口在初始化时,可以将RMI URL作为参数传入,而JNDI注入就出现在客户端的lookup()函数中,如果lookup()的参数可控就可能被攻击。
因此分析的时候,可以直接先搜索受影响类的lookup方法,看看漏洞入口在哪里,本文复现的时候用的是resin-kernel-4.0.52版本。
首先定位到com.caucho.config.types.ResourceRef类,我们在getValue方法中找到了jdni.lookup方法,但需要满足getLookupName方法不为空。
跟进到父类ResourceGroupConfig,getLookupName方法直接返回_lookupName变量,但会在setLookupName方法进行赋值。
因此可以确远程对象调用入口为lookupName,我们可以写入如下的反序列化的测试代码。由于触发是在getValue方法中,因此在反序列化后需要再调用writeValueAsString方法进行序列化,以触发get方法。可用marshalsec监听ldap服务,并制作好可执行命令的class文件。
其实,在这里还需要说下为什么需要调用mapper.enableDefaultTyping(),当不带参数调用enableDefaultTyping时,会设置DefaultTyping为OBJECT_AND_NON_CONCRETE。
DefaultTyping有四个选项:
JAVA_LANG_OBJECT: 当对象属性类型为Object时生效;
OBJECT_AND_NON_CONCRETE: 当对象属性类型为Object或者非具体类型(抽象类和接口)时生效;
NON_CONCRETE_AND+_ARRAYS: 同上, 另外所有的数组元素的类型都是非具体类型或者对象类型;
NON_FINAL: 对所有非final类型或者非final类型元素的数组。
因此,当开启DefaultTyping后,会开发者在反序列化时指定要还原的类,过程中调用其构造方法setter方法或某些特殊的getter方法,当这些方法中存在一些危险操作时就造成了代码执行。
官方在github的更新措施(https://github.com/FasterXML/jackson-databind/commit/1645efbd392989cf015f459a91c999e59c921b15),仍然是添加com.caucho.config.types.ResourceRef为黑名单类,但这种方式治标不治本,后续可能出现其他绕过黑名单的gdaget。
4. 防御措施
1. 及时将jackson-databind升级到安全版本(>=2.9.10.4,> 2.10.0);
2. 升级到较高版本的JDK。
参考:
https://qiita.com/shimizukawasaki/items/d72fb40b69bb0d328ee7
https://github.com/FasterXML/jackson-databind/issues/2660
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
网络编程懒人入门(十一):一文读懂什么是IPv6
本文参考了公众号鲜枣课堂的“IPv6,到底是什么?”一文的部分内容,感谢原作者。 1、引言 现在IPv6的技术应用已经越来越普及了,很多应用都开始支持IPv6。 ▲ 去年开始,支付宝的官网上就已出现“支持IPv6”标识 对于即时通讯技术(尤其是IM应用)的开发者来说,新产品上架苹果的App Store因IPv6问题被拒的情况,很常见。每次也都能根据网上的资料一一解决,并顺利通过审核。 然而几次下来,到底什么是IPv6,还是有点云里雾里。 那么,IP协议在TCP/IP体系中到底有多重要?看看下图便知(原因清晰版:从此处进入下载)。 ▲ 红圈处就是IP协议,它几乎是整个TCP/IP协议簇的支撑(图引用自《计算机网络通讯协议关系图》) 总之,IP协议在TCP/IP体系中,是非常重要的一环(可以认为,没它,也就没有了互联网),作为IPv4的下一代协议,了解IPv6非常有必要。而作为即时通讯开发者来说,了解IPv6就显的尤为迫切,说不定某天你的IM就会因为IPv6问题而导致无法通信的局面出现。 本文将用浅显易懂的文字,带你了解到底什么是IPv6。 2、复习一下什么是IPv4? IPv4是Inte...
- 下一篇
Milvus v0.8.0 发布: 新增 ANNOY 索引、向量删除与 Bug 修复
Milvus v0.8.0发布了,此版本主要包括:新增ANNOY 索引、向量删除与Bug修复。 |版本兼容 |新增功能 ANNOY 索引的支持 增加ANNOY索引类型,关于ANNOY索引的详细介绍请参考文档。#261 向量删除 新增下列索引类型支持删除操作。#1655#1660#1661#1849 包括:Flat/IVFlat/IVFPQ/IVFSQ8/IVFSQ8H/NSG/HNSW/ANNOY | 主要改进 在 http 模块支持超集/子集距离。#1784 | Bug 修复 限制 partition 数目上限为4096。#1276 禁止创建_defaultpartition。#1762 解决多客户端并发时系统崩溃的问题。#1789 解决读取 >2GB 原始数据文件时部分数据丢失的问题。#1883 对新版本有问题吗? 欢迎留言喔!
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS关闭SELinux安全模块
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19