Spring Framework RCE (CVE-2022-22965) 漏洞复现与Introspector内省机制分析

本文将复现 Spring Framework RCE 漏洞 (CVE-2022-22965),并深入探讨漏洞相关的 Java 内省机制 Introspector 以及 Spring 框架对其的缓存管理。

Introspector(内省) 模块

Introspector(内省)模块是 Java 中用于处理 JavaBean 的工具类,其主要功能是获取 JavaBean 中的描述符号,例如属性、方法、事件等。Introspector 包含以下几个关键类:

  • BeanInfo:提供关于 JavaBean 的信息,例如属性、方法、事件等。* PropertyDescriptor:描述 JavaBean 的属性。* MethodDescriptor:描述 JavaBean 的方法。* BeanDescriptor:描述 JavaBean 本身。* EventSetDescriptor:描述 JavaBean 的事件。* ParameterDescriptor:描述 JavaBean 方法的参数。

在标准的 JavaBean 中,可以使用 Introspector 体系解析 JavaBean,快速获取 JavaBean 的 Setter 和 Getter 方法,方便反射操作。

Spring 中的 Introspector 缓存管理

JDK 会对 Introspector 的内省信息进行缓存,但这些缓存无法被垃圾回收机制回收,可能导致内存溢出。为了解决这个问题,Spring 采取了两种方式:

  1. 配置 IntrospectorCleanupListener: 该监听器会在应用关闭时清理 Introspector 的缓存。2. 使用 CachedIntrospectionResults 类: 这是更优雅的处理方式,Spring 通过 CachedIntrospectionResults 类自行管理 Introspector 的缓存,避免刷新整个 Introspector 缓存缓冲区,影响其他应用。

CachedIntrospectionResults 类将原本由 JDK 管理的 Introspector 缓存接管,由 Spring 自行管理。在 SpringBoot 应用启动过程中,AbstractApplicationContext#refresh() 方法的 finally 代码块中会调用 AbstractApplicationContext#resetCommonCaches() 方法清理缓存,其中就包括调用 CachedIntrospectionResults#clearClassLoader(getClassLoader()) 方法清理指定 ClassLoader 下的所有 Introspector 缓存引用。

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

CVE-2022-22965 漏洞正是由于 SpringBoot 处理 Introspector 缓存管理不当导致的。攻击者可以通过构造恶意请求,利用该漏洞在目标服务器上执行任意代码。

漏洞产生的原因:

Spring Framework 在特定条件下,例如使用特定版本的 JDK 和 Spring Framework,攻击者可以通过构造恶意请求,绕过 Spring 的安全机制,修改 CachedIntrospectionResults 类中缓存的 Introspection 信息。攻击者可以注入恶意代码到缓存中,当应用程序调用相关 JavaBean 的 Getter 或 Setter 方法时,就会触发恶意代码执行。

漏洞修复:

Spring 官方已发布了针对该漏洞的补丁,建议用户及时升级到安全版本。

总结:

CVE-2022-22965 漏洞的根源在于 Spring Framework 对 Introspector 缓存管理的疏忽,导致攻击者可以利用该漏洞进行远程代码执行攻击。


原文地址: https://www.cveoy.top/t/topic/laCi 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录