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](документированное поведение).