0.134.33

Fixed (DEFERRED-задачи §3.6 Channels/Updater/Email, см. docs/audit/backend-2026-06.md §3.6)

  • H-CH-14 IsSystemPath не покрывал /Applications/, /Library/, /System/, C:\PROGRAMDATA\ — добавлены недостающие prefix’ы. Авто-обновление теперь корректно отключается для бинарников, установленных в системные директории macOS/Windows.
  • H-CH-11 Install проверял backup-path строковым сравнением без учёта symlink’ов — атакующий с write-доступом к директории мог подменить бинарник через symlink. Добавлены os.Lstat (проверка на symlink) и filepath.EvalSymlinks для корректного сравнения.
  • H-CH-15 setExecutable делал один os.Chmod — на NFS/exFAT/сетевых FS это могло упасть с ENOTSUP. Добавлен retry-loop (3 попытки × 100ms backoff) с логированием через slog.Warn при финальной ошибке.
  • H-CH-17 PermissionsHandler.Update не записывал audit-log при изменении разрешений агента. Добавлен вызов CreateAuditLog с action=permissions.update и деталями (custom_allow_count, custom_deny_count, sandbox).
  • H-CH-16 Подтверждено: customAllowPatterns уже пробрасывается в ExecGuard через agent/runner.go:717-729. Пометено как FIXED (audit был основан на старом коде).
  • H-CH-10 TOCTOU между manifest snapshot и applyUpdateinstallRunning atomic.Int32 заменён на installMu sync.Mutex + TryLock(). CheckNow и Install теперь атомарно сериализованы.
  • H-CH-18 MatchWhitelist проверял только envelope-from. Добавлено поле ReturnPath в FetchedMessage (парсится из Return-Path header), новая функция MatchWhitelistDual для dual-check (envelope-from + Return-Path).
  • H-CH-4 Нет allowlist для to/cc (SMTP) — prompt-injection мог отправить на произвольный адрес. Добавлены колонка allowed_recipients (миграция 073) и проверка получателей в Send/SendWithAttachments через glob/regex-паттерны.
  • H-CH-3 Нет TLS pinning для SMTP — MITM-атака при компрометации CA. Добавлены колонка smtp_tls_pins (миграция 073), метод SetTLSPins, VerifyPeerCertificate callback с SHA-256 SPKI pin match.
  • H-CH-12 SaveCurrentBinaryAsBackup не верифицировал backup-файл после копирования — race с selfupdate на backup-каталоге. Добавлена проверка os.Lstat (regular file) после atomicCopyFile.

Added

  • Миграция 073 (email_security): колонки smtp_tls_pins, allowed_recipients в email_accounts (SQLite + PostgreSQL).
  • Методы SMTPSender.SetAllowedRecipients, SMTPSender.SetTLSPins, SMTPSender.makeTLSConfig, SMTPSender.checkRecipient.
  • Функция MatchWhitelistDual(envelopeFrom, returnPath, patterns).
  • Поле FetchedMessage.ReturnPath.

Tests

  • TestIsSystemPath_LinuxDarwin / TestIsSystemPath_Windows / TestIsSystemPath_Normalisation / TestIsSystemPath_CaseSensitive_Darwin (H-CH-14).
  • TestInstall_SymlinkExeRejected / TestInstall_BackupPathEvalSymlinks (H-CH-11).
  • TestMatchWhitelist / TestMatchWhitelistDual / TestMatchWhitelist_EmptyPatterns (H-CH-18).
  • TestCheckRecipient / TestCheckRecipient_NoAllowlist / TestCheckRecipient_Patterns (H-CH-4).
  • TestMakeTLSConfig_NoPins / TestMakeTLSConfig_WithPins / TestTLS_PinVerification_Matches / TestTLS_PinVerification_Mismatch (H-CH-3).