Заметки

Песочница для ИИ-агента: где безопасно выполнять код, который написала модель

M
Markabus
·11 сентября 2026 г.
Фотореалистичный кадр в серверной: на металлическом верстаке компактный одноплатный компьютер в закрытом прозрачном акриловом боксе, сетевой кабель от него отключён от коммутатора и лежит на столе, слева монитор с зелёным терминалом, на заднем плане серверная стойка с зелёными и янтарными индикаторами — иллюстрация к статье о песочницах для кода ИИ-агентов

У любого агента, который умеет писать код, рано или поздно возникает момент истины: код написан, и его надо запустить. Скрипт для обработки данных, миграция, тест, сборка проекта. И здесь самый простой вариант — выполнить прямо там, где работает агент, — оказывается самым опасным. Модель может ошибиться, может быть обманута через промпт-инъекцию, а может просто честно выполнить инструкцию, последствий которой никто не просчитал.

Ответ индустрии на этот вопрос — песочница: изолированная среда, где код агента выполняется так, чтобы ошибка стоила ровно одной удалённой песочницы, а не продакшена. Разберём, из чего выбирать и как это устроено.

Почему нельзя просто выполнить

Код, написанный моделью, стоит считать недоверенным по определению — не потому, что модель злонамеренна, а потому, что вы не можете гарантировать, что именно она сгенерирует. Три класса рисков, которые песочница закрывает:

Разрушительные действия. Одна ошибка в пути — и rm -rf вычищает не временную папку, а корень проекта. Модель не отличает «удалить кеш» от «удалить всё», если контекст ей это не объяснил.

Утечка секретов. Если код выполняется в окружении, где лежат переменные с ключами API, токенами и паролями от базы, он может их прочитать и отправить наружу — по ошибке или по чужой инструкции, спрятанной в обрабатываемом документе.

Захват ресурсов. Бесконечный цикл, утечка памяти, форк-бомба — и сервер, на котором крутится ещё и сайт, ложится. Без лимитов на процессор, память и время выполнения агент способен уронить машину, даже не желая этого.

Мы уже разбирали права, журналы и границы для агентов в целом — песочница закрывает конкретно ту часть, где агент исполняет произвольный код.

Уровни изоляции: от процесса до виртуальной машины

Слово «песочница» скрывает очень разные технологии, и главное различие — сколько общего у изолированного кода с хост-системой.

Отдельный процесс. Запустить код через subprocess с ограничением по времени — это не изоляция. Процесс видит ту же файловую систему, те же переменные окружения и ту же сеть. Годится только для доверенного кода.

Контейнер (Docker). Изоляция на уровне пространств имён ядра: своя файловая система, свои процессы, при желании — отсутствие сети. Быстро стартует, всем знакомо. Слабое место в том, что ядро общее с хостом: уязвимость в ядре позволяет выбраться из контейнера. Для большинства задач достаточно, для враждебного кода — с оговорками.

gVisor. Прослойка между контейнером и ядром: системные вызовы перехватываются и обрабатываются пользовательским «ядром-заглушкой», так что реальное ядро хоста код почти не трогает. Заметно безопаснее контейнера, немного медленнее на интенсивном вводе-выводе. Ставится как альтернативный рантайм Docker.

Микровиртуалка (Firecracker). Полноценная виртуальная машина со своим ядром, но настолько облегчённая, что стартует за десятки миллисекунд. Именно на Firecracker работают AWS Lambda и большинство облачных песочниц для агентов. Это самая сильная изоляция из практически применимых: чтобы навредить хосту, коду нужно выбраться из виртуальной машины.

Правило выбора простое: чем менее доверенный код и чем больше на хосте ценного, тем выше по этой лестнице стоит подняться.

Что нужно от песочницы именно для агента

Изоляция сама по себе — половина дела. Для агентных сценариев есть ещё несколько требований, которые легко упустить.

Сеть выключена по умолчанию. Большинству скриптов сеть не нужна вовсе. Если нужна — открывать точечно, по списку разрешённых адресов: зеркало пакетов, конкретный API. Открытая сеть превращает утечку данных в вопрос одной строки кода.

Внутри нет секретов. Ключи и токены живут снаружи, у оркестратора. Если задаче нужно обратиться к внешнему сервису, лучше дать ей узкий одноразовый токен, чем ваш основной ключ.

Лимиты на всё. Процессор, память, число процессов, время выполнения. Таймаут обязателен: зависший скрипт должен быть убит, а не ждать, пока кто-то заметит.

Одна задача — одна песочница. После выполнения среда уничтожается. Так одна задача не оставляет следов для следующей, а скомпрометированная среда не живёт дольше одного запуска. Если нужна преемственность — сохраняйте снимок явно, а не переиспользуйте живую машину.

Результат возвращается агенту. Стандартный вывод, ошибки, созданные файлы — всё это должно вернуться в цикл агента, чтобы он мог оценить результат и продолжить. Как этот цикл устроен, мы описывали в гайде о написании своего агента.

Готовые сервисы

Если не хочется собирать инфраструктуру, есть облачные песочницы, спроектированные ровно под агентов. Три заметных игрока — с оговоркой, что характеристики ниже приведены по данным самих вендоров.

Vercel Sandbox. Микровиртуалки на Firecracker, SDK для JavaScript и Python, образ по умолчанию уже содержит Node.js, Python и кодинг-агентов. Из интересного — сохранение состояния между запусками, снимки, и возможность выдать каждому агенту отдельного Linux-пользователя внутри одной песочницы, чтобы несколько агентов работали над задачей, не мешая друг другу. С 10 сентября 2026 года песочницы доступны во всех 20 регионах Vercel с выбором региона на любом тарифе; на Pro и Enterprise можно задать резервные регионы на случай, если основной недоступен. Оплата — за активное процессорное время и выделенную память, ставки зависят от региона.

E2B. Открытый проект, тоже на Firecracker, с заявленным стартом менее чем за 200 мс. Поддерживает Python, JavaScript и TypeScript, R, Java и Bash. Есть бесплатный тариф с разовым кредитом на использование и ограничением по длительности сессии, платный — с суточными сессиями и настраиваемыми ресурсами. Тарификация посекундная, порядка нескольких центов в час за виртуальное ядро.

Modal. Изоляция через gVisor, серверлесс-модель, доступ к GPU по требованию — то есть песочница, в которой агент может не только выполнить скрипт, но и запустить что-то тяжёлое. Ориентирован на масштаб: десятки тысяч одновременных сессий.

Общее у всех троих: быстрый старт, SDK, оплата за фактическое время, встроенная поддержка сценария «агент → код → результат». Различаются деталями: Vercel логично брать, если проект уже живёт на Vercel; E2B — если важна открытость и возможность самостоятельного развёртывания; Modal — если агенту нужны GPU.

Что доступно из России

Честный раздел, без которого статья была бы неполной. Все три сервиса выше — американские, и у них общая проблема для нашей аудитории: оплата картами российских банков, как правило, не проходит, а регионов размещения в России нет ни у одного. Технически подключиться можно, но рассчитывать на них как на основу продакшена — рискованно: доступ может закончиться в любой момент по независящим от вас причинам.

Поэтому для российских проектов реалистичный путь — своя песочница на своём сервере. Это не так страшно, как звучит: базовый вариант собирается за вечер, а инструменты все открытые.

Своя песочница на обычном сервере

Начать стоит с Docker — он уже есть почти на любом сервере, и при правильных флагах даёт приличную изоляцию для кода, который вы не считаете враждебным, а лишь недоверенным.

docker run --rm \
  --network none \
  --read-only \
  --tmpfs /tmp:size=256m \
  --memory 512m \
  --cpus 1 \
  --pids-limit 128 \
  --user 65534:65534 \
  --cap-drop ALL \
  --security-opt no-new-privileges \
  -v /srv/sandbox/task-42:/work \
  -w /work \
  python:3.12-slim \
  timeout 60 python main.py

Что делает каждая строка. --network none отрезает сеть целиком. --read-only запрещает писать куда-либо, кроме явно разрешённых мест — временной папки в памяти и рабочего каталога задачи. --memory, --cpus и --pids-limit не дают съесть ресурсы хоста. --user запускает код от непривилегированного пользователя, --cap-drop ALL снимает все расширенные права, no-new-privileges запрещает их вернуть. Внешний timeout убивает задачу через минуту. Флаг --rm уничтожает контейнер после завершения — одна задача, одна среда.

Рабочий каталог /srv/sandbox/task-42 — единственное, что связывает песочницу с хостом: туда оркестратор кладёт файлы задачи, оттуда забирает результат. В нём не должно быть ничего, кроме этой задачи.

Следующая ступень — gVisor. Устанавливается как дополнительный рантайм, после чего к той же команде добавляется --runtime runsc. Код перестаёт напрямую трогать ядро хоста — и вы получаете изоляцию заметно ближе к виртуальной машине, не меняя остального.

Firecracker на своём сервере возможен, но это уже отдельный проект: нужна поддержка виртуализации на машине и обвязка для управления микровиртуалками. Имеет смысл, когда агенты выполняют по-настоящему чужой код — например, присланный пользователями.

Как это встраивается в агента

С точки зрения агента песочница — это просто инструмент, обычно с именем вроде run_code. Оркестратор, получив вызов, создаёт каталог задачи, кладёт туда файлы, запускает контейнер с таймаутом, собирает вывод и созданные файлы, уничтожает контейнер и возвращает результат модели. Механика вызова инструментов описана в статье про tool calling — песочница ничем не отличается от любого другого инструмента, кроме того, что происходит внутри.

Полезно заметить, что существует и другая философия. Локальные среды вроде Claude Code или ZCode выполняют код прямо на машине разработчика, но с подтверждением человеком каждого опасного действия. Это не изоляция, а контроль — он работает, пока за столом сидит человек. Как только агент начинает работать автономно, по расписанию или от имени пользователей, контроль надо заменять изоляцией.

Частые ошибки

Выполнять на машине разработчика с полными правами — самая частая. Удобно до первого инцидента.

Передавать секреты внутрь через переменные окружения — если они там есть, код их прочитает. Секреты остаются у оркестратора.

Открытая сеть по умолчанию — данные утекают одной строкой. Открывайте точечно и только когда без этого нельзя.

Одна долгоживущая песочница на все задачи — состояние копится, компрометация живёт вечно, отладка превращается в археологию.

Нет таймаута — зависший скрипт держит ресурсы, пока его не заметят вручную. Иногда неделями.

Коротко

Код, написанный моделью, — недоверенный код, и выполнять его надо в изоляции. Лестница изоляции идёт от контейнера через gVisor к микровиртуалкам Firecracker, и подниматься по ней стоит по мере того, как растёт цена ошибки. Облачные песочницы — Vercel Sandbox, E2B, Modal — решают задачу под ключ, но из России на них полагаться рискованно; своя песочница на Docker с жёсткими флагами собирается за вечер и закрывает большинство сценариев. А главное правило не зависит от технологии: сеть выключена, секретов внутри нет, лимиты на всё, одна задача — одна среда.

Частые вопросы

Q.Достаточно ли обычного Docker для песочницы агента?

Для недоверенного, но не враждебного кода — да, если запускать с жёсткими флагами: без сети, с файловой системой только для чтения, лимитами на память и процессор, от непривилегированного пользователя и с таймаутом. Слабое место — общее ядро с хостом; если код может быть враждебным, добавьте gVisor или переходите на микровиртуалки.

Q.Чем микровиртуалка Firecracker лучше контейнера?

У неё собственное ядро, а не общее с хостом, поэтому уязвимость в ядре не позволяет выбраться наружу. При этом она настолько облегчена, что стартует за десятки миллисекунд — на ней работают AWS Lambda и большинство облачных песочниц для агентов.

Q.Можно ли пользоваться Vercel Sandbox или E2B из России?

Технически — возможно, но оплата картами российских банков, как правило, не проходит, и регионов в России нет. Строить на них продакшен рискованно. Реалистичный путь — своя песочница на Docker или gVisor на собственном сервере.

Q.Нужна ли песочница, если я работаю в Claude Code или Cursor?

Локальные среды заменяют изоляцию контролем: человек подтверждает опасные действия. Это работает, пока вы сидите за столом. Как только агент начинает работать автономно — по расписанию или от имени пользователей, — контроль нужно заменять изоляцией.

Источники

Предыдущая
Мониторинг ошибок PHP на проде: как узнавать о падениях первым

Читайте также

Тёмный рабочий стол разработчика: на изогнутом мониторе дашборд мониторинга ошибок с синими графиками и красным всплеском, рядом второй экран с логами в терминале, клавиатура и телефон с уведомлениемЗаметки
11 сентября 2026 г.

Мониторинг ошибок PHP на проде: как узнавать о падениях первым

На проде вывод ошибок выключен — и падение легко остаётся незамеченным неделями. Разбираем, как настроить автоматический сбор ошибок PHP: базовые настройки интерпретатора, подключение SDK, что нельзя отправлять наружу, сколько это стоит и когда выгоднее поднять трекер на своём сервере.

Читать →
Тёмный рабочий стол разработчика: крупным планом монитор с бегущим логом в терминале, среди серых строк выделяются красные строки ошибок; на заднем плане размытая серверная стойкаЗаметки
10 сентября 2026 г.

Логи WordPress: как включить и читать

Три строки в wp-config.php включают запись всех ошибок PHP в файл. Разбираем, куда попадает debug.log, как закрыть его от посторонних, что означают Fatal error, Warning и Deprecated и как за минуту найти виновный плагин.

Читать →
Рабочее место разработчика ночью: на переднем мониторе — редактор с PHP-кодом, на втором — страница товара интернет-магазина; свет от экранов падает на клавиатуру и столЗаметки
8 сентября 2026 г.

Хуки WooCommerce: как менять поведение магазина

Хуки — штатный способ менять магазин на WooCommerce, не трогая файлы плагина. Разбираем действия и фильтры, приоритеты, remove_action, пять рабочих рецептов и главную ловушку 2026 года — блочные «Корзину» и «Оформление заказа», где классические хуки просто не вызываются.

Читать →