
Лаборатория на базе Docker, воспроизводящая SSRF CVE-2023-27163 в Request-Baskets, с проверкой эксплуатации, скриптом обнаружения и устранением последствий через сетевую изоляцию.
Проект: Лаборатория исследования и воспроизведения уязвимостей — CVE-2023-27163
Автор: Amulya Kaushik
Роль: Кандидат на стажировку в области кибербезопасности R&D и разработки лабораторного контента
Server-Side Request Forgery в Request-Baskets ≤ 1.2.1
Автономная локальная исследовательская лаборатория для воспроизведения, обнаружения и устранения CVE-2023-27163 с архитектурой эшелонированной защиты.
| Поле | Значение |
|---|---|
| CVE ID | CVE-2023-27163 |
| CWE | CWE-918 — Server-Side Request Forgery (SSRF) |
| Затронутый продукт | Request-Baskets |
| Затронутые версии | ≤ 1.2.1 |
| Исправленная версия | 1.2.2 (Upstream source) / Defense-in-Depth Network Isolation |
| Оценка CVSS v3.1 | 6.5 (Medium) |
| Вектор CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Сложность атаки | Низкая — один неаутентифицированный вызов API |
Примечание об ограничениях upstream и устранении:
Хотя CVE-2023-27163 отслеживает проверку произвольного forward URL, публичные сборки контейнераdarklynx/request-basketsне применяют фильтрацию loopback или частных подсетей из коробки. Следуя реальным лучшим практикам DevSecOps, наша лаборатория демонстрирует устранение через Defense-in-Depth Container Network Isolation. Изолируя чувствительные внутренние бэкенды в внутренней Docker-сети (secure-internal-netсinternal: true), путь ретрансляции разрывается, что снижает эксплуатируемость уязвимости SSRF даже при запуске недоверенных пересыльщиков вебхуков.
Эта лаборатория предоставляет две отдельные топологии Docker Compose:
docker-compose.yml): Request-Baskets и внутренний сервис эхо-секретов совместно используют bridge-сеть 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 при принятии (HTTP 201) и очищает зонд-корзину.Переключитесь на сегментированную исправленную топологию:
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
Полный портфель визуальных доказательств для Deliverable 3 поддерживается в каталоге evidence/: