CC2

0x01 Preface

CC链提出时官方有两个Commons Collections版本

  • commons-collections:commons-collections

  • org.apache.commons:commons-collections4

两者的命名空间不冲突,可以共存在同⼀个项⽬中。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.0</version>
</dependency>

之前的利用链CC1、CC3、CC6commons-collections4均能正常使用,不过方法名可能稍有变动。

CC链实际上就是一条Serializable#readObject()Transformer#transform()的调用链

0x02 PriorityQueue

CC2中用到的两个类:

  • java.util.PriorityQueue

  • org.apache.commons.collections4.comparators.TransformingComparator

PriorityQueue#readObject() => heapify() => siftDown() => siftDownUsingComparator() => comparator.compare() => transformer.transform()

  • heapify int i = (size >>> 1) - 1得非负

  • siftDownUsingComparator half = size >>> 1得大于上面的i

PriorityQueue构造函数不会给size赋初值,需要用反射去赋值

0x03 Weave POC

0x04 Patch

org.apache.commons.collections4.comparators.TransformingComparator 在commons-collections4.0以前是版本没有实现 Serializable接口

官方发布的新版本4.1和3.2.2用于修复CC链 3.2.2中 增加了⼀个⽅法FunctorUtils#checkUnsafeSerialization ⽤于检测反序列化是否安全,其会检查常⻅的危险Transformer类,当我们反序列化包含这些对象时就会抛出异常。 若开发者没有设置全局配置 org.apache.commons.collections.enableUnsafeSerialization=true 即默认情况下会抛出异常

4.1中 这几个危险的Transformer类不再实现 Serializable 接口,直接不能序列化和反序列化

因此CC2只能在commons-collections4.0上跑通。

Last updated

Was this helpful?