0.134.24

Fixed (MEDIUM-аудит: 10 находок группы 4.4 Security, см. docs/audit/backend-2026-06.md §4.4)

  • M-X-1 security.SSRFGuard.IsPrivate — добавлен doc-комментарий с явным указанием приоритетов (blacklist > whitelist > глобальный blockedNetworks). Контракт зафиксирован тестом TestBlacklistOverridesWhitelist.
  • M-X-2 security.NewSSRFGuard — при невалидном CIDR (whitelist или blacklist) теперь пишется slog.Warn с указанием CIDR и ошибки. Ранее опечатки в CIDR молча игнорировались, ослабляя или ужесточая защиту непредсказуемо.
  • M-X-3 security.ExecGuard — все defaultDenyPatterns и defaultPresetPatterns теперь case-insensitive через inline (?i). Убран strings.ToLower(cmd) в checkPresetCommand/IsPresetCommand. Ранее APT INSTALL EVIL обходил \bapt\b-паттерны, потому что они применялись без ToLower.
  • M-X-4 security.isCredentialKey — добавлен паттерн "pass" (покрывает MY_PASS, MYSQL_PASS, USER_PASS и т.п.). Ранее "password"/"passwd" не покрывали короткий суффикс pass.
  • M-X-5 security.NormalizeCommand — добавлена проверка Unicode-категорий Zl (Line Separator U+2028) и Zp (Paragraph Separator U+2029). Они не покрываются ни zeroWidthRunes, ни unicode.Cf, но могут использоваться для обхода deny-patterns.
  • M-X-6 security.NormalizeCommand — doc-комментарий обосновывает scope unicode.Cf (bidi-метки, теги и т.п.) в CLI-контексте. Поведение не изменилось — фикс только документационный.
  • M-X-7 security.ScrubSecrets — добавлен base64-декодер для блоков длиной ≥30 символов. При декодировании проверяются известные secret-префиксы (sk-, sk-ant-, ghp_, AKIA и т.д.). Закрывает обход через base64-кодирование (например, c2stcHJvai0xMjM0NTY3ODkwYWJjZGVmZ2hpamtsbW4=).
  • M-X-8 security.SafeReadFilef.Read(buf) по stat.Size() заменён на io.ReadAll(io.LimitReader(f, 100MiB+1)) + проверка лимита. Закрывает partial read на regular files (при прерывании сигналом) и 0-байтовый stat на pipes/special files.
  • M-X-9 secrets.NewKeyManager — сигнатура изменена с *KeyManager на (*KeyManager, error). Невалидная длина ключа теперь возвращает явную ошибку, а не «пустой» KeyManager, маскирующий configuration errors. Обновлены LoadKeyManager (1 caller) и 4 теста.
  • M-X-10 secrets.reencryptOne — добавлен slog.Error в обе ветки ошибок (decrypt и encrypt) с явным label. Ранее ошибки терялись, если caller не проверял stats.Errors.

Tests

  • Новые: ssrf_test.go::TestNewSSRFGuard_InvalidCIDRIgnored, guard_test.go::TestExecGuard_CaseInsensitive + TestIsPresetCommand_CaseInsensitive, env_scrub_test.go::TestScrubCredentialEnv_PassSubstring, normalize_test.go::TestNormalizeCommand_LineParagraphSeparators, output_scrub_test.go::TestScrubSecrets_Base64Encoded + TestScrubSecrets_Base64NonSecretUnchanged, safeopen_test.go::TestSafeReadFile_PartialRead, keymanager_test.go::TestNewKeyManager_InvalidKey_ReturnsError + TestNewKeyManager_ValidKey_OK, reencrypt_test.go (новый файл с TestReencryptOne_DecryptError_AppendsAndLogs, TestReencryptOne_AlreadyActiveKey_NoOp, TestReencryptAll_LogsAndCountsErrors).
  • Обновлены: keymanager_test.go — все 4 вызова NewKeyManager обёрнуты в helper mustNewKeyManager (M-X-9 breaking change).

Build / Tests

  • go test ./internal/... — все тесты проходят (security, secrets, agent, memory, store и т.д.).
  • go build — OK.