
Vérificateur Python et hook d'exploit pour CVE-2026-90817, une RCE REDCap critique non authentifiée via le routage __passthru des enquêtes, avec scan de masse et import de cibles FOFA.
Vérificateur Python 3 (et hook d'exploit configurable) pour CVE-2026-90817 (Securifera / Ryan Wincey).
| Produit | REDCap (Vanderbilt) |
| Affecté | ≥ 13.3.0 (jusqu'au correctif de branche) |
| Corrigé | 16.0.49 LTS, 17.3.10 LTS, 17.4.4 Standard+ |
| CVSS 3.1 | 9.8 Critique |
| Auth | Aucune — hash de sondage public valide (s=) requis pour la chaîne complète |
| CWE | CWE-73, CWE-94 |
Depuis un contexte de sondage public, les attaquants peuvent abuser du routage __passthru (passthrough de sondage) pour atteindre des contrôleurs non prévus (par ex. Data Import), puis déclencher une gestion non sécurisée des chemins de fichiers / flux → RCE.
Securifera n'a pas encore publié la chaîne HTTP complète (aucun PoC public sur GitHub / Exploit-DB au moment de la publication du dépôt).
| Mode | Ce qu'il fait |
|---|---|
check | Empreinte REDCap, heuristiques de version, sondage valide (si hash fourni), sondes → DataImport |
exploit_chain.example.json est uniquement un placeholder (routes/paramètres devinés). Il ne provoquera pas de RCE.
Essai à blanc de recherche : --allow-placeholder-chain (envoie des requêtes ; échec attendu).
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
Sans hash, le check peut toujours identifier REDCap et signaler les fenêtres de version, mais ne peut pas valider le sondage ni exécuter les sondes passthru.
--flow)
| Fichier | Contenu |
|---|---|
cve_2026_90817_results.jsonl | JSON par cible |
hits.txt | Candidats (exploitable_candidate) |
status courantes (check)__passthru exacte et les noms de paramètres de Securifera/vendor ; les valeurs par défaut sont des placeholders.vulnerable_version peut être null.title="REDCap" manquent souvent de hash de sondage — les préconditions de la CVE nécessitent s= à partir de liens publics.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
Pour des tests de sécurité autorisés uniquement. Vous êtes responsable du respect des lois applicables et des règles du programme.
s=__passthruexploit | S'exécute uniquement avec un exploit_chain.json vérifié (pas l'exemple placeholder) |
| Option | Description |
|---|
-u, --url | URL de base unique (ou URL|hash) |
--hash | Hash de sondage public (valeur s=) |
--list | Fichier de cibles (une URL ou URL|hash par ligne) |
--mode | check ou exploit |
--chain | Chaîne JSON pour le mode exploit (par défaut exploit_chain.json) |
--allow-placeholder-chain | Autoriser le JSON d'exemple en mode exploit (pas de vrai RCE) |
-c, --command | Commande shell (mode exploit ; nécessite une chaîne fonctionnelle) |
--threads, -j | Concurrence de masse (par défaut 15) |
--timeout | Délai HTTP en secondes (par défaut 25) |
--proxy | URL de proxy HTTP(S) |
--output | Résultats JSONL (par défaut cve_2026_90817_results.jsonl) |
--vuln-list | Check → hits.txt ; exploit → exploited.txt |
--quiet, -q | Supprimer les ticks de progression périodiques |
--flow, -f | Une ligne par cible terminée (site + résumé des tests) |
| Statut | Signification |
|---|
passthru_dataimport_reachable | Sondage valide + route passthru ressemble à Data Import |
passthru_probe_reachable | Passthru a renvoyé un HTTP non bloqué |
likely_vulnerable_version | Version dans la fenêtre affectée (sondage OK, sondes non concluantes) |
redcap_version_hot_no_hash | Heuristiques de version affectée, aucun hash de sondage fourni |
redcap_no_survey_hash | REDCap OK, pas de hash, version inconnue |
patched / patched_no_survey | À ou au-dessus de la version corrigée pour la branche |
no_valid_survey | Hash invalide ou sondage non public |
no_redcap | L'hôte ne ressemble pas à REDCap |
survey_ok_version_unknown | Sondage OK, chaîne de version introuvable |