
Verificador em Python e hook de exploit para CVE-2026-90817, um RCE crítico não autenticado no REDCap via roteamento __passthru de survey, com varredura em massa e importação de alvos do FOFA.
Verificador em Python 3 (e hook de exploit configurável) para CVE-2026-90817 (Securifera / Ryan Wincey).
| Produto | REDCap (Vanderbilt) |
| Afetado | ≥ 13.3.0 (até patch do branch) |
| Corrigido | 16.0.49 LTS, 17.3.10 LTS, 17.4.4 Standard+ |
| CVSS 3.1 | 9.8 Crítico |
| Autenticação | Nenhuma — hash de survey público válido (s=) necessário para a cadeia completa |
| CWE | CWE-73, CWE-94 |
A partir de um contexto de survey público, atacantes podem abusar do roteamento __passthru (passthrough de survey) para alcançar controllers não intencionais (por exemplo, Data Import), e então acionar o tratamento inseguro de caminho de arquivo / stream → RCE.
A Securifera ainda não publicou a cadeia HTTP completa (nenhum PoC público no GitHub / Exploit-DB no momento da publicação do repositório).
| Modo | O que faz |
|---|---|
check | Fingerprint do REDCap, heurísticas de versão, survey s= válido (se hash fornecido), sondagens __passthru → DataImport |
exploit | Executa apenas com um exploit_chain.json verificado (não o exemplo placeholder) |
exploit_chain.example.json é apenas placeholder (rotas/parâmetros supostos). Ele não fará RCE.
Dry run de pesquisa: --allow-placeholder-chain (envia requisições; espere falha).
pip install -r requirements.txtpip install -r requirements.txt
# Alvo único (hash de survey necessário para testes de survey + passthru)
python poc.py -u https://redcap.example.edu/redcap --hash Ab12Xy34Zq --mode check
# Atalho: base|hash
python poc.py -u "https://redcap.example.edu/redcap|Ab12Xy34Zq" --mode check
# Verificação em massa (uma URL por linha, |hash opcional)
python poc.py --list targets.example.txt --mode check -j 20 -q
# Live stream: cada host + resumo de teste (recomendado para listas longas)
python poc.py --list targets.example.txt --mode check -j 20 -q --flow
# Exploit (após advisory → exploit_chain.json real)
cp exploit_chain.example.json exploit_chain.json # edite com valores reais
python poc.py -u https://redcap.example.edu/redcap --hash XXX --mode exploit -c id \
--chain exploit_chain.json
# Coloque a exportação como fofa_csv_7561.csv (ou qualquer fofa*.csv), então:
python fofa_to_list.py
# Escreve list.txt (gitignored) e normaliza o CSV com uma coluna url
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
Sem um hash, o check ainda pode fazer fingerprint do REDCap e sinalizar janelas de versão, mas não pode validar o survey nem executar sondagens passthru.
--flow verificação em massa)
| Opção | Descrição |
|---|---|
-u, --url | URL base única (ou URL|hash) |
--hash | Hash de survey público (valor s=) |
--list | Arquivo de alvos (uma URL ou URL|hash por linha) |
--mode | check ou exploit |
--chain | Cadeia JSON para o modo exploit (padrão exploit_chain.json) |
--allow-placeholder-chain | Permitir JSON de exemplo no modo exploit (sem RCE real) |
-c, --command | Comando shell (modo exploit; requer cadeia funcional) |
--threads, -j | Concorrência em massa (padrão 15) |
--timeout | Timeout HTTP em segundos (padrão 25) |
--proxy | URL de proxy HTTP(S) |
--output | Resultados JSONL (padrão cve_2026_90817_results.jsonl) |
--vuln-list | Check → hits.txt; exploit → exploited.txt |
--quiet, -q | Suprime ticks periódicos de progresso |
--flow, -f | Uma linha por alvo concluído (site + resumo de teste) |
| Arquivo | Conteúdo |
|---|---|
cve_2026_90817_results.jsonl | JSON por alvo |
hits.txt | Candidatos (exploitable_candidate) |
status (check)| Status | Significado |
|---|---|
passthru_dataimport_reachable | Survey válido + rota passthru parece ser Data Import |
passthru_probe_reachable | Passthru retornou HTTP não bloqueado |
likely_vulnerable_version | Versão na janela afetada (survey OK, sondagens inconclusivas) |
redcap_version_hot_no_hash | Heurísticas de versão afetada, nenhum hash de survey fornecido |
redcap_no_survey_hash | REDCap OK, sem hash, versão desconhecida |
patched / patched_no_survey | Na versão corrigida ou acima para o branch |
no_valid_survey | Hash inválido ou survey não público |
no_redcap | Host não parece ser REDCap |
survey_ok_version_unknown | Survey OK, string de versão não encontrada |
__passthru e nomes de parâmetros da Securifera/fabricante; os padrões são placeholders.vulnerable_version pode ser null.title="REDCap" frequentemente não têm hashes de survey — as pré-condições da CVE precisam de s= de links públicos.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
Apenas para testes de segurança autorizados. Você é responsável pela conformidade com as leis aplicáveis e regras do programa.