8.5 KiB
Открытые вопросы — снимок 17.06.2026
Сводный трекер по итогам сессии (go-live security gate + кросс-сессионная сверка).
Зона = где правится; «коллизия с фронт-сессией» = пересекается ли с параллельной
сессией, которая ведёт находки осмотра во фронтенде app/resources/js.
🔴 Блокеры безопасности (мешают выходу в интернет)
Живых блокеров нет — все сняты. B1 (
d1976c9c); B2 anon-маски применены на прод (8bb72b34); B3/B6 прод-.env(APP_DEBUG=false,APP_ENV=production,SAAS_ADMIN_TEST_BYPASS=false+config:cache); B4/B5 — код. Security go-live: GO (CSP пока Report-Only; 152-ФЗ — ручное).
| # | Пункт | Суть | Зона | Коллизия |
|---|---|---|---|---|
| B1 | F-P1 / 152-ФЗ retention | ✅ ЗАКРЫТО (d1976c9c) — Телефоны удалённых лидов не вычищаются (нет анонимизации/hard-delete после soft-delete). Подтверждён фактом по Deal-модели + схеме. |
app/Console/Commands + миграция (бэкенд/БД) |
низкая (бэкенд) |
| B2 | pg_anonymizer | ✅ ЗАКРЫТО (17.06, прод) — anon стоял, но было 0 правил маскирования; применены SECURITY LABEL на ПДн-колонки (db/anon_masking_labels.sql, 8bb72b34) → pg_dump под masked-ролью маскирует. |
БД/инфра + docs/security |
нет |
| B3 | SAAS_ADMIN_TEST_BYPASS | ✅ ЗАКРЫТО (17.06, прод) — в боевом .env выставлено SAAS_ADMIN_TEST_BYPASS=false + php artisan config:cache; /api/admin/** снова только за middleware saas-admin. Бэкап .env.bak-2026-06-17-b3. |
.env.production / config |
нет |
| B4 | SSRF через /api/webhooks/test |
✅ ЗАКРЫТО (код: WebhookUrlGuard) — Нет фильтрации URL → запрос на metadata YC 169.254.169.254 → IAM-токен. |
бэкенд (контроллер/сервис) | низкая |
| B5 | Открытые без auth ручки | ✅ ЗАКРЫТО (код: web.php auth:sanctum) — /api/dashboard/summary (E18), /api/managers + /api/lead-statuses (E9). |
routes/api.php + middleware (бэкенд) |
низкая |
| B6 | Ward [High] APP_DEBUG | ✅ ЗАКРЫТО (17.06, прод) — проверено фактом: в боевом .env APP_DEBUG=false, APP_ENV=production. |
.env.production |
нет |
🟠 P1 (важно, не критично к go-live)
| # | Пункт | Зона |
|---|---|---|
| P1 | Нет rate-limit на login/forgot/2fa/verify (Laravel Throttle) |
routes/api.php (бэкенд) |
| P2 | URL-secret поставщика виден в access-логах (E4) → перейти на HMAC, ротация | бэкенд/инфра |
🟢 Инструменты аудита — статус
| Инструмент | Статус 17.06 | Действие |
|---|---|---|
| gitleaks #8 | ✅ OK (2462 коммита, 0 утечек) | — |
| Ward #70 | ✅ OK (2 dev-находки: APP_DEBUG/APP_ENV) | проверить на боевом .env |
| Nuclei #69 | ✅ OK (1 info php, 0 medium+) |
— |
| Semgrep #25 | ✅ OK (semgrep-1.166.0, npm run sast exit 0 → 0 находок) |
— |
| ZAP #68 | ✅ OK (spider+passive, 0 high; active scan не гнали — гард IS8) | active scan перед публичным деплоем |
🟡 Находки осмотра портала (ведёт параллельная фронт-сессия)
| Находка | Статус | Зона | Коллизия |
|---|---|---|---|
| F1 (Город в карточке) | ✅ закоммичено | фронт | — её зона |
| F2 (стоимость лида) | ✅ закоммичено | фронт | — её зона |
| F4 (пустой столбец «Операция») | 🔧 в работе у неё (TransactionsTable.spec.ts) |
фронт | её зона — не трогать |
| F3 (прогноз «хватит на дни» дашборд↔биллинг) | ❓ проверить, закрыта ли | фронт | её зона |
| F5 (мок «средняя 2248 ₽») | ❓ проверить (есть format-rub-demo-spec) |
фронт | её зона |
🧱 Баги машинерии стены (для claude-brain)
| # | Пункт | Файл |
|---|---|---|
| W1 | Чтение под планом блокируется (impl-режим ДР-1) | docs/superpowers/2026-06-17-wall-read-block-bug.md |
| W2 | Десинк указателя F-J (счётчик двигается на упавшем шаге) | там же + GUIDE |
| W3 | Недетерминизм судьи на байт-идентичном тексте | GUIDE «Уроки живого прогона» |
| W4 | Наставник: пустой recommendation → no_mentor_go |
docs/superpowers/2026-06-16-mentor-empty-recommendation-bug.md |
🧹 Хозяйственное
| # | Пункт |
|---|---|
| H1 | Незакоммичено: спека/план/файл-баг чтения, спека/план/отчёт/трекер аудита, обновление отчёта |
| H2 | Не запушено: docs-коммит e693cfc6 (локально) |
| H3 | Нормативный хвост (проверить): синхронизация квинтета CLAUDE.md 2.46→2.47 + долг lychee по относительным ссылкам |
| H4 | Ward оставил артефакты ward-report.{json,sarif,html,md} в корне — решить, в .gitignore или удалить |
Рекомендация по очерёдности (с учётом недельного лимита): реальные блокеры
B1–B6 — бэкенд/БД/config, не пересекаются с фронт-сессией. Самый дешёвый и
отдельный — B5 (закрыть открытые ручки) + B3/B6 (проверка боевого .env).
Semgrep/ZAP — поставить инструменты (одна команда + Java), затем добить статику/DAST.
ПОПРАВКА — верификация по коду (17.06.2026)
Три пункта, ранее помеченные как P0 «из модели угроз», проверены по реальному коду и оказались закрытыми:
- E9 (
/api/managers,/api/lead-statuses) + E18 (/api/dashboard/summary) — подauth:sanctum(+tenant),app/routes/web.php. - E20 (
/api/admin/*) — за middlewaresaas-admin(prod fail-closed 503). - SSRF (
/api/webhooks/test) —WebhookUrlGuardблокирует cloud-metadata/RFC1918/loopback (на сохранении и тесте), URL толькоhttps://.
Вердикт ОСТАЁТСЯ NO-GO. Реальные блокеры НЕ сняты: F-P1 (ретеншен телефонов лидов), pg_anonymizer (не установлен), прод-.env (APP_DEBUG/APP_ENV). Остаточные не-блокеры: bypass-флаг + SSO админки (config / Б-1), DNS-rebind на будущей доставке webhook (edge), rate-limit на login (P1 — проверить throttle).
ДОБИВАНИЕ АУДИТА (17.06.2026) — pg_anonymizer + ZAP
pg_anonymizer: проверено фактом (pg_extension WHERE extname='anon' → пусто) — НЕ установлен (phase-3, OPEN-И-24). pg_dump отдаёт ПДн открыто → блокер B2 в силе.
ZAP #68 (spider + passive, цель 127.0.0.1:8000, демон 2.17.0; active scan не гнали — гард IS8): spider завершён (status 100). Сводка alerts — High 0, Medium 4, Low 28, Informational 4. 0 high/critical → блокеров от ZAP нет. 4 Medium = предупреждения (вероятно security-заголовки), разобрать.
Аудит инструментами ЗАКРЫТ: gitleaks 0 · Semgrep 0 · Ward 2(dev) · Nuclei 0(medium+) · ZAP 0(high).
Вердикт остаётся NO-GO — держат не сканеры, а: F-P1 (ретеншен телефонов), pg_anonymizer (не установлен), прод-.env (APP_DEBUG/APP_ENV).