0.134.91

Security (P0)

  • Гибридный детект command substitution ($(), backticks, $'...'): критический bypass закрыт. Раньше normalizeIFSVariants вырезала $(...) для матчинга, но shell исполнял оригинал — атакующий мог обойти deny-patterns через $(echo cm0gLXJmIC8=|base64 -d). Теперь содержимое подстановок анализируется рекурсивно: $VAR/${VAR}/$((expr)) разрешены, но если внутри $(cmd) или backticks найден deny-pattern — блок. Новые deny-паттерны для обфускации: echo|base64 -d, echo|xxd -r, printf с octal/hex escapes.
  • SSRF для SSH/SCP/SFTP/RSYNC/Telnet: раньше ContainsInternalURL искал только http(s)://. SSH к internal IP (10.0.0.1, 169.254.169.254 — метаданные AWS) не проверялся. Теперь hosts извлекаются из разрешённых сетевых команд и проверяются через SSRFGuard.IsHostPrivate (DNS-resolve + isPrivate). Fail-closed для неразрешимых host’ов. Поддержка IPv6 [::1].

Added

  • Allowlist-режим для exec (exec.mode): новое поле denylist (по умолчанию) | allowlist. В allowlist-режиме работают только команды из preset-списка и custom allow-паттерны — всё остальное блокируется. Принципиально надёжнее denylist против prompt injection. UI: селектор mode + инфо-баннер во вкладке «Выполнение».
  • Настраиваемые Resource Limits (exec.resource_limits): per-agent лимиты CPU (cpu_seconds), памяти (memory_mb), размера файла (file_size_mb), процессов (processes). Нулевое значение = выключено. Linux: через SysProcAttr.Rlimit; macOS: через ulimit-префикс; Windows: no-op. UI: карточка «Лимиты ресурсов» с чекбоксом включения.
  • Персистенция always_allow: при одобрении команды с «Всегда разрешать» — команда добавляется в custom_allow_patterns агента (anchored regex ^command$ с дедупом), больше не запрашивается. Раньше always_allow только разрешал текущий вызов.
  • Output sanitization: фильтр ANSI escape-последовательностей (CSI, OSC, SS3), null bytes и управляющих символов в stdout/stderr exec-команд. Защита от терминальных атак на WebUI и искажения LLM-контекста бинарным мусором.

Changed

  • macOS sandbox-exec hardening: профиль теперь содержит (deny network*) по умолчанию (fail-secure). Новое поле SandboxConfig.AllowNetwork для опционального разрешения сети. process-exec расширен с (literal "/bin/sh") до (subpath "/usr/bin") (subpath "/bin") (subpath "/usr/local/bin").
  • truncateOutput переписан на []rune: раньше срез по байтам мог разрезать многобайтовый UTF-8 посередине символа, создавая некорректный UTF-8 в выводе.
  • Windows process tree kill: TerminateProcessGroup/ForceKillProcessGroup теперь используют taskkill /T /PID вместо cmd.Process.Kill(), что гарантирует завершение дочерних процессов.

Fixed

  • Сигнал в exit code: при убийстве процесса сигналом ProcessState.ExitCode() возвращает -1. Теперь это корректно отображается как [Exit code: -1] (документированное поведение).