0.134.19

Security

  • C-S-1: GetAgentStats — заменён запрос к удалённой таблице sessions на COUNT(DISTINCT thread_id) FROM messages, чинит 500 на /agents/{id}/stats после миграции 049
  • C-S-2: FindSimilarEntities — проброшен userID через dual.go/sqlite.go/postgres.go, фильтрация KG-сущностей по пользователю (закрывает утечку данных между пользователями)
  • C-H-1: IDOR в /agents/{id}/messages/{msgID} — добавлен requireMessageInAgent хелпер, валидация agentID в GetMessage/SetReaction/ToggleFavorite
  • C-H-2: IDOR в /kg/* — write-операции (DeleteEntity/DeleteRelation/Rebuild) обёрнуты в RequireAgentAdmin
  • C-H-3: /providers/{id}/diagnostics — обёрнут в RequireGlobalAdmin (ранее доступен любому авторизованному)
  • C-CH-5: /agents/{id}/approvals/{id}/resolve — обёрнут в RequireAgentAdmin (ранее доступен agent_user)
  • C-H-4: Setup-токен — поддержка X-Setup-Token header (fallback на JSON body для backward compat)
  • C-H-5: /healthz — убраны version и uptime из публичного эндпоинта (anti-fingerprinting)
  • C-H-6: ChatHandler.tickets — добавлен фоновый GC (30s), nil-check перед доступом к t.expiresAt
  • C-H-8: Refresh-токен — добавлен client_id в refresh-токены, сверка при обмене (migration 072)
  • C-SC-2: Sandbox — WrapCommandBwrap/WrapCommandSandboxExec переведены на argv-array без sh -c
  • C-SC-3: keys.json — HMAC-SHA256 подпись при записи, верификация при чтении (с migration path для старого формата)
  • C-SC-4: Refresh-rotation — unified “invalid credentials” для lockout и неверного пароля (оба 401)
  • C-SC-5: Lockout info leak — единое сообщение “invalid credentials” вместо раскрытия времени блокировки
  • C-SC-6: JWT secret — валидация len(secret) >= 32 в NewTokenService
  • C-SC-7: Lockout persistence — Persist/Load методы для сохранения lockout-состояния в файл
  • C-SC-8: Lockout cap — max 1000 entries + GC expired при RecordFailure
  • C-SC-12: SSRF — добавлены unit-тесты для IPv4-mapped IPv6
  • C-SC-13: SSRF — расширены blockedNetworks: multicast (224.0.0.0/4), reserved (240.0.0.0/4), benchmarking (198.18.0.0/15), TEST-NET-1/2/3
  • C-SC-14: SSRF — отключён HTTP proxy в SafeTransport (Proxy: nil)
  • C-CH-1: SMTP Header Injection — sanitizeHeader() для Subject/From/In-Reply-To/References
  • C-CH-10: SMTP filename injection — sanitizeFilename() для Content-Disposition
  • C-CH-11: SMTP boundary — randomBoundary() переведён на crypto/rand
  • C-CH-12: SMTP credentials scrub — TestConnection не раскрывает credentials в ошибке
  • C-CH-2: IMAP — все io.ReadAll() обёрнуты в io.LimitReader(part, 100MB+1)
  • C-CH-7: Updater TLS — ServerName/MinVersion: TLS 1.2 в tls.Config, убран tcp4
  • C-CH-6: Permissions — ApplyAutonomyOverlay явно deny MCP для readonly/supervised уровней

Fixed

  • C-S-3: AsyncAddMessage — заменён fire-and-forget goroutine на buffered channel + writer-goroutine с логированием ошибок
  • C-S-4: N+1 в ListAgents — batch loadAgentProviderIDsBatch/loadAgentModelIDsBatch через WHERE agent_id IN (...)
  • C-CH-3: WebSocket — server-side ping-ticker (30s) + per-connection idle timeout (60s)
  • C-CH-4: WebSocket — generateConnID/generateChatID переведены на atomic.Uint64 counter
  • C-CH-9: Whitelist — добавлена документация о проверке только envelope-from

Changed

  • C-M-1: persistSummary — корректная передача userID вместо nil
  • C-M-3/C-M-4: OpenAI/Ollama embedding clients — добавлен http.Client{Timeout: 60s}
  • C-M-5: SwappableEmbedder.Swap — возвращает ошибку при несовпадении размерностей
  • C-M-6: Reranker — параллелизация batch-обработки через WaitGroup + semaphore (max 4 concurrent)
  • C-SC-10: Argon2id параметры — задокументирован осознанный выбор t=3, p=4