Spring-Framework-RCE-CVE-2022-22965漏洞分析

💡 原文中文,约8400字,阅读约需20分钟。
📝

内容提要

本文分析Spring Framework远程代码执行漏洞CVE-2022-22965,详细解析攻击载荷构造,利用Tomcat访问日志配置和JDK模块特性绕过防护,通过嵌套属性访问器实现恶意JSP写入并执行命令,同时探讨漏洞成因、修复方案及环境搭建问题。

🔎

延伸解读

漏洞利用链的关键:Tomcat Access Log Valve

攻击者利用Tomcat的AccessLogValve配置,通过修改pattern、suffix、prefix等属性,将恶意JSP内容写入webapps目录。%{...}i语法支持从请求头中动态取值,使得攻击载荷可以隐藏在HTTP头中,增加隐蔽性。理解这一机制有助于防护时关注Tomcat日志配置的异常修改。

JDK模块化(JPMS)如何绕过旧修复

JDK9引入的模块系统(JPMS)改变了Java反射和属性访问的边界。此前针对CVE-2010-1622的修复通过过滤特定属性名(如class.classLoader)来阻止攻击,但模块化后,攻击者可以利用module属性绕过黑名单,访问到classLoader。这提醒我们,安全修复需考虑语言和运行时特性的演进。

嵌套属性访问器:攻击路径的基石

Spring的AbstractNestablePropertyAccessor支持嵌套属性路径(如class.module.classLoader...),它通过递归解析点分隔的路径来设置属性。攻击者正是利用这一机制,从class对象出发,逐步导航到Tomcat的Pipeline配置。理解这一机制有助于识别类似的风险点,并评估属性绑定的安全性。

修复方案的局限与临时缓解

官方修复通过黑名单方式禁止classLoader和ProtectionDomain等类型,但黑名单可能被绕过。临时缓解方案使用WebDataBinder的setDisallowedFields过滤危险字段,但需注意其覆盖范围。部署时建议同时升级Spring版本、限制请求参数绑定,并监控异常访问日志写入行为。

Q&A

CVE-2022-22965漏洞的利用原理是什么?

该漏洞是Spring Framework中的远程代码执行漏洞,攻击者通过构造特殊的HTTP请求,利用Spring的BeanWrapper和嵌套属性访问机制,修改Tomcat的AccessLogValve配置,将恶意JSP代码写入web目录,从而执行任意命令。

CVE-2022-22965的payload是如何构造的?

payload由请求头和请求体组成。请求头中定义了suffix、c1、c2等变量,请求体通过class.module.classLoader.resources.context.parent.pipeline.first.pattern等参数设置Tomcat访问日志的pattern、suffix、directory、prefix和fileDateFormat,将恶意JSP代码写入webapps/ROOT目录,生成webshell。

Tomcat Access Log在CVE-2022-22965中扮演什么角色?

Tomcat的AccessLogValve用于配置访问日志,其属性如pattern、suffix、prefix等可以被攻击者通过Spring的属性绑定修改。攻击者将恶意JSP代码写入pattern,并设置suffix为.jsp,从而在web目录生成可执行的JSP webshell。

JDK模块特性如何绕过CVE-2022-22965的修复?

JDK9引入的JPMS模块系统允许通过getModule()方法访问模块信息,而之前的修复方案只过滤了class属性,未考虑module属性。攻击者利用class.module.classLoader链绕过黑名单,访问到ClassLoader并进一步修改Tomcat配置。

Spring的AbstractNestablePropertyAccessor嵌套结构如何导致漏洞?

AbstractNestablePropertyAccessor支持嵌套属性访问,如class.module.classLoader.resources...,它通过递归解析属性路径,允许攻击者访问内部对象属性。由于未对敏感属性进行限制,攻击者可以修改Tomcat的AccessLogValve配置。

CVE-2022-22965的官方修复方案是什么?

官方修复方案是在CachedIntrospectionResults中直接判断属性描述符的类型,将ClassLoader和ProtectionDomain等类加入黑名单,禁止访问这些类的属性。

如何临时修复CVE-2022-22965漏洞?

临时修复方案是通过@ControllerAdvice和@InitBinder设置WebDataBinder的disallowedFields,将class.*、Class.*等字段加入黑名单,从而在数据绑定阶段过滤恶意请求。

在IDEA中调试CVE-2022-22965时需要注意什么?

使用IDEA热部署调试时,需要选择exploded部署方式,并注意输出路径。如果不写绝对路径,webshell会输出到临时路径(如C:\Users\{Name}\AppData\Local\JetBrains\IntelliJIdea2021.3\tomcat),导致无法访问。

🏷️

标签

➡️

继续阅读