
Python-чекер и эксплойт-хук для CVE-2026-90817 — критической неаутентифицированной RCE в REDCap через маршрутизацию survey __passthru, с массовым сканированием и импортом целей из FOFA.
Python 3 чекер (и настраиваемый эксплойт-хук) для CVE-2026-90817 (Securifera / Ryan Wincey).
| Продукт | REDCap (Vanderbilt) |
| Уязвимые версии | ≥ 13.3.0 (до патча в ветке) |
| Исправлено | 16.0.49 LTS, 17.3.10 LTS, 17.4.4 Standard+ |
| CVSS 3.1 | 9.8 Критический |
| Аутентификация | Не требуется — для полной цепочки нужен валидный публичный хеш опроса (s=) |
| CWE | CWE-73, CWE-94 |
Из контекста публичного опроса злоумышленники могут злоупотребить маршрутизацией __passthru (passthrough опроса) для доступа к непредусмотренным контроллерам (например, Data Import), а затем вызвать небезопасную обработку путей к файлам / потоков → RCE.
Securifera пока не опубликовала полную HTTP-цепочку (на момент публикации репозитория нет публичного PoC на GitHub / Exploit-DB).
| Режим | Что делает |
|---|---|
check | Фингерпринт REDCap, эвристика версии, валидный опрос s= (если указан хеш), пробы __passthru → DataImport |
exploit | Запускается только с проверенным exploit_chain.json (не с примером-заглушкой) |
exploit_chain.example.json — только заглушка (предполагаемые маршруты/параметры). Она не приведёт к RCE.
Исследовательский прогон: --allow-placeholder-chain (отправляет запросы; ожидается неудача).
pip install -r requirements.txtpip install -r requirements.txt
# Single target (survey hash required for survey + passthru tests)
python poc.py -u https://redcap.example.edu/redcap --hash Ab12Xy34Zq --mode check
# Shorthand: base|hash
python poc.py -u "https://redcap.example.edu/redcap|Ab12Xy34Zq" --mode check
# Mass check (one URL per line, optional |hash)
python poc.py --list targets.example.txt --mode check -j 20 -q
# Live stream: every host + test summary (recommended for long lists)
python poc.py --list targets.example.txt --mode check -j 20 -q --flow
# Exploit (after advisory → real exploit_chain.json)
cp exploit_chain.example.json exploit_chain.json # edit with real values
python poc.py -u https://redcap.example.edu/redcap --hash XXX --mode exploit -c id \
--chain exploit_chain.json
# Place export as fofa_csv_7561.csv (or any fofa*.csv), then:
python fofa_to_list.py
# Writes list.txt (gitignored) and normalizes the CSV with a url column
python poc.py --list list.txt --mode check -j 20 -q --flow
https://uni.edu/redcap|SurveyHash10
https://uni.edu/redcap?s=SurveyHash10
https://uni.edu/redcap
Без хеша check всё ещё может определить фингерпринт REDCap и отметить диапазоны версий, но не может проверить опрос или запустить пробы passthru.
--flow)
| Опция | Описание |
|---|---|
-u, --url | Один базовый URL (или URL|hash) |
--hash | Публичный хеш опроса (значение s=) |
--list | Файл целей (один URL или URL|hash на строку) |
--mode | check или exploit |
--chain | JSON-цепочка для режима exploit (по умолчанию exploit_chain.json) |
--allow-placeholder-chain | Разрешить пример JSON в режиме exploit (без реального RCE) |
-c, --command | Shell-команда (режим exploit; нужна рабочая цепочка) |
--threads, -j | Массовая конкурентность (по умолчанию 15) |
--timeout | Таймаут HTTP в секундах (по умолчанию 25) |
--proxy | URL HTTP(S)-прокси |
--output | Результаты JSONL (по умолчанию cve_2026_90817_results.jsonl) |
--vuln-list | Check → hits.txt; exploit → exploited.txt |
--quiet, -q | Подавить периодические тики прогресса |
--flow, -f | Одна строка на завершённую цель (сайт + сводка тестов) |
| Файл | Содержимое |
|---|---|
cve_2026_90817_results.jsonl | JSON по каждой цели |
hits.txt | Кандидаты (exploitable_candidate) |
status (check)| Статус | Значение |
|---|---|
passthru_dataimport_reachable | Валидный опрос + маршрут passthru похож на Data Import |
passthru_probe_reachable | Passthru вернул незаблокированный HTTP |
likely_vulnerable_version | Версия в уязвимом диапазоне (опрос OK, пробы неубедительны) |
redcap_version_hot_no_hash | Эвристика уязвимой версии, хеш опроса не указан |
redcap_no_survey_hash | REDCap OK, хеша нет, версия неизвестна |
patched / patched_no_survey | На уровне исправленной версии для ветки или выше |
no_valid_survey | Хеш невалиден или опрос не публичный |
no_redcap | Хост не похож на REDCap |
survey_ok_version_unknown | Опрос OK, строка версии не найдена |
__passthru и имён параметров от Securifera/вендора; значения по умолчанию — заглушки.vulnerable_version может быть null.title="REDCap" часто не содержат хешей опросов — для предусловий CVE нужен s= из публичных ссылок.title="REDCap"
body="redcap_version"
body="/surveys/?s="
.
├── poc.py
├── fofa_to_list.py
├── exploit_chain.example.json
├── poc.png # example --flow terminal output
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
Только для авторизованного тестирования безопасности. Вы несёте ответственность за соблюдение применимых законов и правил программ.