一、漏洞怎么生产的
如果一个应用接受反序列化数据,并且没有对反序列化的对象做限制,就可能导致代码执行。(使用了有安全缺陷的Apache Commons Collections jar包)
public static void main(String[] args) {
/*under attacker's control*/
File f =new File(args[0]);
try {
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois=new ObjectInputStream(fis);
/*where vul produce*/
ois.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
上面就是类似生产漏洞的代码,但是不是接受远程数据,接受远程导致RCE,原理类似。其实这个漏洞发现隐蔽性挺强的,大神发现也是太牛逼。
二、分析前基础知识
Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库,其中定义了TransformedMap结构,其定义了一个静态方法decorate(),可以完成Map结构的转换。
public static Map decorate(Map map, Transformer keyTransformer, Transformer valueTransformer) {
return new TransformedMap(map, keyTransformer, valueTransformer);
}
调用此方法可以完成Map的转换:
Map oldMap = new HashMap();
Map newMap = TransformedMap.decorate(oldMap,keyTransformer,valueTransformer);
TransformedMap实现了一个抽象类AbstractInputCheckedMapDecorator,当TransformedMap的setValue()方法被调用时,会调用抽闲父类AbstractInputCheckedMapDecorator的setValue()方法。
public class TransformedMap extends AbstractInputCheckedMapDecorator implements Serializable {
private static final long serialVersionUID = 7023152376788900464L;
protected final Transformer keyTransformer;
protected final Transformer valueTransformer;
}
AbstractInputCheckedMapDecorator的setValue()方法:
public Object setValue(Object value) {
value = this.parent.checkSetValue(value);
return this.entry.setValue(value);
}
于是继续回到TransformedMap的checkSetValue方法,从而调用了transform()方法,并且,transform()方法的参数就是setValue()方法的参数。
protected Object checkSetValue(Object value) {
<