Skip to content

feat(phase-16): security hotfix (CVE, JWT, secrets fail-fast) - #77

Merged
SlavaKuntsov merged 5 commits into
mainfrom
feat/phase-16-security-hotfix
Sep 18, 2026
Merged

SlavaKuntsov merged 5 commits into
mainfrom
feat/phase-16-security-hotfix

Conversation

@SlavaKuntsov

Copy link
Copy Markdown
Owner

Phase 16 — security hotfix (auth hardening, secrets fail-fast)

Закрывает оставшиеся открытые тикеты фазы 16 (родитель #66). Тикеты #43–#47 уже слиты ранее отдельными PR.

Closes #48
Closes #49
Closes #53

Что изменено

#48 — python-jose → PyJWT, passlib → argon2-cffi

  • services/auth/src/core/security.py: PyJWT 2.14 (HS256, require: ["exp","sub"]), PasswordHasher (argon2-cffi), лимит токена 8 KB до decode (CVE-2024-33664 — JWT-бомба)
  • обновлены pyproject.toml, uv.lock, docs/spec.md

#49 — password policy, email normalization, IntegrityError

  • password: Field(min_length=8) в RegisterRequest (login — без политики, не ломаем существующих)
  • email нормализуется в lowercase в register/login (validator в схемах)
  • IntegrityError на commit → rollback + 409 (гонка SELECT-then-INSERT)

#53 — fail fast на секретах, обязательный exp/type в JWT, constant-time internal auth

  • Go (gateway/metadata/upload): requireEnv — пустые JWT_SECRET/INTERNAL_TOKEN роняют сервис на старте, кроме ENV=dev; хардкод change-me-... убран
  • auth: validate_secrets() в lifespan — та же семантика для JWT_SECRET
  • 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

Acceptance criteria

Verification

  • make test-py — 38 passed (18 auth + 20 transcoder)
  • make test-go — pass (metadata/gateway/upload)
  • make lint-py / make lint-go (0 issues) / make lint-front — чисто
  • docker compose config — :? синтаксис валиден в dev и prod override
  • make up && make e2e — PASS на чистых volumes (OrbStack): полный пайплайн, presign, private HLS, resumable
  • живые проверки на стенде: короткий пароль 422, дубликат 409, регистр email 200, JWT без exp → 401

Review cycle

@SlavaKuntsov SlavaKuntsov self-assigned this Sep 18, 2026
@SlavaKuntsov
SlavaKuntsov merged commit c136cc0 into main Sep 18, 2026
4 checks passed
@SlavaKuntsov
SlavaKuntsov deleted the feat/phase-16-security-hotfix branch September 18, 2026 20:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant