代码审计CC2链,tfactory赋值,PriorityQueue新入口,如何?

摘要:代码审计 | CC2 链 —— _tfactory 赋值问题 PriorityQueue 新入口 目录 前言 环境 链路分析 Sink:TemplatesImpl 与 _tfactory 赋值问题 InvokerTransformer Tr
代码审计 | CC2 链 —— _tfactory 赋值问题 PriorityQueue 新入口 目录 前言 环境 链路分析 Sink:TemplatesImpl 与 _tfactory 赋值问题 InvokerTransformer TransformingComparator(关键节点) PriorityQueue:入口点 EXP 编写 完整调用链追踪 为什么必须用 CC 4.0 小结 前言 CC3 里我们用 TemplatesImpl 实现了字节码加载,触发点是通过 InstantiateTransformer 调用 TrAXFilter 的构造方法,入口依然是 LazyMap 那套。CC2 在这个基础上换了个思路,sink 还是 TemplatesImpl.newTransformer(),但触发链完全换掉了,入口变成了 PriorityQueue,中间靠 TransformingComparator 串起来。 另外有个很重要的区别:CC2 用的是 Commons Collections 4.0,而不是之前的 3.2.1。原因后面分析到 TransformingComparator 的时候会说。 环境 JDK 8u65 Commons Collections 4.0(注意版本) IDEA + 调试器 pom.xml 依赖改成这样: <dependencies> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.0</version> </dependency> </dependencies> 包名也从 org.apache.commons.collections 变成了 org.apache.commons.collections4,导包的时候注意一下。 链路分析 还是习惯从 sink 反推,找清楚每个节点怎么串起来的,再写 EXP。 Sink:TemplatesImpl 与 _tfactory 赋值问题 这个在 CC3 里分析过了,简单过一下。TemplatesImpl 里面有三个关键字段:_bytecodes(恶意字节码数组)、_name(不能为 null)和 _tfactory。 调用 newTransformer() 会触发 getTransletInstance() → defineTransletClasses() → 加载 _bytecodes 里的字节码并实例化,恶意代码在静态块或构造方法里就会执行。 这里展开说一下 _tfactory 到底要不要赋值的问题,这个之前文章里留了个坑。 半 payload 测试(未走反序列化) 之前的文章判断是说 defineTransletClasses 函数里有 _tfactory.getExternalExtensionsMap() 的调用,所以 _tfactory 必须赋值。
阅读全文