白帽故事 · 2022年4月2日 0

Spring4Shell?

首先本文不涉及漏洞的具体复现与POC,如果你想从本文中获得这些信息,恐怕你要失望了!

背景介绍

话说今天一早,骨哥被一位妹纸在微信上直击灵魂的询问道:“能给说说Spring Framework的RCE漏洞不?“,骨哥当时的内心是:

说实话,最近的骨哥除了各种工作上的事情外就是被各种Fuzz报错困在其中,依稀记得前几天在某个群里瞟到过一眼Spring漏洞。

为了给妹纸一个满(提)意(升)答(好)复(感),于是就有了今天这篇文章,当然时间仓促,文章内容可能会有错误,也欢迎大家指正。

起因

首先是CVE-2022-22963(Spring Cloud Function 中的 SpEL 表达式注入漏洞),该漏洞由绿盟于 3 月 28 日披露。

然后就是今天所说的这枚RCE 漏洞,也被网友们称为“Spring4Shell/Springshell”,在Spring Framework 中基于 Java的 核心模块中被发现。

随后安全圈的一些大佬也是频频暗示和发声:

而这枚RCE漏洞的POC据说最初是由一位国内安全研究员(GitHub上ID:helloexp)首先发布在Github,当然该POC很快被删除,但毕竟互联网是有‘记忆’的。

CVE-2022-22965

很快Rapid7 与其它安全公司以及Spring.io 共同证实了该0day漏洞的存在,目前该漏洞被追踪为CVE-2022-22965。

2021 年底,被阿里云安全团队发现的 Apache Log4j2 远程代码执行漏洞(也称为Log4Shell ) 似乎还‘热情未消’,此时又爆出Spring的RCE漏洞,着实让各大公司IT运维人员神经紧绷。

对比

首先我们来看一张图(一图胜千言):

无论是22963还是22965,这两个漏洞级别同属“严重”级,两个漏洞针对的组件不同,22963针对的是Spring Cloud,而22965针对的是Spring Framework,相较而言,22965涉及的面更广。目前这两个漏洞的官方均已提出修复方案,升级Spring版本即可。

当然如果出于业务考虑,暂时无法升级Spring Framework版本的话,安全厂商也给出了一些临时应急方案:

  • 在WAF等安全设备上,根据实际流量情况对“class.”、“Class.”、“.class.”、“.Class.”等字符串进行规则过滤(当然,规则设置好以后最好进行测试,避免对业务造成影响)
  • 在应用中全局搜索@InitBinder注解,查看方法体中是否调用了dataBinder.setDisallowedFields方法,如果找到这段代码片段的描述,将{class.,Class. to the original blacklist ,*.class., *.Class.}。(注:如果这个代码片段使用的比较多,需要多处追加)
  • 在应用程序系统的项目包下创建全局类,并确保这个类由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 GlobalControllerAdvice{ 

             @InitBinder

             public void setAllowedFields(webdataBinder dataBinder){

             String[]abd=new string[]{"class.*","Class.*","*.class.*","*.Class.*"};

             dataBinder.setDisallowedFields(abd);

             }

成因

CVE-2022-22965(Spring4Shell) 成功绕过了CVE-2010-1622中阻止远程代码执行的补丁,该补丁删除了反序列化功能,如下所示:

该漏洞会影响使用RequestMapping注解和 POJO(Plain Old Java Object)绑定的参数值,RequestMapping 使用id 的setter和getter来设置和获取特定参数的值。所以漏洞与Log4J的反序列化利用并不相同。

因此,如上项目如果托管在Tomcat,就可以通过输入特定的curl命令修改Tomcat的日志记录属性,从而在Tomcat根目录中上传WebShell。

利用条件

当然,要利用该漏洞,必须满足如下5个条件:

  • Spring Framework 版本 为5.3.0 到 5.3.17、5.2.0 到 5.2.19 以及更早版本
  • JDK 9或更高版本
  • 将Apache Tomcat作为Servlet容器
  • 以war包形式部署
  • 依赖于Spring-webmvc或Spring-WebFlux

同理,该漏洞的利用条件也相较Log4J困难很多。

参考资料

https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement

https://www.cyberkendra.com/2022/03/spring4shell-details-and-exploit-code.html

https://sysdig.com/blog/cve-2022-22965-spring-core-spring4shell/

https://www.lunasec.io/docs/blog/spring-rce-vulnerabilities/

https://www.infoq.cn/article/yKWU6v6UktvAtvxVvQ2W