Log4j漏洞深度回顾系列之一:攻击背景​

云计算
Akamai将结合自身技术团队的了解,Akamai与全球客户合作过程中应对该漏洞和其他安全隐患所积累的经验,以及Akamai对整个互联网流量的洞察,向大家介绍Log4j漏洞的起因、传播范围、利用方式、演变路径。

开源日志记录工具Apache Log4j曾被爆出一个严重的远程代码执行漏洞,攻击者可以借此构造恶意请求,触发远程恶意代码的执行。消息爆出后,该漏洞引起了极大的关注。小半年过去了,相关热度逐渐消退,是时候对整个过程进行一个彻底的总结回顾,并从中吸取教训,避免以后再遭遇类似的问题。

加入Client-Side Protection & Compliance,防范每一次用户数据外泄!

符合 PCI DSS v4.0 标准,助您严防网站恶意代码和漏洞!

进一步了解Akamai的网络安全服务方案

这一系列文章总共分为四篇,Akamai将结合自身技术团队的了解,Akamai与全球客户合作过程中应对该漏洞和其他安全隐患所积累的经验,以及Akamai对整个互联网流量的洞察,向大家介绍Log4j漏洞的起因、传播范围、利用方式、演变路径,以及最重要的:我们所有人都需要从中吸取的教训。

这就开始吧,本篇主要介绍Log4j漏洞的一些背景信息。

一、时间线

20211124日,Apache基金会接到通知,称已被广泛使用的,基于Java的日志库工具Log4j存在重大漏洞,可能导致隐私信息泄漏和远程代码执行(RCE)。而该漏洞自2013年就一直存在了

第二天,Apache基金会保留了CVE-2021-44228并开始研究解决方案。接下来的12天里,为了解决此问题,他们对源代码进行了多处修改,并于2021129日公开披露了这个漏洞

公布后,围绕该漏洞开始出现如洪水般的攻击尝试,并且在那之后,攻击规模和范围一直以惊人的速度增长

二、Log4j到底是什么

要真正理解该漏洞,首先需要知道Log4j到底是什么。Log4jJava社区中一个被开发者广泛使用的库,提供了一个简单但强大的框架,可用于记录错误信息、诊断信息等

Log4j提供了很多让人印象深刻的功能,其中之一是将日志记录至多个目标位置,包括但不限于控制台、文件、远程TCP服务器、SyslogNT Event Log以及电子邮件。此外,它还支持对日志消息、日志事件、自定义布局等内容进行分层过滤

简而言之,Log4j提供了完整丰富的功能,使其受到开发者的广泛欢迎,从而导致从Web应用程序到嵌入式设备,各种地方都能见到Log4j的身影

三、查找和嵌

Log4j支持多种强大功能,其中最知名的功能之一应该是查找(Lookup)。该功能使得开发者可以将变量或表达式嵌入到Log4j在进行输出之前自动评估的文本中。例如,开发者可以编写代码将下列文本记入日志

“${date:MM-dd-yyyy} All Systems Good”

Log4j会将其中的模式${date:MM-dd-yyyy}识别为一种日志查找,并尽职地将该表达式替换为今天的日期。举例来说,如果今天是20211220日,那么在将上述日志输出到目标位置前,Log4j会将其内容改为

“12-20-2021 All Systems Good”

对开发者来说这很方便。如果不使用这种功能,开发者必须手工编写代码查询日期,将格式调整为字符串,将其附加到日志行,然后输出。尽管这样的代码写起来并不麻烦也不费事,但毕竟与软件的核心业务逻辑毫无关系,并且最终也会在一个个项目中不断延续下去

通过使用Log4j库中现成的功能,开发者可以专注于项目中更重要的开发工作,让Log4j处理与日志有关的各种任务

Log4j支持很多这种类型的查找表达式。让我们再来看看另外两个与本文内容密切相关的:envlowerenv可以将主机系统上的环境变量包含到日志行中。例如,开发者可以将下列文本记入日志

“The current user is ${env:USER}”

假设软件正在以管理员用户的身份运行,上述日志会输出如下的内容

“The current user is Administrator”

与将新数据注入文本的envdate不同,lower可用于操作已经存在的内容。Log4j会直接将表达式中出现的英文字母转换为小写形式。例如

“The lower case text is ${lower:ABCDEFG}”

会输出为

“The lower case text is abcdefg”

这个例子本身似乎感觉没什么意义,为何不自己将字母转换为小写呢?别忘了,Log4j还允许将查找表达式嵌套在一起,此时就厉害了

我们可以将前两个表达式嵌套为这种形式

“The lower case current user is ${lower:${env:USER}}”

这会导致Log4j首先将${env:USER}表达式评估为Administrator,随后将其送入lower,产生小写的administrator,最终会输出如下的内容

“The lower case current user is administrator”

四、JNDI

虽然dateenvlower都很有趣并且实用,但这个漏洞之所以能够存在,还离不开JNDI查找。JNDIJava Naming and Directory InterfaceJava命名和目录接口),是一种内置于Java开发和运行时环境中的机制,可通过一个通用接口以简单的方式查询各种目录服务中的信息

实际上,可支持的目录服务分为多种类型。例如,JNDI支持查询DNS服务器以发现主机的IP地址,并能查询ADLDAP中的目录实体。它甚至支持查询正在运行中的Java环境本身以获取Environmental Entries,例如当前正在运行的软件的专用配置选项

Log4j中的JNDI查找表达式可供开发者通过日志文本中嵌入的表达式直接访问这个极为强大的子系统。举例来说,如果开发者试图将下列字符串记入日志

“The current mail host is ${jndi:java:comp/env/mailhost}”

Log4j会将${jndi:java:comp/env/mailhost}表达式识别为JNDI查找,并将java:comp/env/mailhost这个伪URL传递给JNDI子系统。JNDI会将这种特定的URL类型识别为查询,进而在当前运行的组件查找一个名为mailhost的配置选项

假设该选项被配置为http://mymailserver.example.com,JNDI会将该信息回传给Log4j,随后Log4j会将查找表达式替换为http://mymailserver.example.com,并产生如下的输出结果

“The current mail host is mymailserver.example.com”

五、理解该漏洞的存

简而言之,Apache Log4j的这个漏洞为攻击者提供了一种重大的机会,因为该库广受欢迎,尤其是其查找、嵌套和JNDI功能更是如此。虽然这些功能为开发者提供了很大的便利,但也催生了可能借此通过请求泄漏数据或导致远程代码执行的机会。了解这些背景信息后,我们可以开始更好地理解这个漏洞,以及攻击者的利用方式了

责任编辑:张燕妮
相关推荐

2022-03-25 13:42:15

Log4j漏洞网络安全

2022-01-06 09:52:39

Log4j漏洞攻击

2021-12-14 23:44:26

漏洞Log4j项目

2021-12-23 09:47:36

Log4jRCE漏洞DoS漏洞

2022-07-27 08:15:39

漏洞Log4j网络攻击

2024-01-02 08:54:00

2022-03-30 11:29:53

漏洞补丁Spring

2022-01-12 08:57:45

网络攻击漏洞Log4j

2022-01-24 10:02:53

漏洞微软网络攻击

2021-12-13 01:49:34

漏洞Log4j代码

2021-12-23 11:03:25

Log4j 漏洞漏洞

2021-12-24 09:52:31

Traefik Log4J 漏洞

2021-12-20 09:25:02

Log4j漏洞网络攻击网络安全

2021-12-11 19:04:38

漏洞

2022-01-02 07:07:55

CISAApache Log4漏洞

2022-01-02 07:04:22

Log4jRCE漏洞DoS漏洞

2022-02-15 17:51:38

Log4j漏洞网络安全

2022-02-13 16:18:57

JetBrainsIntelliJLog4j

2021-12-29 14:47:43

Apache团队Log4j漏洞

2021-12-16 12:27:15

Log4j漏洞网络安全
点赞
收藏

51CTO技术栈公众号