面试题答案
一键面试设计算法识别CC链关键类和方法调用
- 构建类和方法调用关系图:
- 解析Java字节码,使用如ASM、Javassist等字节码操作库。遍历字节码中的类、方法和指令,构建一个有向图。节点表示类和方法,边表示方法调用关系。例如,当一个方法A调用方法B时,从A节点到B节点建立一条有向边。
- 对于CC链涉及的类,预定义一个集合存储这些关键类,如
org.apache.commons.collections.Transformer
、org.apache.commons.collections.functors.ChainedTransformer
等。
- 基于规则的模式匹配:
- 从已知的CC链模式出发,以CC1链为例,其核心调用链模式大致为
AnnotationInvocationHandler.readObject -> InvokerTransformer.transform -> Method.invoke
。 - 基于构建的类和方法调用关系图,编写规则来匹配这种模式。例如,从
AnnotationInvocationHandler
类的readObject
方法开始,沿着方法调用边查找是否存在InvokerTransformer
类的transform
方法被调用,并且后续是否调用了Method.invoke
方法。 - 对于不同的CC链变种,分别编写相应的规则进行匹配。如CC2链、CC3链等,根据它们各自独特的类和方法调用顺序来定义规则。
- 从已知的CC链模式出发,以CC1链为例,其核心调用链模式大致为
避免误报的方法
- 上下文分析:
- 分析方法调用的上下文信息,不仅仅关注方法调用本身。例如,
Method.invoke
方法在正常的反射调用场景中也会被使用,但在CC链中通常伴随着恶意的Transformer
类调用。检查Method.invoke
方法调用前是否有可疑的Transformer
实例化和调用过程,如果没有,则判定为正常反射调用,避免误报。 - 分析类的继承关系和接口实现情况。某些CC链利用特定接口的实现类来触发漏洞,如
Transformer
接口。如果一个类实现了Transformer
接口,但并没有在可疑的调用链中使用,可认为是正常的业务实现,不进行误报。
- 分析方法调用的上下文信息,不仅仅关注方法调用本身。例如,
- 白名单机制:
- 维护一个白名单,包含已知的正常使用相关类和方法的场景。例如,在某些合法的框架中,可能会使用
commons - collections
库的类,但并非用于反序列化漏洞利用。将这些合法的使用场景加入白名单,在检测过程中,如果匹配到白名单中的模式,则跳过检测,不认为是漏洞。 - 对于一些常见的Java开发框架(如Spring、Hibernate等),分析它们正常使用相关类和方法的方式,并将这些方式添加到白名单中。当检测到这些框架相关的调用时,首先检查是否符合白名单规则,避免误报。
- 维护一个白名单,包含已知的正常使用相关类和方法的场景。例如,在某些合法的框架中,可能会使用
- 动态分析辅助:
- 结合动态分析技术,在实际运行环境中观察反序列化过程。在程序运行时,拦截反序列化操作,记录实际发生的类和方法调用序列。与静态分析得到的结果进行对比,如果动态分析中发现调用序列与已知CC链模式不完全一致,或者调用发生在正常的业务逻辑流程中,则可能是误报。
- 例如,通过在反序列化方法入口和关键类的关键方法入口添加日志记录,在程序运行后查看日志,分析调用的实际情况,进一步确认是否为真正的漏洞,而不是仅凭静态分析结果就判定为漏洞。