
Lab basato su Docker che riproduce la SSRF CVE-2023-27163 in Request-Baskets, con verifica dell'exploitation, script di rilevamento e remediation tramite isolamento di rete.
Progetto: Laboratorio di Ricerca e Riproduzione di Vulnerabilità — CVE-2023-27163
Autore: Amulya Kaushik
Ruolo: Candidato Tirocinante in Cybersecurity R&S e Sviluppo Contenuti per il Laboratorio
Server-Side Request Forgery in Request-Baskets ≤ 1.2.1
Un laboratorio di ricerca locale autonomo per riprodurre, rilevare e correggere CVE-2023-27163 con un'architettura di difesa in profondità.
| Campo | Valore |
|---|---|
| CVE ID | CVE-2023-27163 |
| CWE | CWE-918 — Server-Side Request Forgery (SSRF) |
| Prodotto Affetto | Request-Baskets |
| Versioni Affette | ≤ 1.2.1 |
| Versione Corretta | 1.2.2 (Sorgente upstream) / Isolamento di Rete con Difesa in Profondità |
| Punteggio CVSS v3.1 | 6.5 (Medio) |
| Vettore CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Complessità di Attacco | Bassa — singola chiamata API non autenticata |
Nota sulle Limitazioni Upstream e la Correzione:
Sebbene CVE-2023-27163 riguardi la validazione arbitraria dell'URL di inoltro, le build pubbliche dei container didarklynx/request-basketsnon applicano il filtraggio del loopback o delle sottoreti private out of the box. Seguendo le migliori pratiche DevSecOps del mondo reale, il nostro laboratorio dimostra la correzione attraverso l'Isolamento di Rete dei Container con Difesa in Profondità. Isolando i backend interni sensibili su una rete Docker solo interna (secure-internal-netconinternal: true), il percorso di relay viene reciso, mitigando la sfruttabilità della vulnerabilità SSRF anche quando si eseguono forwarder di webhook non attendibili.
Questo laboratorio fornisce due topologie Docker Compose distinte:
docker-compose.yml): Request-Baskets e un servizio interno di echo di segreti condividono la rete bridge lab-net. Request-Baskets è mappato sulla porta host 55556 (mappata dalla porta container 55555).docker-compose.patched.yml): Request-Baskets è collegato esclusivamente a public-net, mentre il servizio echo interno è collegato a 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) │ │
│ └───────────────────┘ │ │ └───────────────────┘ │
└─────────────────────────┘ └─────────────────────────┘
| Requisito | Versione Minima | Note |
|---|---|---|
| Docker Engine | 20.10+ | Runtime di virtualizzazione dei container |
| Docker Compose | v2.0+ | Orchestrazione multi-container |
| Python | 3.8+ | Strumenti CLI di verifica e rilevamento |
Configura l'ambiente virtuale Python e le dipendenze:
python3 -m venv .venv
source .venv/bin/activate
pip install requests fpdf2
Avvia l'ambiente vulnerabile (Request-Baskets v1.2.1 accessibile su http://localhost:55556):
docker compose up -d
Verifica che entrambi i container siano in esecuzione:
docker compose ps
Output atteso:
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
Conferma che il servizio interno non sia direttamente raggiungibile dall'host:
curl http://localhost:5678 2>&1 || echo "Connection refused — internal service isolated as expected"
Esegui lo script automatizzato di verifica SSRF:
python3 scripts/verify_vulnerability.py
Cosa succede:
/api/baskets/ssrf-verification-basket impostando forward_url: "http://internal-service:5678" e proxy_response: true.CONFIDENTIAL_DATA{INTERNAL_SSRF_DEMONSTRATION_SUCCESS} e restituisce RESULT: VULNERABLE.Esegui la sonda di audit non distruttiva:
python3 scripts/detect.py
Cosa succede:
http://127.0.0.1:80) viene accettato.AUDIT RESULT: VULNERABLE in caso di accettazione (HTTP 201) e pulisce il basket di prova.Passa alla topologia corretta segmentata:
docker compose down
docker compose -f docker-compose.patched.yml up -d
python3 scripts/verify_vulnerability.py
Output atteso:
==============================================================
[✓] 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.
==============================================================
Smonta l'ambiente al termine:
docker compose -f docker-compose.patched.yml down
Il portfolio completo di evidenze visive per il Deliverable 3 è mantenuto nella directory evidence/: