Skip to content

P1 infra: fail fast on empty JWT_SECRET/INTERNAL_TOKEN and require exp in JWT #53

Closed

Description

@SlavaKuntsov

JWT_SECRET с дефолтом change-me-... захардкожен во всех Go-сервисах (gateway/main.go:24, metadata/main.go:57, upload/main.go:38) и auth (config.py:7); compose передаёт ${JWT_SECRET} без проверки. jwt.Parse не требует exp — токен без exp валиден навсегда. Пустой INTERNAL_TOKEN делает /internal/* metadata открытыми (internal.go:11) и молча отключает идемпотентность transcoder; сравнение секрета не constant-time.

Фикс: fail fast при старте на пустых JWT_SECRET/INTERNAL_TOKEN (кроме явного ENV=dev); jwt.WithExpirationRequired() + обязательный type == "access" во всех трёх мидлварях; constant-time compare в InternalAuth.
Verify: make up без секрета падает с внятной ошибкой; токен без exp → 401.
Источник: docs/REVIEW-2026-09-13-merged.md M6


Автоматически создано из сводного ревью. Сверяй актуальность номеров строк — они зафиксированы на коммите 91efb5b.

Activity

  1. self-assigned this
    on Sep 14, 2026
  2. SlavaKuntsov commented on Sep 18, 2026

    @SlavaKuntsov
    OwnerAuthor

    Ready for review — Phase 16

    Implemented (#53)

    • Go (gateway/metadata/upload): requireEnv — fail fast на пустых JWT_SECRET/INTERNAL_TOKEN при старте, кроме ENV=dev; хардкод change-me-... убран
    • Auth (python): validate_secrets() в lifespan — fail fast на пустом JWT_SECRET (та же семантика, ENV=dev bypass)
    • jwt.WithExpirationRequired() + обязательный type == "access" во всех мидлварях (gateway Auth/Optional/hls, metadata Auth/Optional, upload Auth)
    • Constant-time compare (crypto/subtle) в metadata InternalAuth + тест
    • compose: ${JWT_SECRET:?}/${INTERNAL_TOKEN:?} — make up без секретов падает с внятной ошибкой
    • Makefile: dev-таргеты с ENV=dev; .env.example — предупреждение про prod
    • Тесты: токен без exp → 401, без type → 401 (gateway/metadata/upload)

    Verification

    Commits: b38a01d (+ cf78449 fixes). PR закроет тикет через Closes #53.

  3. SlavaKuntsov commented on Sep 18, 2026

    @SlavaKuntsov
    OwnerAuthor

    Pull request opened

    #77 — will auto-close via Closes #53 on merge.

    Project status: In review (synced).

    Verification

    • make test-py / make test-go — pass
    • make lint-py / make lint-go / make lint-front — чисто
    • make up && make e2e — PASS на чистых volumes

    Remaining risks

    none known (follow-up: #76)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:infraarea:infraphase:16Phase 16 security hotfix: CRITICAL chain + CVE

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions