tiktak: LFI/auth-bypass в /vtt/, утечка превью, креды

- handleVtt: id валидируется как положительное целое, ошибка GetVideo
  больше не игнорируется. Закрывает сразу два вектора: обход ACL через
  нулевой db.Video (Private=false => haveAccess пропускал анонима) и
  path traversal в path.Join(VttFolder, vid+".vtt").
- handleCreate: резкое превью приватного видео удаляется после блюра,
  иначе оно оставалось доступным в public/static через echo.Static.
- main.go: DSN приведён к паролю из compose (5935004 поменял только
  compose, из-за чего сервис не достучался бы до базы).
- db: пароли хешируются sha256 с pepper, сверка в Go constant-time,
  плейнтекст принимается как legacy => старые юзеры не теряют доступ.
- cookies: HttpOnly + Path=/ + SameSite=Lax.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-26 11:42:05 +03:00
co-authored by Claude Opus 5
parent 152aed5b87
commit fac56abb1d
5 changed files with 81 additions and 9 deletions
+4 -1
View File
@@ -17,9 +17,12 @@ import (
)
func main() {
// Rotated DB password. Must stay in sync with MYSQL_ROOT_PASSWORD in
// docker-compose.yml AND with the actual MySQL user (ALTER USER) when the
// ./db_data volume already exists.
conn, err := dbr.Open(
"mysql",
"root:root@tcp(db:3306)/tiktak", nil)
"root:cRazy_P4ssw0rd_MeOw_Me0W_676767676767@tcp(db:3306)/tiktak", nil)
if err != nil {
panic(err)