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 до актуальной безопасной версии.
- Для проектов на Java 8 и выше: обновите Log4j до версии 2.17.1 или выше.
- Для проектов на Java 7: обновите Log4j до версии 2.12.4.
- Для проектов на 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 (которая помогала против первой уязвимости) в данном случае недостаточна.
- Удалите класс
JndiLookupиз classpath. Это гарантирует, что механизм JNDI не сможет быть вызван.
Для Linux/Unix:
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
-
В конфигурации логирования (log4j2.xml) замените паттерны контекста потока (Thread Context Map), такие как
%X,%mdcили%MDC, на статический текст или удалите их, если они принимают внешние данные. -
Ограничьте исходящий трафик с серверов приложений на уровне Firewall (L3/L4) и Proxy (L7), запретив соединения по протоколам LDAP, LDAPS, RMI и DNS на недоверенные внешние адреса.