WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-075 · Задача · Инфраструктура · web

[GATE-7] Origin-lock + trusted proxy + Host-валидация: спроектировать и применить

Закрыт P1 · важно ведёт: backup-opus
Суть
НЕ НАЧАТО: нет CF tunnel/IP-allowlist, NSG/origin firewall receipt, trusted-forwarded-headers, negative unknown-Host пробы. Для Pi-dev это про будущий OCI-target; сделать вместе с GATE-13 контуром (NSG на VNIC + Caddy/nginx host-валидация + CF-диапазоны). Дизайн → применение на A1-конуре → негативные пробы (прямой IP-доступ отклонён, чужой Host отклонён).

Эпик: WEB-282. Норматив: PROD-MIGRATION-PLAN-R4.md §7. Аудит-срез: M4 MIGAUDIT-REPORT.md (20.08). Owner 20.08: «по гейтам дожимайте все до конца».

## 21.08 ~08:55 ГЕЙТ 7 ПОДГОТОВЛЕН (волна gate78, отчёт M4 /Users/milamarty/work/GATE78-REPORT.md)
Созданы файлы (в дереве, НЕ применены): infra/edge/origin-lock/ — конфиг nginx с проверкой  + generated/nftables-origin-lock.nft (пакетный уровень), generate-cloudflare-allowlist.sh (генератор CF-диапазонов с режимом --check), плюс скрипт негативных проб (прямой IP → отказ, чужой Host → отказ, /api/cron снаружи → 404).
ОСТАЛОСЬ: применить на реальном фронте при переезде + прогнать пробы. Трейл: эпик WEB-282, R4 §2/§7.7.

## 2026-08-23 BOARDSWEEP: STALE-NOT-DEPLOYED
- Evidence: buildFixed is empty. Canonical proxy/origin code was inspected, but no deployed build pointer or live Host/trusted-proxy receipt is present.
- buildFixed: <empty>; canonical: v4-081ff4fb5 / 081ff4fb5f6110f8001daec7ed910ccef2e395dc.
- Status preserved by sweep: review.
Доказательства

[24.08 04:30] ПРИЁМКА против серва 452800ff4 (reviewacc): REJECT. Заявленного origin-lock контура в дереве НЕТ: infra/edge без origin-lock/, nginx-конфиг без default_server/Host-allowlist/CF-allowlist, src/proxy.ts:174-190 защищает только /api/cron loopback. Весь acceptance-скоуп (edge-конфиг, trusted proxy boundary, Host-валидация, негативные пробы на живом фронте) — предстоит. Это инфра-работа на фронте (nginx/CF/OCI), не codex-волна по репо; вернуть в todo и планировать с доступом к фронту.

[2026-08-25 19:11Z] Независимая приёмка запущена: волна accgates на A1 (sol xhigh, приёмщик≠автор), worktree от прод-коммита a453b16; обязательны негативные тесты новых классов; для не-влитых тикетов волна установит факт NOT-LANDED. Бриф /home/ubuntu/waves/accgates-brief.md, отчёт будет в ACCGATES-REPORT.md.
[2026-08-25 20:05Z] ФАКТ приёмки accgates: NOT-LANDED — полного origin-lock/trusted-proxy/Host-валидации в a453b16 НЕТ (есть старый AUTH-0722 helper); spoof-probe: поддельные Host/X-Forwarded-* при доверенном Origin приняты. Работа не делалась или потерялась — возвращён в очередь на авторскую волну.
[2026-08-25 21:35Z] Автор web075 (luna): trusted-proxy модель + Host-allowlist + X-Forwarded только от trusted + origin-lock, негативы на spoof. accgates подтвердил NOT-LANDED.
[2026-08-25 21:57Z] Автор web075 @51cccd8: verifyOrigin.ts расширен до полного boundary — trusted-proxy IP allowlist (APP_TRUSTED_PROXY_IPS), Host-allowlist (APP_ALLOWED_HOSTS + fallback NEXTAUTH_URL), Host НЕ заменяется X-Forwarded-Host, XFH только от trusted peer, XFP-валидация, state-changing требует Origin/Referer==scheme://host, fail-closed при отсутствии host-allowlist. Применён в proxy.ts до auth-слоя (POST/PUT/PATCH/DELETE origin-lock). Отказ→403+rule-10 beacon WEB075_RULE_10_ORIGIN_LOCK. → review, ждёт независимой приёмки (негативы spoof).
[2026-08-25 22:52Z] acc075 NO-GO: src/proxy.ts(112) TS2559 type-ошибка на env:process.env (OriginCheckEnv несовместим). Логика origin-lock верна, дефект типизации. Фикс web075fix (luna).
[2026-08-26 00:12Z] ФИКС web075fix: TS2559 устранён (proxy корректно передаёт origin-lock env-ключи в OriginCheckEnv), git diff --check PASS. -> review на re-accept.
[2026-08-26 00:40Z] ПРИНЯТ (независимо, приёмщик≠автор): acc075b GO: все spoof-негативы PASS (Host/XFH/XFP/Origin), type-gate 0 новых. → done.
Починено в
a453b16
Лента
2026-09-04T23:37:49.860Z · координатор
Находка круга STRIPEBETA3 (WEB-511, 05.09): origin-lock в src/proxy.ts требует Origin для ЛЮБОГО POST, а у вебхуков платёжных провайдеров Origin нет по природе; /api/billing/webhook не входил в SIGNED_MESSENGER_WEBHOOK_PATHS → первые события stripe listen получали 403 ещё в proxy, ДО проверки подписи. Значит боевой вебхук Stripe на проде тоже отвергался бы. Исправление автора (e2ff0f93): маршрут внесён в SIGNED_MESSENGER_WEBHOOK_PATHS (провайдерская аутентификация stripe.webhooks.constructEvent), Host-allowlist сохранён; после — 200 на событие, поддельная подпись → 400, без подписи → 400. Независимая приёмка 1878 обязана доказать, что для остальных POST без Origin по-прежнему 403. Ссылки: WEB-511, /home/ubuntu/waves/STRIPEBETA3-REPORT.md §2.3. Правила: WEB-449.
2026-09-07T11:40:32.465Z ·
ЭВОЛЮЦИЯ ЗА 12 Ч (гигиена 2609, 11:25Z 07.09)

ХРОНОЛОГИЯ КРУГОВ
- круг Block-22 → SHA см. внутри → VERDICT=GO (app-часть 1c5529bf4 принята; CONFIG_ASSURED остаётся за координатором — см. «Границы») — App-часть исправляет ровно тот bypass, ради которого заведена WEB-523, и делает это **не полагаясь на nginx hardening**: выбор последнего элемента XFF корректен и в захардененной (`$remote_addr`), и в старой (`$proxy_add_x_forwarded_for`) форме. Собственная независимая батарея из 20 кейсов: **10 FAIL на `44d8af68` → 20 PASS на `1c5529bf4`**, откат единственного production-файла возвращает те же 10 FAIL. Регрессий в WEB-075 / TrustedIdentity / api-perimeter не обнаружено. Источник: `A2 waves/ACCEDGEFORWARDEDTRUST-REPORT.md`.
- Линии посадки: l113j 22:56Z → l113k 00:41Z → l113l 05:30Z → l113m 06:33Z → l113n 07:48Z → l113o 09:35Z → l113p 10:21:43Z. Текущий PROD: l113p `1c850d92876757812eab9ffa7f381bcea95aad86`; общий verify — green по release receipt.

ДЛЯ НУЛЕВОГО АГЕНТА
- Board done; текущая линия l113p `1c850d92876757812eab9ffa7f381bcea95aad86`. Проверенные SHA: ticket-specific SHA в выбранных отчётах не выделен. Новые отчёты не требуют переоткрытия при сохранении указанной scope-диспозиции.
- Следующий шаг / владелец: Нового product шага из выбранных отчётов нет; остаточные evidence/registry действия ведутся родительским эпиком.

KNOWN ISSUES / ТРАБЛШУТИНГ
- Дельта без домысла: App-часть исправляет ровно тот bypass, ради которого заведена WEB-523, и делает это **не полагаясь на nginx hardening**: выбор последнего элемента XFF корректен и в захардененной (`$remote_addr`), и в старой (`$proxy_add_x_forwarded_for`) форме. Собственная независимая батарея из 20 кейсов: **10 FAIL на `44d8af68` → 20 PASS на `1c5529bf4`**, откат единственного production-файла возвращает те же 10 FAIL. Регрессий в WEB-075 / TrustedIdentity / api-perimeter не обнаружено. Проверка/причина привязаны к отчётам выше; anchors: `src/app/api/telephony/v1/pstn/route/[e164]/route.ts:30-47`, `src/lib/auth/antiBot.ts:100-113`, `src/middleware/rateLimit.ts:45-62`. Лечение — только указанное в report disposition; отсутствующий live/receipt не объявляется продуктовой регрессией.

СВЯЗИ / ИСТОЧНИКИ
- Release: `M4 waves/L113P-RELEASE-RECEIPT.md`; координаторский срез: `M4 waves/OPS-STATUS-HEAD-1120.md`; точные отчёты перечислены в хронологии/KNOWN ISSUES.
- Если сегодняшняя карточка уже содержит более ранний coordinator-комментарий с тем же фактом, эта запись является только дельтой 2609 и не отменяет тот trail.
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-075","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-25T23:41:04.434Z