# Отчёт доменного аудита go-live безопасности Лидерры (Этап 2б) — промежуточный, неавторизующий

*threat-model + pdn-152fz + billing · 15.06.2026 · статический аудит, live-DAST (ZAP/Nuclei/Ward) недоступен — нет поднятого сервера. Документ НЕ авторизует go-live; финальное решение — за владельцем после полного review.*

## Находки

| ID | Инвариант | Файл:строка | Приоритет | Статус | Рекомендация |
|----|-----------|-------------|-----------|--------|--------------|
| **F-T2** | Авторизация админ-зоны | `app/app/Http/Middleware/EnsureSaasAdmin.php:34` | **P1** | **открыт** | вернуть application-гейт; `admin_user_id` из сессии, не из `$request->input` (`ResolvesAdminUserId.php:24`) |
| **F-P1** | Полнота 152-ФЗ erasure | `app/app/Services/Pd/PdErasureService.php:167` | **P1** | **открыт** | анонимизировать `deals.phones[]` JSONB (`db/schema.sql:1632`) |
| F-T1 | SSRF исходящего webhook | `app/app/Http/Controllers/Api/WebhookSettingsController.php:150` | P2 | остаточный риск | `->withoutRedirecting()`; DNS-rebinding → accepted-risk (SEC) |
| F-T3 | Приём webhook | `app/app/Http/Controllers/Api/SupplierWebhookController.php:162` | P3 | остаточный риск | секрет не в URL / body-HMAC; missing-allowlist-row → fail-closed |
| F-P2 | Скраб ПДн в Sentry | (нет `config/sentry.php`) | P3 | остаточный риск | явный `send_default_pii=false` + `before_send`-скраббер |
| F-B1 | Идемпотентность списания (БД) | `db/schema.sql:1090` | P3 | остаточный риск | рассмотреть UNIQUE на `lead_charges(deal_id, ...)` |

## Чисто (хвостов нет)

- Деньги — `bcmath`/копейки во всех сервисах биллинга, PHP-float не используется.
- Идемпотентность списания — `lockForUpdate(tenant)` + PK `supplier_lead_deliveries(supplier_lead_id, tenant_id)` + атомарная транзакция.
- Логи приложения не содержат телефонов (`RouteSupplierLeadJob`, `SupplierRegions` и др.).
- Большинство API-маршрутов под `auth:sanctum` + `tenant`; публичны только auth-flow и `signed`-скачивание отчёта.
- `WebhookUrlGuard` добротен: резолюция всех A/AAAA, приватные IPv4 (`NO_PRIV_RANGE|NO_RES_RANGE`) и IPv6 (`::1`/`fe80`/`fc00`/IPv4-mapped).

## Поправка к разведке

Фича lead-region (`lead_region_resolution_log`, `phone_ranges`, `region_source`, миграция `2026_05_31_100000`) в этой рабочей копии **отсутствует** (0 совпадений в `app/`) — не влита в локальный main (P1-риск хэндоффа: 345 непушенных + diverge). Поэтому прог F-P1 про региональный лог к текущему коду **неприменим**; останется только `deals.phones[]`. Станет актуальным при merge фичи.

## Промежуточный статус

**НЕ ГОТОВ к публикации** — найдены блокеры **F-T2** (админ-зона без application-гейта + подделываемый audit-trail) и **F-P1** (152-ФЗ «право на удаление» исполняется неполно). P2/P3 — устранять, но не блокеры.

Это **НЕ авторизация go-live**. Финальное решение о выводе в прод принимает владелец после полного review (отложенный live-DAST + устранение блокеров). Открытые вопросы проекта (Б-1/SEC/CTO/Биз/Диз/DO) **не закрыты**. Исправления (включая по F-T2/F-P1) — отдельный эпик.

---

## Приложение: orphan-артефакты церемонии (на чистку)

В ходе церемонии под стеной создано (удалить под стеной нельзя):
- specs: `2026-06-15-go-live-security-domain-audit.md`, `…-criteria.md`, `…-evidence.md`, `…-evidence-2.md`
- plans: `2026-06-15-go-live-security-audit-report.md`, `…-report-plan-b.md`, `…-report-plan-c.md`, `…-report-plan-d.md`

Канон отчёта — этот файл; спека-источник — `…-evidence-2.md`.
