
Checker Python e hook di exploit configurabile per CVE-2026-90817, un RCE tramite passthru di survey e importazione dati in REDCap. Rileva le versioni, convalida gli hash dei survey e sonda la catena vulnerabile.
Checker Python 3 (e hook di exploit configurabile) per CVE-2026-90817 (Securifera / Ryan Wincey).
| Prodotto | REDCap (Vanderbilt) |
| Affetto | ≥ 13.3.0 (fino alla patch del branch) |
| Corretto | 16.0.49 LTS, 17.3.10 LTS, 17.4.4 Standard+ |
| CVSS 3.1 | 9.8 Critico |
| Auth | Nessuna — hash di survey pubblico valido (s=) richiesto per la catena completa |
| CWE | CWE-73, CWE-94 |
Da un contesto di survey pubblica, gli attaccanti possono abusare del routing __passthru (passthrough della survey) per raggiungere controller non previsti (es. Data Import), quindi attivare una gestione non sicura di file-path / stream → RCE.
Securifera non ha ancora pubblicato la catena HTTP completa (nessun PoC pubblico su GitHub / Exploit-DB al momento della pubblicazione del repo).
| Modalità | Cosa fa |
|---|---|
check | Fingerprint REDCap, euristiche di versione, survey s= valida (se hash fornito), probe __passthru → DataImport |
exploit | Esegue solo con un exploit_chain.json verificato (non l'esempio placeholder) |
exploit_chain.example.json è solo un placeholder (route/parametri ipotizzati). Non eseguirà RCE.
Dry run di ricerca: --allow-placeholder-chain (invia richieste; aspettarsi fallimento).
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
Senza un hash, il check può comunque fare fingerprint di REDCap e segnalare le finestre di versione, ma non può validare la survey o eseguire i probe passthru.
--flow mass check)
| Opzione | Descrizione |
|---|---|
-u, --url | URL base singolo (o URL|hash) |
--hash | Hash di survey pubblico (valore s=) |
--list | File target (un URL o URL|hash per riga) |
--mode | check o exploit |
--chain | Catena JSON per la modalità exploit (default exploit_chain.json) |
--allow-placeholder-chain | Consente JSON di esempio in modalità exploit (nessun RCE reale) |
-c, --command | Comando shell (modalità exploit; richiede catena funzionante) |
--threads, -j | Concorrenza massiva (default 15) |
--timeout | Timeout HTTP in secondi (default 25) |
--proxy | URL proxy HTTP(S) |
--output | Risultati JSONL (default cve_2026_90817_results.jsonl) |
--vuln-list | Check → hits.txt; exploit → exploited.txt |
--quiet, -q | Sopprime i tick di avanzamento periodici |
--flow, -f | Una riga per target completato (sito + riepilogo test) |
| File | Contenuto |
|---|---|
cve_2026_90817_results.jsonl | JSON per target |
hits.txt | Candidati (exploitable_candidate) |
status comuni (check)| Status | Significato |
|---|---|
passthru_dataimport_reachable | Survey valida + route passthru sembra Data Import |
passthru_probe_reachable | Passthru ha restituito HTTP non bloccato |
likely_vulnerable_version | Versione nella finestra affetta (survey OK, probe inconcludenti) |
redcap_version_hot_no_hash | Euristiche di versione affetta, nessun hash di survey fornito |
redcap_no_survey_hash | REDCap OK, nessun hash, versione sconosciuta |
patched / patched_no_survey | Alla versione corretta o superiore per il branch |
no_valid_survey | Hash non valido o survey non pubblica |
no_redcap | L'host non sembra REDCap |
survey_ok_version_unknown | Survey OK, stringa di versione non trovata |
__passthru esatta e i nomi dei parametri da Securifera/vendor; i default sono placeholder.vulnerable_version può essere null.title="REDCap" spesso mancano di hash di survey — le precondizioni della CVE richiedono s= da link pubblici.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
Solo per test di sicurezza autorizzati. Sei responsabile del rispetto delle leggi applicabili e delle regole del programma.