什么是Java CC链
什么是Java的CC链
-
当我们使用 Java 程序时,经常需要导入其他类库,这些类库通常包含许多不同的类和方法。在 Java 中,类之间的依赖关系可以形成一种调用链,在这种调用链中,一个类的方法会调用另一个类的方法,而后者又会调用另一个类的方法,如此循环下去。这种调用链被称为**“调用链”(Call Chain)**。
-
在 Java 中,如果应用程序的一个类直接或间接地调用另一个类的敏感方法(例如连接到网络、读取文件等),那么这种依赖关系就会被称为**“CC chain(Control-Flow to Call Chain)”,也叫做控制流问题或调用链问题**。
-
这种问题通常被视为 Java 应用程序中最常见的漏洞之一,攻击者可以通过利用 Java 应用程序中一个或多个不安全的依赖关系,将其嵌入攻击代码,实现远程执行恶意代码的攻击。因此,为了确保 Java 应用程序的安全性,必须认真检查应用程序中所有的 CC 链,并采取措施来解决存在的安全漏洞。
Java的CC链举例子
- Java的不同类之间的相互调用可能会形成一条CC(控制流到函数调用)链,如果攻击者能够利用这些调用链的漏洞,从一个Java对象的方法调用控制权泄露到另一个Java对象,那么攻击者就可以利用这个漏洞来执行具有恶意目的的代码。攻击者可以利用这种漏洞来窃取敏感数据、攻击网络连接以及利用目标系统的资源,对系统造成严重的影响。
- 例如,如果一个Web应用程序中的Java代码,接收来自用户提交的数据,然后在后台执行Java类库中的某个方法,而这个方法又会调用其他的Java类库或代码,那么这些Java类库或者代码之间的调用关系就形成了CC链。攻击者可以利用应用程序中的任何CC链中存在的漏洞来执行任意代码。这类问题是Java应用程序中的常见漏洞之一,必须采取措施进行识别和修复以确保应用程序的安全性。
构造CC链举例
- 首先,要构造一个cc链,需要找到3个或更多的类,它们的构造函数之间存在调用关系。例如A调用B,B调用C,这样的关系。
- 然后,攻击者需要找到这些类中,安全检查较少或存在漏洞的构造函数。比如构造函数直接执行从网络接收的数据,或者通过反序列化将接收的数据直接反序列化成对象。
- 最后,攻击者精心构造数据,传递给最初的构造函数。在对象构造的过程中,由于构造函数调用关系,这个数据最终被恶意构造函数所使用,导致远程代码执行。
- 一个典型案例是JDK中的AnnotationInvocationHandler。这个类的构造函数会反序列化接收的annotation数据,如果数据被攻击者恶意构造,可以导致远程代码执行。利用这个漏洞的cc链如下:
AnnotationInvocationHandler (constructed with malicious annotation data)
-> MyAnnotation (AnnotationProxy is constructed)
-> Element (the annotation is “added” to this element)
- 另一个例子是Spring的SpEL表达式注入。SpEL表达式可以执行Java方法。如果 SpEL表达式来自用户输入,攻击者可以构造表达式执行恶意方法。利用这个漏洞的cc链可以是:
Constructor (accepts SpEL expression as argument)
-> SprinELResolver (resolves the SpEL expression)
-> MethodExecutor (executes the method invoked in the expression)
- 找出cc链并不难,难点在于找到链中存在漏洞或者安全检查不严的构造函数,然后通过精心构造的参数触发这个漏洞,达到RCE的效果。这也是防范cc链攻击的关键所在。