fix(tradein/rbac): аноним на admin-префиксе получает единый 404 — существование admin-ручек снаружи не перебирается #3371
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3371
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3360-admin-prefix-anon-404"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #3360 [SECURITY] (находка доводки #3352).
/trade-in/api/v1/admin/*снаружи доходит до guard'а анонимно (Caddy не режет префикс), а после #3352 аноним отличал существующую admin-ручку (401) от несуществующей (404).Факт: срез в Caddy невозможен
admin-API зовут из браузера: 66 вызовов
/api/v1/admin/*в 12 файлах фронта (app/scrapers/**,components/scrapers/*,lib/admin-audit-api.ts,GuardedRoute.tsx,Topbar.tsx). Реализован только guard-вариант.Механизм (
rbac.py)_unauthenticated(path, detail): на_ADMIN_API_RE—404 {"detail": "Not Found"}(+logger.infoо зонде), иначе прежний 401. Через него все три анонимные ветки:auth_mode != dual, нетX-Authenticated-User, невалидныйX-Internal-Auth-Secret(#2213). Аутентифицированные не тронуты: admin → 200, не-admin → 403 «admin only».Смоук периметра: пара
/trade-in/api/v1/admin/proxies(реальный) и/admin/users(нет) — обе 404; ПТИЦАgendsgn.ru/api/v1/admin/*оставлен 401 (другой бэкенд за basic_auth).Тесты
test_rbac.py: существующий…_no_header_on_admin_path_returns_401→_404(он фиксировал старое поведение); +2: сравнение ответ-к-ответу существующей vs несуществующей admin-ручки, admin 200 / analyst 403 //meанониму 401; покрытие всех трёх анонимных веток. Полный suite5464 passed. Фальсификация (откат rbac.py):существующая → 401 …, несуществующая → 404 …,подделка мимо Caddy → 401— по значению.Прод-приёмка
scripts/smoke-mera-perimeter.sh(оба admin-пути 404) + живой админ-UI под admin (/scrapersработает). Внешних интеграторов, ходящих в admin-API анонимно, в коде нет.Deep-ревью ⚠️ approve. Остаточный оракул, названный ревью («подделанный
X-Authenticated-Userс именем не из roles.yaml → 403 vs 404 — жив внутри docker-сети, если секрет пуст»): проверено на проде —TRADEIN_INTERNAL_AUTH_SECRETв контейнере tradein-backend непустой (64 символа), гейт #2213 действует; снаружи заголовок срезает Caddy (apps.caddy:205, :590).Единственный minor (ветка
db_onlyв тесте зелёная по построению — сверятьdetailравенством) — в доводке; мерж после неё и зелёного CI.