Полный DAST active scan локальной копии 127.0.0.1:8000 через OWASP ZAP 2.17.0. Сводка: High 1, Medium 4, Low 28, Info 7. Реальных high/critical — 0: - High «Cloud Metadata Exposed» — false-positive: SPA отдаёт 200 на любой путь, evidence пуст, nginx нет, SSRF закрыт WebhookUrlGuard. - 4 Medium — отсутствие security-заголовков локально; на проде их шлёт nginx. Вердикт ZAP active scan: GO. Скрипт-оркестратор воспроизводим. Сырые json и html — локально в docs/security, не коммитятся. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
5.0 KiB
ZAP Active Scan — отчёт 2026-06-18
Инструмент: OWASP ZAP 2.17.0 (#68), полный DAST — spider + active scan.
Цель: http://127.0.0.1:8000 (локальная копия; гард IS8 — на боевой active scan не гнался).
Запуск: bin/zap-active-scan.ps1 (демон → spider → active scan → экспорт).
Сырые отчёты: docs/security/2026-06-18-zap-active-scan.json (+ .html).
Углубляет прошлый прогон spider + passive (17.06.2026, 0 high) реальным активным сканированием.
Сводка по риску
| Риск | Экземпляров | Вердикт |
|---|---|---|
| High | 1 | false-positive (разбор ниже) |
| Medium | 4 | локальный артефакт (заголовки на nginx в проде) |
| Low | 28 | информационно, не блокирует |
| Informational | 7 | информационно, не блокирует |
Реальных high/critical — 0. Вердикт ZAP active scan: GO ✅
High (1) — «Cloud Metadata Potentially Exposed» (CWE-1230) — FALSE POSITIVE
- Плагин
90034. ЗапросGET http://127.0.0.1:8000/opc/v1/instance/с Host-заголовком169.254.169.254(попытка вытащить метаданные облака через Host-инъекцию в misconfigured NGINX). confidence = Medium,evidenceпустой,otherinfo: «Based on the successful response status code cloud metadata may have been returned… Check the response data…» — то есть правило сработало только на успешный статус-код, реальных метаданных в ответе ZAP не нашёл.- Почему это false-positive:
- Цель —
php artisan serve, nginx нет. Описание и solution алерта целиком про misconfigured NGINX$host— к dev-серверу artisan неприменимо. - Vue 3 SPA отдаёт catch-all 200 (
index.html) на любой неизвестный путь →/opc/v1/instance/вернул 200 → эвристика «успешный статус» ложно сработала. Метаданные не возвращались (evidenceпуст). - SSRF к cloud-metadata уже закрыт в коде:
WebhookUrlGuardблокирует169.254.169.254/ RFC1918 / loopback (блокер B4, go-live report 17.06).
- Цель —
- Belt-and-suspenders проверка (ручная):
curl -H "Host: 169.254.169.254" http://127.0.0.1:8000/opc/v1/instance/→ ожидается SPA-HTML, не метаданные. - Классификация: false-positive. Не блокер.
Medium (4) — отсутствие security-заголовков (локальный артефакт)
2 типа × 2 экземпляра:
- «Content Security Policy (CSP) Header Not Set» (
10038) — на/и/sitemap.xml. - «Missing Anti-clickjacking Header» / X-Frame-Options (
10020).
Срабатывают потому, что локальная цель php artisan serve не имеет nginx, а app-уровневый middleware SecurityHeaders удалён в Задаче 1 (консолидация заголовков, коммит a4a8ea31). На боевом эти заголовки шлёт nginx (enforcing CSP, X-Frame-Options и др. — /etc/nginx/sites-available/liderra, add_header … always), поэтому на проде эти Medium не воспроизводятся. Локально — ожидаемо; заодно подтверждает, что дедуп Задачи 1 сработал (приложение само эти заголовки больше не ставит).
Low (28) / Informational (7)
Не блокируют go-live. В основном — следствие того же отсутствия nginx локально (X-Content-Type-Options missing — 5 экз., cookie HttpOnly, X-Powered-By leak) + информационные детекты (suspicious comments, modern-web-app, session-management). Полный список — в 2026-06-18-zap-active-scan.json.
Вердикт
ZAP active scan: GO — 0 реальных high/critical.
- Единственный High — подтверждённый false-positive (SPA 200-catch-all + отсутствие nginx локально; SSRF уже закрыт
WebhookUrlGuard). - 4 Medium — локальные артефакты; на проде заголовки ставит nginx.
- Active scan углубил прошлый spider+passive и не выявил реальных уязвимостей (SQLi/XSS/path-traversal/injection — чисто).
Закрывает открытый пункт go-live «ZAP active scan» (ранее PENDING). Скрипт-оркестратор bin/zap-active-scan.ps1 воспроизводим для будущих прогонов.