log4j2 漏洞说明及修复说明

1,375 阅读4分钟

我不入地狱,谁入地狱。如果大家觉得有用,可以点赞支持一下。如果有疑问可以交流,有错误也可以直接指出。

Palo Alto Networks 帕洛阿尔托网络公司 发布的说明

 https://unit42.paloaltonetworks.com/apache-log4j-vulnerability-cve-2021-44228/ 

\

对我们现有的服务来说,影响的范围主要是 spring-boot-starter 引入的 log4j2

image.png

攻击方式:

log4j 2.x支持一种名为lookups, 通常用于为用户灵活地设置log4j配置。关于查找的官方介绍如下:

''

Lookups provide a way to add values to the log4j configuration at arbitrary places. They are a particular type of Plugin that implements the StrLookup interface.

查找提供了一种在任意位置向 log4j 配置添加值的方法。它们是实现StrLookup接口的特定类型的插件。

'''

普通用户可以使用此功能,方便灵活地在任意位置使用预先设计的格式向配置添加值。具体来说,在应用程序中调用log方法时,log4j 2.x会调用formage方法来检查每个日志中的特定字符${。

如果存在这些字符,将调用 Java 方法查找以查找字符${后面的字符串,然后将字符${后面的表达式替换为之前找到的实际值。例如,当在应用程序中调用 log 函数来记录图 1 中所示的内容时,字符${后面的字符串java:runtime 、java:vm和java:os将被视为查找方法的参数,最后替换为相应的值,

功能查找支持多种类型的查找,例如 Jndi 查找、JVM 输入参数查找 (JMX) 和 Web 查找。Jndi 查找允许 JNDI 检索变量。在 Jndi 查找中,支持多种协议来进行远程查找,例如 LDAP 和 RMI。如果日志包含图 2 中所示的字符串,则将调用 Java 方法查找以查找字符串jndi:logging/context-name。

考虑到日志内容通常向用户公开,并且攻击者可以在许多应用程序中轻松控制日志内容,因此,一旦攻击者控制了如图 3 所示的字符串,并在攻击者控制的 LDAP 服务器上设置了恶意 Java 类,则查找方法将用于在远程 LDAP 服务器上执行恶意 Java 类。

关键名词:

JNDI

JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互、

LDAP

轻型目录访问协议英文Lightweight Directory Access Protocol缩写LDAP,/ˈɛldæp/)是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。

RMI www.jianshu.com/p/de85fad05…

RMI简介

​ Java RMI,即 远程方法调用(Remote Method Invocation),一种用于实现远程过程调用(RPC)(Remote procedure call)的Java API, 能直接传输序列化后的Java对象和分布式垃圾收集。它的实现依赖于Java虚拟机(JVM),因此它仅支持从一个JVM到另一个JVM的调用。

image.png
\

漏洞排查方式:

最根本的原因是 lookup 类提供了JNDI的查找访问,即使是不安全的不可信的第三方服务,而日志的内容,用户很容易控制。这个bug是由阿里云安全团队的成员发现的(Credit: This issue was discovered by Chen Zhaojun of Alibaba Cloud Security Team. )在bug说明里也提到了 “LDAP需要限制其可以访问的服务器和类。默认情况下,JNDI应该只支持java、ldap和ldaps协议。” 

所以有两个基本的排查方式:

  1. 首先查看项目里是否有引用 log4j-core 包
  2. 查看项目里是否有这个类 org/apache/logging/log4j/core/lookup/JndiLookup.class 

不发版的修复方式:

基本原理就是

  1. 禁用Lookups 方法,或者移除 JndiLookUp 文件(类)
  2. 禁用 JNDI

安全版本:2.15.0-rc2

Since the original patch was discovered to be bypassed, in the interest of implementing as many protections against this vulnerability as possible, the following mitigations are also recommended:

  • Disable suspicious outbound traffic, such as LDAP and RMI on the server in PANW Firewall.

  • Disable JNDI lookup.

    • Set up log4j2.formatMsgNoLookups=true
    • Remove the JndiLookup file in the log4j-core and restart the service.
  • Disable JNDI

    • Set up spring.jndi.ignore=true

Palo Alto Networks will continue to monitor the situation and update this document with any new findings or information.

image.png