
Практическая демонстрация уязвимости Log4Shell (CVE-2021-44228)
Этот репозиторий предназначен исключительно для образовательных и демонстрационных целей в рамках курсовой работы по безопасности. Не используйте этот код в производственных средах или против систем без явного разрешения. Данная демонстрация призвана повысить осведомленность о безопасности и показать, как могут возникать сложные уязвимости, когда, казалось бы, безобидные функции, такие как логирование, разрешение имен и динамическая загрузка классов, комбинируются друг с другом.
Цель этой курсовой работы — дать глубокое понимание уязвимости Log4Shell (CVE-2021-44228), которая стала известна в декабре 2021 года и была признана одной из самых критических уязвимостей за последние годы. В работе объясняются как теоретические основы, так и проводится практическая демонстрация уязвимости.
Для практической иллюстрации уязвимости Log4Shell в этом репозитории создана изолированная и контейнеризованная среда, которая воспроизводит полный ход атаки. Демонстрация основана на трех основных компонентах:
User-Agent из HTTP-запроса, который злоумышленники могут манипулировать, чтобы использовать уязвимость.Exploit.class). Как и LDAP-сервер, этот сервер находится под контролем злоумышленника.Примечание: Дополнительная информация о настройке и запуске демонстрации находится в разделах 4. Структура проекта и настройка и 5. Демонстрация проекта.
Log4Shell — это название критической уязвимости в Java-библиотеке Log4j с идентификатором CVE-2021-44228. Она позволяет злоумышленнику с минимальными усилиями выполнить произвольный код на удаленном сервере (Remote Code Execution, сокращенно RCE).
Уязвимость затрагивает Log4j версий 2.0–2.14.1 и настолько серьезна, что многие органы безопасности, включая BSI (Федеральное ведомство по безопасности в информационной технологии), присвоили ей наивысший уровень опасности.
Log4Shell особенно опасна, потому что ...
Основная причина заключается в функциональности Log4j, которая позволяет загружать динамическое содержимое в сообщения журнала с помощью так называемых Lookups. В сочетании с JNDI (Java Naming and Directory Interface) и протоколом LDAP (Lightweight Directory Access Protocol) это позволяет загружать и выполнять удаленные вредоносные Java-классы.
Обнаружение и публикация уязвимости вызвала волну безопасности по всему миру. Многие системы пришлось срочно патчить или отключать. Впоследствии стали известны другие связанные уязвимости (например, CVE-2021-45046), что показывает, насколько глубокой и опасной была проблема.
Далее подробно описываются задействованные технологии и их взаимодействие, чтобы глубже понять уязвимость.
Log4j — это библиотека, созданная Apache для регистрации событий в Java-приложениях. Логирование является центральным инструментом в разработке программного обеспечения для мониторинга систем или анализа ошибок. Log4j — одна из самых известных и широко используемых платформ ведения журналов в экосистеме Java, применяемая как в небольших приложениях, так и в крупных корпоративных системах.
Во время работы программы возникают, например, следующие события:
Эти события можно документировать с помощью журналов (логов), обычно в виде текстового вывода на консоль, в файлы или по сетевым протоколам на центральные серверы журналов. Благодаря разумному логированию можно понять, что приложение когда сделало.
Log4j предоставляет гибкую, высоконастраиваемую инфраструктуру для создания и обработки сообщений журнала. К основным функциям относятся:
DEBUG, INFO, WARN, ERROR), с помощью которых можно управлять детализацией журнала.Другие функции, актуальные для данной курсовой работы, будут рассмотрены в последующих разделах, в частности функциональность заполнителей и функциональность поиска (Lookup).
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;
public class Example { private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.info("Starte Anwendung...");
}
}
В этом простом примере создается или извлекается экземпляр логгера, если он уже существует. Затем выводится сообщение журнала на уровне `INFO`. Log4j занимается форматированием и выводом сообщения на основе конфигурации. Пример конфигурации может выглядеть следующим образом:```xml
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Эта конфигурация определяет Appender, который выводит лог-сообщения в формате Datum Uhrzeit Log-Level Loggername - Nachricht на консоль. Затем этот Appender назначается Root-Logger, который обрабатывает все лог-сообщения, начиная с уровня INFO.
Вывод может выглядеть так:``` 2023-10-01 12:00:00 INFO Example - Starte Anwendung...
Теперь перейдем к конкретным функциям Log4j, которые наиболее актуальны для уязвимости Log4Shell.
#### Заполнители в сообщениях лога