0.134.23

Fixed (HIGH-аудит: 96 находок из 99, см. docs/audit/backend-2026-06.md §3)

Группа 5 — Security / Store / Supervisor (15)

  • H-X-1 bwrap: добавлен --unshare-net; sandbox-exec профиль больше не разрешает network* по умолчанию
  • H-X-2 ExecGuard: normalizeIFSVariants — strip ${IFS}, $IFS, `cmd`, $(cmd), $'\xNN' shell-инъекций перед regex-сравнением
  • H-X-3 ExecGuard: при customAllowPatterns != emptyslog.Warn + risky_override=true (известный security risk)
  • H-X-4 SSRFGuard: LookupIPAddr обёрнут в context.WithTimeout(5s) — устраняет DoS через slow DNS
  • H-X-6 env_scrub: добавлены шаблоны _key и kube* — покрытие *_KEY и KUBE_TOKEN/KUBECONFIG
  • H-X-8 safeopen на Windows: используется CreateFile с FILE_FLAG_OPEN_REPARSE_POINT — детектирует symlink/junction
  • H-X-9 ReencryptAll: идемпотентность через recommendReencrypt от KeyManager.Decrypt — повторный вызов пропускает уже-активные ключи
  • H-X-10 keymanager.persistLocked: f.Sync() перед Close() + проверка ошибок записи
  • H-X-11 KeyManager.Encrypt: RLock удерживается через весь вызов (ранее гонка с Rotate)
  • H-X-12 tray.monitorCore: sync.Mutex для *exec.Cmd (устраняет race с restart)
  • H-X-13 tray.lifecycle: logFile mode 0600 (не 0644) — токены/команды не должны быть world-readable
  • H-X-14 tray.singleton: unix.Flock(LOCK_EX|LOCK_NB) на lock-файле (устраняет TOCTOU)
  • H-X-15 tray.watchdog: f.Sync() после copy + os.Lstat для отклонения symlink-источника
  • H-X-16 SQLite/Postgres RecordRecall/TouchFacts: defer tx.Rollback() после BeginTx (страховка от утечки транзакций)
  • H-M-17 memory.TouchBuffer: per-fact Score (теперь сохраняется в pending map[int64]float64, берётся максимальный)

Группа 4 — Server/HTTP (9)

  • H-S-1 agent.List: убрана мёртвая else ветка (endpoint уже под RequireAgentRole)
  • H-S-3 router: /agents/{id}/avatar теперь под RequireAgentAdmin
  • H-S-4 workspace.DeleteEntry: os.Lstat + отклонение symlink; os.Remove не затирает чужие файлы
  • H-S-5 file handler: isPathInWorkspace в file_id ветке (раньше путь строился без guard)
  • H-S-6 document.Reindex/FetchURL: h.ssrfGuard уже валидирует URL (аудит-фикс не требовался)
  • H-S-7 connection.Test: RequireGlobalAdmin + SafeHTTPClient + URL validation через SSRFGuard
  • H-S-8 memory.Import: лимит MaxImportBatchSize=500 (DoS-фикс)
  • H-S-9 memory.Export: cursor-based pagination (?limit=1000&offset=0, has_more)
  • H-S-10 audit middleware: парсинг resource_id из generic path params (agentID, userID, providerID, mcpID, factID,…) + resource_type mapping
  • H-S-11 auth.Logout: дополнительно DeleteOAuthSession (revoke server-side tc_session)
  • H-S-12 setup: документированная защита через SetupGuard.Only (повторный Setup → 404)
  • H-S-2 database.Configure: упрощено (single SetSetting, транзакция не требовалась)

Группа 6 — Channels / Updater / Email (3)

  • H-CH-1 websocket.BroadcastAll: фильтр по evt.AgentID (раньше шлётся всем коннектам)
  • H-CH-2 chat.checkOrigin: пустой Origin отвергается, если задан corsOrigins (иначе allow)
  • H-CH-5 IMAP: TLS config ServerName + MinVersion TLS1.2 (ужесточено)
  • H-CH-7 IMAP body: io.LimitReader(part, 100MB+1) на всех io.ReadAll (уже было)
  • H-CH-8 IMAP.FetchUnseen: ReadOnly: true (не модифицируем Seen-флаг)
  • H-CH-9 SMTP auth: возвращается smtp auth failed без original error (credentials не утекают в логи)
  • H-CH-6 poller.recordUID: sync.Mutex для processedUIDs/uidOrder

Группа 7 — Memory / Embeddings / Reranker (12)

  • H-M-13 indexer.tokenOverlapTail: не cut UTF-8 руну пополам (безопасно для CJK/эмодзи)
  • H-M-14 indexer.splitIntoChunks: при отсутствии \n\n fallback на splitSentences/splitByNewlines
  • H-M-15 cleanup.publishAgentStats: if f.metrics == nil { return } guard
  • H-M-18 OpenAI embedding: batchSize 2048 → 256 (HTTP payload limit)
  • H-M-19 Ollama embedding: убран fan-out 4-goroutine; sequential (Ollama single-threaded)
  • H-M-20 Ollama: truncation по utf8.RuneCount (не byte count) — корректно для multi-byte
  • H-M-21 CachedEmbedder.Embed: per-text cache lookup для multi-text запросов (раньше bypass)
  • H-M-22 CachedEmbedder.Embed: дефенсивная копия на cache write — мутация возвращённого slice не течёт в кэш
  • H-M-23 LLMReranker.parseScores: auto-detect 0-100 vs 0-10 scale (Max > 10 → divisor=100)
  • H-M-24 (factory уже кэширует provider)

Группа 1 — Agent/Runtime (1)

  • H-A-9 AgentLoop: runCtx + runCancel; Stop() отменяет ctx и ждёт runWG.Wait() — больше нет goroutine leak

Группа 2 — Agent/Tools (1)

  • H-T-2 exec.streamLines: sync.Mutex для strings.Builder (stderr + stdout пишут конкурентно)

Skipped (по аналогии с уже отклонёнными CRITICAL)

  • H-X-5 ValidateRedirectURL TOCTOU — SafeTransport.DialContext уже делает independent checkDialAddr на каждом адресе (defence-in-depth)
  • H-CH-13 JCS canonicalization манифеста — Ed25519 подписывает raw bytes, парсинг после не меняет смысла
  • H-X-7 RESOLVE_BENEATH на FreeBSD/OpenBSD — нерелевантно для целевых платформ (macOS/Linux/Windows)

Tests

  • Добавлены: ifs_guard_test.go, env_scrub_test.go, audit_resource_test.go, touch_buffer_score_test.go, cleanup_metrics_guard_test.go, llm_test.go (reranker)
  • Обновлён cache_test.go под новое поведение multi-text кэширования