cc链于jdk原生反序列化中常用AnnotationInvocationHandler
做最后的包装,其优点如下。
一、其readobject中有setvalue方法当cc1使用TransformedMap
包裹时,setvalue后会调用TransformedMap中的checksetvalue方法进而调用valueTransformer.transform(value)达到命令执行。


二、AnnotationInvocationHandler
是一个代理类,其invoke方法中存在equalsImpl
与get
方法。使用AnnotationInvocationHandler
包裹自身代理类后(如代理lazymap的map接口)则执行setvalue时必然会走到invoke方法中调用到get的危险方法如(lazymap.get)。7u21时会调用到equalsImpl。



针对于动态代理在反序列化中的思考
动态代理需要的东西:
一个要被代理的接口
一个被代理的实体类(其实现了某个接口)
一个实现了InvocationHandler
代理类
最后使用Proxy.newProxyInstance实现动态代理
代理类代理的是接口,所以其构造方法一般是接受的是一个接口。
当追踪到反序列链条最终存在危险方法a.b
时(如lazymap.get),要代理a
的b
方法时该方法必须是从一个接口如c
实现而来,进而则可寻找满足如下条件的代理类。该代理类的构造方法接受a
实现的接口c
且invoke中调用了方法b
。
如下图所示: