ИИ-агенты и автоматизация
sandbox-runtime от Anthropic: песочница агента без Docker
sandbox-runtime (команда srt) — открытая утилита Anthropic под лицензией Apache 2.0, которая ограничивает любому процессу файлы и сеть средствами самой ОС, без контейнера. Её опубликовали в октябре 2025 года, на 30 октября 2026 года последняя версия — 0.0.81, у репозитория 6853 звезды. По внутренним данным Anthropic, песочница сократила число запросов разрешений в Claude Code на 84%.
В конце октября утилиту снова разнесли по каналам как свежую новость. Это не так: ей ровно год. Но за этот год она выросла из эксперимента в инструмент, который стоит знать каждому, кто запускает агента на своей машине. Разберём по README, что она делает на самом деле.
Что такое sandbox-runtime и почему о нём заговорили снова
Это обёртка вокруг команды. Вы пишете srt перед тем, что хотите запустить, и процесс со всеми потомками получает ограничения: куда можно писать, что можно читать, в какие домены ходить.
Хронология по первоисточникам такая.
| Дата | Что произошло |
|---|---|
| 20 октября 2025 | Первая публикация пакета в npm и инженерная статья Anthropic о песочнице Claude Code |
| 4 июня 2026 | Версия 0.0.53, первые изменения для Windows |
| сентябрь 2026 | Репозиторий переехал из anthropic-experimental в основную организацию anthropics |
| 20 октября 2026 | Версия 0.0.81, текущая на момент публикации |
Стадия по README — бета, исследовательское превью. Утилиту сделали для Claude Code, а наружу выложили, чтобы остальные могли строить более безопасных агентов. Формат настроек и API, как прямо предупреждает README, ещё могут меняться.
Как srt устроен на macOS, Linux и Windows
Ответ короткий: на каждой системе он берёт её родной механизм изоляции и добавляет поверх свои прокси для сети.
| Система | Чем ограничиваются файлы | Как идёт сеть | Что доустановить |
|---|---|---|---|
| macOS | sandbox-exec с профилем Seatbelt, сгенерированным на лету | профиль разрешает только порт локального прокси | ripgrep |
| Linux | bubblewrap | сетевое пространство имён удалено, трафик идёт через Unix-сокет к прокси на хосте | bubblewrap, socat, ripgrep |
| Windows, альфа | отдельная учётная запись srt-sandbox, урезанный токен, явные права на каталоги | фильтры Windows Filtering Platform по идентификатору этой учётной записи | ничего, но нужна разовая установка с правами администратора |
Прокси два: HTTP для веба и SOCKS5 для прочего TCP. Оба сверяют каждое соединение со списками разрешённых и запрещённых доменов.
На Ubuntu 24.04 и новее есть подводный камень. Там по умолчанию урезаны непривилегированные пространства имён пользователя, а bubblewrap они нужны. README советует либо снять ограничение через sysctl, либо дописать профиль AppArmor.
Что srt запрещает по умолчанию, а что нет
Сеть и запись закрыты, чтение открыто. Это асимметрия, которую легко пропустить.
| Ресурс | По умолчанию | Как открыть или закрыть |
|---|---|---|
| Сеть | закрыта полностью | allowedDomains, запреты в deniedDomains побеждают |
| Запись | запрещена везде | allowWrite, исключения в denyWrite |
| Чтение | разрешено везде | denyRead закрывает, allowRead открывает обратно внутри закрытого |
| Unix-сокеты | ограничены | на macOS allowUnixSockets по путям, на Linux только allowAllUnixSockets целиком |
Пустой список доменов означает «без сети», пустой список записи — «писать никуда». А вот чтобы агент не прочитал ~/.ssh, это нужно написать явно. Пример из README так и делает: denyRead: ["~/.ssh"].
У сетевого фильтра есть полезная деталь. Разрешённое имя перед соединением резолвится, и адрес отбрасывается, если он ведёт на локальный интерфейс, link-local вроде 169.254.0.0/16 или известные адреса метаданных облаков. Подменить DNS у разрешённого домена и увести агента на внутренний сервис так не выйдет.
Какие файлы srt закрывает от записи всегда
Даже если вы разрешили запись во весь каталог проекта, часть файлов останется только для чтения. Это защита от того, чтобы агент не прописал себе запуск вне песочницы.
Всегда закрыты конфиги оболочки (.bashrc, .zshrc, .profile и соседи), .gitconfig и .gitmodules, .mcp.json, каталоги .vscode/ и .idea/, хуки и конфиг git, а также .claude/commands/ и .claude/agents/.
Логика понятная. Запись в .git/hooks/pre-commit выглядит безобидно, но следующий git commit вы запустите уже сами, без всякой песочницы. Ровно такие ходы описаны в нашем разборе, где агент обходил запрет окольным путём.
На Linux эти файлы ищутся вглубь проекта на три уровня по умолчанию, настройка mandatoryDenySearchDepth поднимает глубину до десяти.
Как запустить srt за пять минут
Установка одной командой: npm install -g @anthropic-ai/sandbox-runtime. На Linux перед этим доставьте bubblewrap, socat и ripgrep, на macOS — ripgrep.
Дальше любая команда запускается через обёртку: srt "npm test". Без файла настроек действуют встроенные умолчания: сети нет, записи за пределами стандартных путей нет, чтение открыто.
Настройки лежат в ~/.srt-settings.json или в файле, указанном через --settings. Если файл есть, но пустой или не проходит проверку, srt не откатывается к умолчаниям, а завершается с ошибкой. Это правильно: тихий откат выкинул бы ваши запреты на чтение.
Самый показательный сценарий из README — MCP-сервер. В .mcp.json вместо npx пишется srt, а npx уходит в аргументы. Сервер файловой системы после этого не сможет писать в запрещённую папку. Что такое MCP и зачем он агенту, мы объясняли в материале что такое MCP.
Для своих программ есть библиотека: SandboxManager.initialize() поднимает прокси, wrapWithSandbox() оборачивает команду.
Чем srt отличается от Docker и микровиртуальных машин
srt — это не контейнер и не виртуальная машина. Он ограничивает процесс прямо на вашей системе, с вашим ядром и вашими инструментами.
В статье почему Docker не удержит агента мы раскладывали изоляцию на три уровня: микро-ВМ со своим ядром, перехват системных вызовов и контейнер с усиленной настройкой. srt встаёт рядом с третьим уровнем, но решает другую задачу.
| Подход | Своё ядро | Окружение агента | Где уместен |
|---|---|---|---|
| Микро-ВМ | да | отдельное | чужой и сгенерированный код на сервере |
| Docker с усиленной настройкой | нет | отдельный образ | свои сервисы, проверенный код |
| srt | нет | ваше, привычное | агент на машине разработчика, MCP-серверы, отдельные команды |
Главный плюс srt — не нужно собирать образ и пробрасывать проект внутрь. Агент видит ваши инструменты и ваш проект, просто не может писать мимо разрешённого и ходить мимо списка доменов.
Главный минус следует из того же: ядро общее, а граница — профиль ОС. Поэтому для недоверенного кода на сервере вывод той статьи не меняется.
Как спрятать API-ключ от самого агента
Это самая недооценённая часть README. Ключ к модели агенту нужен, но читать его настоящее значение агенту незачем.
Блок credentials перечисляет переменные окружения и файлы, чьи настоящие значения процесс видеть не должен. Режим deny просто их скрывает. Режим mask подкладывает внутрь песочницы подставное значение, а прокси меняет его на настоящее только в запросах к хостам из списка injectHosts. По умолчанию это ваши разрешённые домены.
Есть условия. Маскировка требует расшифровки TLS на прокси, чтобы настоящее значение уходило только по проверенному соединению. Файлы маскируются только на Linux, на macOS замаскированный файл просто становится нечитаемым.
Для агента, который ходит к моделям через KeyDealer, схема собирается из двух строк настройки: в allowedDomains один хост api.keydealer.ru, а ключ в credentials с режимом mask. Даже если агент выведет ключ в лог или попытается отправить его наружу, утечёт подставное значение, а расход ограничит лимит на ключ.
Мы эту связку на своей стороне не прогоняли, это конфигурация по документации. Общие правила хранения ключей — в материале как хранить API-ключи.
Где песочница srt не держит
README честно перечисляет слабые места, и их стоит знать до настройки.
Сеть фильтруется по именам, а не по содержимому. Разрешив github.com, вы разрешили и выгрузку данных в любой репозиторий. README отдельно предупреждает про широкие домены и про обход через domain fronting.
Unix-сокеты — дверь наружу. Разрешите /var/run/docker.sock, и агент через службу контейнеров получит доступ ко всему хосту.
Широкая запись — путь к повышению прав. Каталоги из PATH и системные конфиги в списке записи превращают песочницу в формальность.
Ослабляющие флаги. enableWeakerNestedSandbox нужен для работы внутри Docker без привилегий и, по словам README, заметно ослабляет защиту. allowAppleEvents на macOS убирает изоляцию выполнения кода целиком: запущенные через open приложения работают вне песочницы.
Сама утилита. Пакет нужно ставить вне разрешённых для записи путей. Копию в node_modules проекта агент может переписать, и следующий запуск srt пойдёт уже без песочницы.
На Windows список ограничений длиннее, и это нормально для альфы: фильтр, например, не видит трафик, который за процесс несут системные службы.
Почему песочница не заменяет права инструментов
srt отвечает на вопрос «что процесс может сделать на этой машине». Он не отвечает на вопрос «что агенту разрешено делать в ваших системах».
В разборе инцидента, где агент вырвался из песочницы, изоляция формально была. Не хватило другого: права на запись в сервис, который к задаче не относился. Если такой сервис стоит в allowedDomains, srt пропустит запрос к нему без вопросов.
Поэтому порядок прежний. Сначала решаете, какие инструменты и действия агенту нужны, по своду из материала какие права давать агенту. Потом переводите это в список доменов и путей для srt. Песочница здесь — способ принудительно соблюсти уже принятое решение, а не замена ему.
Кому srt подходит, а кому нет
Подходит, если агент работает на вашем ноутбуке и правит проект: Claude Code, Codex CLI, собственный скрипт, локальный MCP-сервер. Это ровно тот случай, ради которого утилиту делали.
Подходит как второй слой внутри контейнера, но с оговоркой про ослабленный режим без привилегий.
Не подходит как единственная граница для кода, который присылают пользователи сервиса. Там нужна отдельная виртуальная машина.
Чего мы не утверждаем
Мы не тестировали srt на своих машинах. Всё описанное взято из README, страницы релизов и статьи Anthropic. Настройки примеров проверяйте у себя.
Мы не утверждаем, что srt надёжнее контейнера. Это другой класс защиты с другими слабыми местами, и README сам называет его исследовательским превью.
Цифра 84% — внутренний замер Anthropic. Она говорит о том, сколько стало меньше запросов разрешений, а не о том, сколько атак песочница остановила.
Что держать в голове
Первое. sandbox-runtime не новинка, а годовалый инструмент, который за 2026 год дорос до Windows и переехал в основную организацию Anthropic. Стадия по-прежнему превью.
Второе. По умолчанию закрыты сеть и запись, а чтение открыто. Без denyRead для ключей и SSH песочница защищает меньше, чем кажется.
Третье. Узкий список доменов и замаскированный ключ дают больше, чем любой флаг изоляции. Что мы за проект — на странице о проекте, ключ с собственным лимитом под агента заводится на keydealer.ru/login.
Частые вопросы
Что такое sandbox-runtime от Anthropic?
Это открытая утилита srt под лицензией Apache 2.0, которая запускает любую команду с ограничениями на файлы и сеть средствами самой операционной системы, без контейнера. Её сделали для Claude Code, а затем выложили отдельно как исследовательское превью. Ставится из npm пакетом @anthropic-ai/sandbox-runtime.
Это новинка октября 2026 года?
Нет. Утилиту опубликовали 20 октября 2025 года, вместе с инженерной статьёй Anthropic о песочнице Claude Code. За год она дошла до версии 0.0.81 от 20 октября 2026 года, получила альфа-поддержку Windows и в сентябре 2026 года переехала в основную организацию anthropics на GitHub.
Какие механизмы она использует?
На macOS — встроенный sandbox-exec с профилем Seatbelt, который генерируется на лету. На Linux — bubblewrap с отдельным сетевым пространством имён, плюс socat и ripgrep. На Windows в альфе команда работает от отдельной учётной записи srt-sandbox, а сеть режется фильтрами Windows Filtering Platform.
Что запрещено по умолчанию?
Сеть закрыта целиком, пока вы не перечислите разрешённые домены. Запись запрещена везде, кроме явно разрешённых путей. Чтение, наоборот, по умолчанию открыто, и закрывать нужно самому: например, каталог ~/.ssh. Это главное, что стоит проверить в своей настройке.
Можно ли заменить ей Docker?
Для своей рабочей машины, где агент правит проект и ходит в пару доменов, — часто да, и это проще. Для чужого кода на сервере — нет: у srt нет своего ядра, а сетевой фильтр смотрит только на имена доменов. Там по-прежнему нужны микровиртуальные машины.
Как не отдать агенту API-ключ?
В настройке credentials ключ можно замаскировать: внутри песочницы процесс видит подставное значение, а настоящее прокси подставляет только в запросы к разрешённым хостам. Для этого нужно включить расшифровку TLS на прокси. Файлы маскируются только на Linux, на macOS замаскированный файл просто становится нечитаемым.