LoRexxar's Blog | 信息技术分享

LoRexxar's Blog

马上订阅 LoRexxar's Blog | 信息技术分享 RSS 更新: https://lorexxar.cn/atom.xml

Joern In RealWorld (1) - Acutators + CVE-2022-21724

2023年8月31日 17:06

这个系列会记录我用Joern复现真实漏洞的一些过程,同样也是对Joern的深入探索。

这里我选用Java-sec-code的范例代码做第一部分,这篇文章记录了两个比较经典的漏洞

  • Springboot Acutators导致命令执行
  • postgreSQL jdbc反序列化漏洞(CVE-2022-21724)

Joern分析Java代码可以选择用代码文件夹也可以选择直接分析jar包

1
importCode("../../java-sec-code/target/java-sec-code-1.0.0.jar")

Springboot Acutators配置问题

SpringBoot Actuator是SpringBoot内置的一个监控管理插件。只要引用组件就会开启对应的功能

1
2
3
4
5
6
7
8
9
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

开启后SpringBoot 1.x起始路径为/,2.x的起始路径为/actuator

暴露路由本身不能算太大的安全问题,只能说配置不当可能导致信息泄露,可以参spring-boot.txt

Actuator的接口配合一些组件就可能导致RCE,但防御的方法大多都是对Actuator做鉴权限制

  • Actuators + jolokia
1
2
3
4
5
6
<!-- SpringBoot Actuator命令执行的库 -->
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
<version>1.6.0</version>
</dependency>

配合jolokia的接口可以实现jndi注入导致RCE

1
2
3
4
5
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>

首先组件上引用eureka才行,并且Eureka-Client <1.8.7(多见于Spring Cloud Netflix)

其次需要Application要有@EnableEurekaClient注解

1
2
3
4
5
6
7
8
9
10
11
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

for Joern

我首先遇到的问题就是,这个漏洞其实配置问题大于其他问题,我研究了很久认为这个问题在Joern中是不可解的。

一方面Acutators开启只需要组件引用即可,另一方面比较常见的修复手段是增加鉴权,加入鉴权组件并开启配置

1
2
3
4
5
6
7
8
9
10
# pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

# for application.properties
management.security.enabled=true
security.user.name=admin
security.user.password=admin

哪怕不是用这个鉴权组件但也大同小异,关闭敏感端点之类的。

而问题回到Joern上,Joern虽然定义了ConfigFile节点,但并没有读取所有的配置文件,包括pom.xml。或者说pom.xml在Joern眼中不算是个配置文件。

img

即便是读取了application.properties这个文件,但ConfigFile节点只有文件内容,并没有对所有的配置做分析转化。而且有时候configFile就是完全空的,也不知道问题在哪。

img

这个处理方式虽然很奇怪但也算能理解,Joern作为一个静态分析代码的框架,他的理念就是把上层和下层做拆分,下层只需要把代码转成CPG,上层只需要在CPG上做数据分析。

对于Joern来说,上层和下层没有直通渠道,非代码层面的信息则会被忽略掉,而专注于代码层面,这是Joern的设计理念,但同样是Joern的局限性。

  • 一方面由于没有pom.xml的数据,所以无法判断Acutators是否开启,且无法判断版本。
  • 从SpringBoot 2.X开始,端点默认只暴露health和info,需要从配置文件里获取开启的端点,不一定能读到这个配置文件内容
  • Acutators这个问题核心其实是不能未授权+向公网暴露,而这个鉴权配置也是从配置文件里读到的
1
cpg.configFile.name(".*application.properties").where(_.content(".*management.security.enabled=false.*")).l
  • Acutators暴露的实际影响其实和依赖的组件有关系,比如配合eureka才有xtream反序列漏洞,而没有依赖组件数据,所以也无从判断。

postgreSQL jdbc反序列化漏洞(CVE-2022-21724)

1
2
9.4.1208 <= org.postgresql.postgresql < 42.2.25
42.3.0 <= org.postgresql.postgresql < 42.3.2

PostgreSQL的jdbc...

剩余内容已隐藏

查看完整文章以阅读更多