
Dockerベースのラボで、Request-BasketsにおけるCVE-2023-27163 SSRFを再現し、悪用検証、検出スクリプト、ネットワーク分離による緩和策を提供します。
プロジェクト: 脆弱性研究・再現ラボ — CVE-2023-27163
著者: Amulya Kaushik
役割: サイバーセキュリティ R&D & ラボコンテンツ開発インターン候補
Request-Baskets ≤ 1.2.1 におけるサーバーサイドリクエストフォージェリ
CVE-2023-27163 を再現、検出、および多層防御アーキテクチャで修復するための自己完結型ローカル研究ラボ。
| 項目 | 値 |
|---|---|
| CVE ID | CVE-2023-27163 |
| CWE | CWE-918 — サーバーサイドリクエストフォージェリ (SSRF) |
| 影響を受ける製品 | Request-Baskets |
| 影響を受けるバージョン | ≤ 1.2.1 |
| 修正バージョン | 1.2.2 (アップストリームソース) / 多層防御ネットワーク分離 |
| CVSS v3.1 スコア | 6.5 (中) |
| CVSS ベクター | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| 攻撃複雑度 | 低 — 単一の未認証 API 呼び出し |
アップストリームの制限と修復に関する注記:
CVE-2023-27163 は任意の転送 URL 検証を追跡していますが、darklynx/request-basketsの公開コンテナビルドは、ループバックやプライベートサブネットのフィルタリングを標準で強制していません。実際の DevSecOps ベストプラクティスに従い、当ラボでは 多層防御コンテナネットワーク分離 による修復を実証します。機密性の高い内部バックエンドを内部専用 Docker ネットワーク (internal: trueのsecure-internal-net) に隔離することで、リレーパスが遮断され、信頼できない Webhook フォワーダーを実行している場合でも SSRF 脆弱性の悪用可能性が軽減されます。
このラボでは、2 つの個別の Docker Compose トポロジを提供します:
docker-compose.yml): Request-Baskets と内部シークレットエコーサービスがブリッジネットワーク lab-net を共有します。Request-Baskets はホストポート 55556 にマッピングされます (コンテナポート 55555 からマッピング)。docker-compose.patched.yml): Request-Baskets は public-net にのみ接続され、内部エコーサービスは secure-internal-net (internal: true) に接続されます。docker-compose.yml)┌─────────────────────────────────────────────────────────┐
│ Docker: lab-net │
│ │
│ ┌─────────────────────┐ ┌────────────────────────┐ │
│ │ request-baskets │───▶│ internal-service │ │
│ │ (v1.2.1) │ │ (http-echo:5678) │ │
│ │ Port 55556 ◀──HOST │ │ NOT exposed to host │ │
│ └─────────────────────┘ └────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
▲
│ HTTP (port 55556)
│
┌────┴─────┐
│ Attacker │
└──────────┘
docker-compose.patched.yml)┌─────────────────────────┐ ┌─────────────────────────┐
│ public-net │ │ secure-internal-net │
│ │ │ (internal: true) │
│ ┌───────────────────┐ │ │ ┌───────────────────┐ │
│ │ request-baskets │ │ ✕ │ │ internal-service │ │
│ │ Port 55556◀─HOST │ │ ──/──▶ │ │ (http-echo:5678) │ │
│ └───────────────────┘ │ │ └───────────────────┘ │
└─────────────────────────┘ └─────────────────────────┘
| 要件 | 最小バージョン | 備考 |
|---|---|---|
| Docker Engine | 20.10+ | コンテナ仮想化ランタイム |
| Docker Compose | v2.0+ | マルチコンテナオーケストレーション |
| Python | 3.8+ | CLI 検証および検出ツール |
Python 仮想環境と依存関係のセットアップ:
python3 -m venv .venv
source .venv/bin/activate
pip install requests fpdf2
脆弱な環境を起動します (Request-Baskets v1.2.1 は http://localhost:55556 でアクセス可能):
docker compose up -d
両方のコンテナが実行中であることを確認:
docker compose ps
期待される出力:
NAME IMAGE COMMAND SERVICE STATUS PORTS
isolated-internal-service hashicorp/http-echo:latest "/http-echo -text=CO…" internal-service Up 5678/tcp
vulnerable-request-baskets darklynx/request-baskets:v1.2.1 "/bin/sh -c /bin/ent…" request-baskets Up 0.0.0.0:55556->55555/tcp
内部サービスがホストから直接到達できないことを確認:
curl http://localhost:5678 2>&1 || echo "Connection refused — internal service isolated as expected"
自動 SSRF 検証スクリプトを実行:
python3 scripts/verify_vulnerability.py
何が起こるか:
/api/baskets/ssrf-verification-basket を呼び出し、forward_url: "http://internal-service:5678" と proxy_response: true を設定します。CONFIDENTIAL_DATA{INTERNAL_SSRF_DEMONSTRATION_SUCCESS} をキャプチャし、RESULT: VULNERABLE を出力します。非破壊的な監査プローブを実行:
python3 scripts/detect.py
何が起こるか:
http://127.0.0.1:80) が受け入れられるかどうかをプローブします。AUDIT RESULT: VULNERABLE を報告し、プローブバスケットをクリーンアップします。セグメント化された修復済みトポロジに切り替え:
docker compose down
docker compose -f docker-compose.patched.yml up -d
python3 scripts/verify_vulnerability.py
期待される出力:
==============================================================
[✓] REMEDIATION VERIFIED: TARGET SECURED
The Request-Baskets instance failed to reach the internal
isolated service (HTTP 502 / Host Unreachable).
Network segmentation successfully prevented SSRF data exfiltration.
==============================================================
終了したら環境を破棄:
docker compose -f docker-compose.patched.yml down
成果物 3 の完全な視覚的証拠ポートフォリオは evidence/ ディレクトリに保管されています:
各スクリーンショットの詳細なウォークスルー、コマンド、およびコンソールトランスクリプトは evidence/README.md に文書化されています。
手動セットアップの手間なく、すべてのターミナルスクリーンショットを順番にキャプチャするには、以下を実行:
./scripts/capture_evidence_flow.sh
学術技術レポートを PDF にコンパイル:
python3 docs/generate_blog_pdf.py
生成された出力: docs/CVE-2023-27163-Technical-Blog.pdf
cve-2023-27163-lab/
├── .gitignore # Git artifact exclusions (.venv, cache, OS files)
├── docker-compose.yml # Vulnerable environment (shared lab-net, port 55556)
├── docker-compose.patched.yml # Remediated environment (disjoint network isolation)
├── README.md # Complete documentation, attribution & guide
├── scripts/
│ ├── capture_evidence_flow.sh # Interactive runner for capturing screenshots
│ ├── verify_vulnerability.py # SSRF exploitation & remediation verification CLI
│ └── detect.py # Defensive audit and detection tool
├── evidence/
│ └── README.md # Formal screenshot evidence walkthrough
└── docs/
├── technical_blog.md # Academic technical write-up (800–1,200 words)
├── generate_blog_pdf.py # Markdown → PDF converter
└── CVE-2023-27163-Technical-Blog.pdf # Compiled academic report PDF
この研究とラボ開発は、オープンなセキュリティ標準、ベンダーアドバイザリ、および脆弱性データベースに基づいています:
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)。このラボは、教育および許可されたセキュリティ研究目的のみ を意図しています。所有していない、または明示的なテスト許可を得ていないシステムに対してこれらのツールを使用しないでください。
| 成果物 | 目的 | ファイルリンク | 説明 |
|---|
| スクリーンショット 1 | 環境実行中 | 01_lab_running.png | vulnerable-request-baskets (ポート 55556) と isolated-internal-service が lab-net 上で同時に実行されていることを示します。 |
| スクリーンショット 2 | SSRF 悪用 | 02_reproduction_ssrf.png | 流出した CONFIDENTIAL_DATA{...} フラグと VULNERABLE ステータスを表示します。 |
| スクリーンショット 3 | 防御的検出ツール | 03_detection_tool_run.png | 二段階のシグネチャチェックとループバック監査が VULNERABLE をフラグする様子を表示します。 |
| スクリーンショット 4 | 修復検証 | 04_remediation_verified.png | セグメント化されたネットワーク防御下でのリレー失敗 (HTTP 502 / Host Unreachable) を証明します。 |
| スクリーンショット 5 | Web UI 設定 | 05_web_ui_ssrf.png | (ボーナス) Proxy Response で設定された Request-Baskets UI 設定のブラウザキャプチャ。 |