CVE-2021-45046

Apache Log4j2

ВЫСОКАЯ ВЕРОЯТНОСТЬ

Дата обнаружения

2023-05-01

Официальное описание

Apache Log4j2 contains a deserialization of untrusted data vulnerability due to the incomplete fix of CVE-2021-44228, where the Thread Context Lookup Pattern is vulnerable to remote code execution in certain non-default configurations.

🛡️
Технический анализ и план устранения

Суть уязвимости

CVE-2021-45046 возникла из-за неполного исправления предыдущей критической уязвимости (Log4Shell, CVE-2021-44228). В версиях Log4j 2.15.0 ограничение доступа к JNDI-лукапам было реализовано не полностью.

При использовании специфических конфигураций (например, использование Thread Context Map с паттерном %X, %mdc или %MDC), злоумышленник может создать специально сформированные входные данные, содержащие рекурсивный лукап. Это позволяет обойти защиту, привести к отказу в обслуживании (DoS) или, в определенных условиях, к удаленному выполнению кода (RCE), если злоумышленник может контролировать данные в Thread Context.

Как исправить

Единственным надежным способом устранения уязвимости является обновление библиотеки Log4j до актуальной безопасной версии.

  1. Для проектов на Java 8 и выше: обновите Log4j до версии 2.17.1 или выше.
  2. Для проектов на Java 7: обновите Log4j до версии 2.12.4.
  3. Для проектов на Java 6: обновите Log4j до версии 2.3.2.

Если вы используете Maven, обновите версию в pom.xml:

<properties>
    <log4j2.version>2.17.1</log4j2.version>
</properties>

Если вы используете Gradle, обновите build.gradle:

implementation 'org.apache.logging.log4j:log4j-core:2.17.1'
implementation 'org.apache.logging.log4j:log4j-api:2.17.1'

Временные меры

Если немедленное обновление версии библиотеки невозможно, необходимо применить следующие компенсирующие меры контроля. Обратите внимание, что установка системного свойства log4j2.formatMsgNoLookups=true (которая помогала против первой уязвимости) в данном случае недостаточна.

  1. Удалите класс JndiLookup из classpath. Это гарантирует, что механизм JNDI не сможет быть вызван.

Для Linux/Unix:

zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

  1. В конфигурации логирования (log4j2.xml) замените паттерны контекста потока (Thread Context Map), такие как %X, %mdc или %MDC, на статический текст или удалите их, если они принимают внешние данные.

  2. Ограничьте исходящий трафик с серверов приложений на уровне Firewall (L3/L4) и Proxy (L7), запретив соединения по протоколам LDAP, LDAPS, RMI и DNS на недоверенные внешние адреса.