
Воспроизводимое исследование CVE-2024-36401: неаутентифицированное удаленное выполнение кода (RCE) в GeoServer через внедрение JXPath eval. Включает технический отчет, рабочий эксплойт/верификатор и среду Docker, демонстрирующую уязвимость на уязвимых и исправленных экземплярах.
Полное, воспроизводимое исследование CVE-2024-36401 — неаутентифицированной уязвимости удаленного выполнения кода в GeoServer, самом распространенном сервере с открытым исходным кодом для геопространственных данных. Ошибка представляет собой инъекцию eval: через параметры стандартов OGC GeoServer передает управляемые атакующим имена свойств в GeoTools, где Apache Commons JXPath обрабатывает их как выражения XPath и, по замыслу, может вызывать произвольные методы Java через рефлексию. Таким образом, неаутентифицированный запрос, такой как exec(java.lang.Runtime.getRuntime(),'id'), выполняет команды на хосте.
Этот репозиторий содержит технический отчет, рабочий эксплойт/верификатор и среду Docker для одной команды, которая демонстрирует RCE на уязвимом экземпляре и показывает, что тот же эксплойт не срабатывает на исправленном.
Образовательный проект. Создан для университетского курса (Приватность и безопасность данных, LUISS DASMA). Все работает только против локальных изолированных контейнеров — см. Ответственное использование.
.
├── report/
│ ├── report.pdf # полный технический отчет (прочитайте его первым)
│ ├── report.md # исходник отчета (Pandoc/XeLaTeX)
│ └── images/ # иллюстрации и скриншоты
├── docker/
│ ├── vulnerable/Dockerfile # GeoServer 2.25.1 (уязвимый)
│ └── patched/Dockerfile # GeoServer 2.25.2 (исправленный)
├── docker-compose.yml # уязвимый на :8080, исправленный на :8081
├── exploit/
│ ├── exploit.py # эксплойт + верификатор уязвимости/исправления (только стандартная библиотека)
│ ├── exploit.sh # PoC на основе curl (варианты GET и POST)
│ ├── payloads.md # каталог полезных нагрузок для каждой конечной точки OGC
│ └── output/ # захваченные журналы доказательств и транскрипты
└── run-reproduction.sh # одна команда: сборка + эксплойт обоих + сбор доказательств
Требования: запущенный Docker Desktop, python3, curl.
# Соберите оба контейнера, запустите эксплойт против каждого и соберите доказательства
chmod +x run-reproduction.sh
./run-reproduction.sh
Или пошагово:
docker compose up -d --build # уязвимый на :8080, исправленный на :8081
# Уязвимый (ожидается: VULNERABLE, задержка ~8с)
python3 exploit/exploit.py -t http://localhost:8080/geoserver --label vuln -o exploit/output
# Исправленный (ожидается: PATCHED, немедленное отклонение)
python3 exploit/exploit.py -t http://localhost:8081/geoserver --label patched -o exploit/output
docker compose down # когда закончите
Два независимых зонда делают результат однозначным:
java.lang.Thread.sleep(8000) блокирует поток, обрабатывающий XPath, поэтому HTTP-ответ задерживается на ~8 с — измеримо со стороны клиента, без доступа к контейнеру. Это тот же канарейка, используемый в тестах официального исправления.exec(java.lang.Runtime.getRuntime(),'touch /tmp/<marker>') создает файл внутри контейнера, что можно проверить с помощью docker exec.На уязвимом экземпляре отправка полезной нагрузки вручную возвращает ClassCastException на ProcessImpl — JVM выполнила Runtime.exec, а затем не смогла использовать полученный объект Process в качестве атрибута. Это исключение и есть доказательство выполнения:

Коммит GeoTools e53e5170 (в GeoServer
2.25.2, 2.24.4, 2.23.6, 2.22.6) применяет эшелонированную защиту к обеим половинам ошибки:
JXPathUtils.newSafeContext(...) устанавливает пустую FunctionLibrary, поэтому JXPath больше не может разрешать exec/Thread.sleep как функции — строка остается обычным именем свойства.FeaturePropertyAccessorFactory теперь также проверяет SimpleFeatureType, поэтому простые функции больше не достигают уязвимого аксессора.На исправленном экземпляре та же полезная нагрузка возвращает No such attribute: ... и ничего не выполняется.
Полные детали — затронутый код с указанием файлов/строк, эксплуатация, diff исправления и воспроизведение бок о бок — находятся в report/report.pdf.
Этот CVE является общедоступным, был исправлен более 18 месяцев назад, находится в каталоге CISA Known Exploited Vulnerabilities и имеет общедоступные PoC (Vulhub, Nuclei, Metasploit). Код здесь нацелен только на localhost и изолированные учебные контейнеры в этом репозитории. Не используйте его против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.
MIT © 2026 Daniele Giovanardi
Daniele Giovanardi — Data Science and Management (DASMA), LUISS Guido Carli. Курсовая работа по Приватности и безопасности данных.
| Поле | Значение |
|---|
| CVE (GeoServer) | CVE-2024-36401 |
| Коренная причина (GeoTools) | CVE-2024-36404 |
| Тип | Неаутентифицированное удаленное выполнение кода |
| CWE | CWE-95, Eval Injection |
| CVSS v3.1 | 9.8 Critical (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Затронутые версии | GeoServer < 2.25.2 / GeoTools < 31.2 (и более ранние ветки) |
| CISA KEV | Да (15 июля 2024) |
| Изученные версии | Уязвимая 2.25.1, исправленная 2.25.2 |