
REDCap 설문 passthru 및 데이터 가져오기 RCE인 CVE-2026-90817에 대한 Python 검사기 및 구성 가능한 익스플로잇 훅입니다. 버전을 핑거프린팅하고, 설문 해시를 검증하며, 취약한 체인을 프로브합니다.
CVE-2026-90817 (Securifera / Ryan Wincey)에 대한 Python 3 검사기(및 구성 가능한 익스플로잇 훅).
| 제품 | REDCap (Vanderbilt) |
| 영향 받는 버전 | ≥ 13.3.0 (브랜치 패치 전까지) |
| 수정 버전 | 16.0.49 LTS, 17.3.10 LTS, 17.4.4 Standard+ |
| CVSS 3.1 | 9.8 Critical |
| 인증 | 없음 — 전체 체인에는 유효한 공개 설문 해시(s=) 필요 |
| CWE | CWE-73, CWE-94 |
공개 설문 컨텍스트에서 공격자는 __passthru(설문 패스스루) 라우팅을 악용하여 의도하지 않은 컨트롤러(예: 데이터 가져오기)에 도달한 다음, 안전하지 않은 파일 경로 / 스트림 처리를 트리거하여 RCE를 실행할 수 있습니다.
Securifera는 아직 전체 HTTP 체인을 공개하지 않았습니다(저장소 게시 시점에 GitHub / Exploit-DB에 공개 PoC 없음).
| 모드 | 수행 작업 |
|---|---|
check | REDCap 핑거프린팅, 버전 휴리스틱, 유효한 설문(해시 제공 시), → DataImport |
exploit_chain.example.json은 자리 표시자일 뿐입니다(추측된 라우트/파라미터). RCE가 되지 않습니다.
연구용 드라이 런: --allow-placeholder-chain (요청을 전송하며, 실패가 예상됨).
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
해시가 없으면 check는 여전히 REDCap을 핑거프린팅하고 버전 범위를 표시할 수 있지만, 설문을 검증하거나 패스스루 프로브를 실행할 수는 없습니다.
--flow 대량 검사)
| 파일 | 내용 |
|---|---|
cve_2026_90817_results.jsonl | 대상별 JSON |
hits.txt | 후보 (exploitable_candidate) |
status 값 (check)__passthru 라우트와 파라미터 이름이 필요하며, 기본값은 자리 표시자입니다.vulnerable_version이 null일 수 있습니다.title="REDCap" 행에는 설문 해시가 없는 경우가 많으며, CVE 전제 조건에는 공개 링크의 s=가 필요합니다.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
승인된 보안 테스트에만 사용하십시오. 관련 법률 및 프로그램 규칙을 준수할 책임은 사용자에게 있습니다.
s=__passthruexploit | 검증된 exploit_chain.json(자리 표시자 예제가 아님)이 있는 경우에만 실행 |
| 옵션 | 설명 |
|---|
-u, --url | 단일 기본 URL (또는 URL|hash) |
--hash | 공개 설문 해시 (s= 값) |
--list | 대상 파일 (한 줄에 URL 또는 URL|hash) |
--mode | check 또는 exploit |
--chain | 익스플로잇 모드용 JSON 체인 (기본값 exploit_chain.json) |
--allow-placeholder-chain | 익스플로잇 모드에서 예제 JSON 허용 (실제 RCE 없음) |
-c, --command | 셸 명령 (익스플로잇 모드; 작동하는 체인 필요) |
--threads, -j | 대량 동시성 (기본값 15) |
--timeout | HTTP 타임아웃 초 (기본값 25) |
--proxy | HTTP(S) 프록시 URL |
--output | JSONL 결과 (기본값 cve_2026_90817_results.jsonl) |
--vuln-list | check → hits.txt; exploit → exploited.txt |
--quiet, -q | 주기적 진행 상황 표시 억제 |
--flow, -f | 완료된 대상당 한 줄 (사이트 + 테스트 요약) |
| 상태 | 의미 |
|---|
passthru_dataimport_reachable | 유효한 설문 + 패스스루 라우트가 Data Import로 보임 |
passthru_probe_reachable | 패스스루가 차단되지 않은 HTTP를 반환함 |
likely_vulnerable_version | 영향 받는 범위의 버전 (설문 OK, 프로브 결과 불확실) |
redcap_version_hot_no_hash | 영향 받는 버전 휴리스틱, 설문 해시 미제공 |
redcap_no_survey_hash | REDCap OK, 해시 없음, 버전 알 수 없음 |
patched / patched_no_survey | 브랜치의 수정 버전 이상 |
no_valid_survey | 해시가 유효하지 않거나 설문이 공개되지 않음 |
no_redcap | 호스트가 REDCap으로 보이지 않음 |
survey_ok_version_unknown | 설문 OK, 버전 문자열을 찾을 수 없음 |