Spring RCE远程执行漏洞(CVE-2022-22965)

Spring RCE远程执行漏洞(CVE-2022-22965)

这个洞22年3月底被大佬发现公布,由于Spring框架的影响范围太大了。复现条件又很低,本身就是高危的RCE漏洞可以直接拿到服务器的shell,像作者说的一样确实是一个核弹漏洞。

影响范围

JDK>8

Spring Framework<5.3.18

Spring Framework<5.2.20

条件

类对象中有get/set方法

Spring controller接口中有对象传入

漏洞原理

User类,有name和Department两个属性

public class User {
   
   
    private String name;
    private Department department;public String getName() {
   
   
        return name;
    }public void setName(String name) {
   
   
        this.name = name;
    }public Department getDepartment() {
   
   
        return department;
    }public void setDepartment(Department department) {
   
   
        this.department = department;
    }}

Department类具有name属性

public class Department {
   
   
    private String name;

    public String getName() {
   
   
        return name;
    }

    public void setName(String name) {
   
   
        this.name = name;
    }
}

一会准备测试的接口,注意:其中并没有调用User的get/set方法

@Controller
public class UserController {
   
   
    @RequestMapping("/testUser")
    public @ResponseBody String testUser(User user) {
   
   
        System.out.println("==testUser==");
        return "OK";
    }
}

打断点后DEBUG启动

在这里插入图片描述
携带参数请求该接口

http://localhost:8888/testUser?name=tpa&department.name=code

User对象没有调用get/set方法但其属性却有了值,这是因为Spring的参数绑定特性,而department.name则是多级绑定。(若department中也存在一个具备name属性的area对象,传入参数department.area.name其属性也会更改。)实际上department.name在后台的调用链路为

User.getDepartment() => Department.setName()

department.area.name则为

User.getDepartment() => Department.getArea() => Area.setName()

在这里插入图片描述
因为是封装类private私有属性,能更改类的属性不直接调用get/set肯定是通过反射了。而JDK自带的一个类PropertyDescriptor就可以通过反射来获取设置对象的属性。实现Spring框架参数绑定自动调用get/set方法的关键类BeanWrapperImpl就是对其进行的封装。

public class PropertyDescriptorTest {
   
   
    public static void main(<
### 关于 CVE-2022-22965 漏洞的信息 CVE-2022-22965 是一种影响 Spring Framework 的远程代码执行 (RCE) 漏洞。此漏洞的根本原因是 JDK 9 及更高版本中的 Spring MVC 数据绑定机制存在缺陷,攻击者可以通过精心构造的数据触发该漏洞,在受影响的应用程序上实现任意代码执行[^1]。 #### 影响范围 该漏洞主要影响以下版本的 Spring Framework: - **Spring Framework 5.3.x** 版本低于 5.3.18 - **Spring Framework 5.2.x** 版本低于 5.2.20 如果应用程序运行在上述受支持但未更新的版本范围内,则可能受到威胁。 --- ### 如何在 IntelliJ IDEA 中处理 CVE-2022-22965 为了防止因 CVE-2022-22965 导致的安全风险,开发者可以采取以下措施: #### 升级 Spring Framework 到安全版本 最直接的方法是升级到不受漏洞影响的最新稳定版 Spring Framework。推荐升级至以下版本之一: - **Spring Framework 5.3.18 或更高** - **Spring Framework 5.2.20 或更高** 通过 IntelliJ IDEA 实现这一目标的具体操作如下: 1. 打开项目的 `pom.xml` 文件(对于 Maven 项目),或者 `build.gradle` 文件(对于 Gradle 项目)。 2. 修改 Spring Framework 的版本号为安全版本。例如: ```xml <!-- pom.xml --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.18</version> </dependency> ``` 对于 Gradle 用户: ```gradle // build.gradle implementation 'org.springframework:spring-core:5.3.18' ``` 3. 使用 IntelliJ IDEA 提供的功能刷新依赖项。点击右上角的 “Maven” 工具窗口并选择 “Reload All Maven Projects”,或针对 Gradle 项目同步构建脚本。 #### 配置 JDK 环境 由于漏洞仅存在于 JDK 9 和更高的环境中,因此还需要确认开发环境使用的 Java 版本是否兼容最新的补丁。建议使用以下方法验证和调整 JDK 设置: 1. 在 IntelliJ IDEA 中导航到菜单栏的 `File -> Project Structure...`。 2. 转到 `Project Settings -> Project` 页面,设置合适的 SDK 版本(如 Java 11 或以上)。 3. 如果当前安装的 JDK 不满足需求,请下载并配置新的 JDK 版本。 #### 测试修复效果 完成上述更改后,应重新测试应用以确保其正常工作并无其他潜在问题。可采用单元测试或其他自动化工具来验证功能完整性。 --- ### 补充说明 除了手动升级外,还可以借助官方发布的指南进一步加固系统安全性。例如,某些情况下可通过禁用特定 HTTP 请求参数解析器的方式缓解风险[^4]。 ```properties # application.properties spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false ``` 这些配置能够减少恶意请求对服务器的影响程度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值