Агенту нужен shell: либо песочница, либо отказ
Инструмент shell — самое мощное, что можно дать агенту. Заворачивайте каждую команду в песочницу уровня операционной системы, а если песочницы нет — отказывайте, а не запускайте без защиты. Небезопасный переключатель должен быть явным, шумным и выключенным по умолчанию.
🎯 Для Разработчик, который даёт агенту shell или инструмент выполнения кода
- Что изолирует минимальная песочница для команд агента
- Почему по умолчанию должен быть отказ, когда песочницы нет
- Как не дать аварийному выходу стать обычным путём
🐚 Чем shell отличается
Большинство инструментов делают одно. Shell делает всё, что может учётная запись: читает ключи, удаляет каталог, открывает сетевое соединение, запускает фоновый процесс. Агент, умеющий запускать команды, защищён ровно настолько, насколько надёжна коробка вокруг этих команд, потому что его инструкции приходят из текста, которому он может не доверять.
🧱 Что делает наша песочница
Наш инструмент shell для агентов никогда не запускает команду напрямую. Он оборачивает её программой изоляции: сначала bwrap, запасной вариант — firejail. С bwrap обёртка делает следующее.
- Начинает с пустого корня файловой системы в памяти и добавляет только то, что нужно команде, подключая это только для чтения: системные программы и библиотеки.
- Делает записываемыми лишь разрешённые рабочие папки и создаёт рабочий каталог внутри них.
- Изолирует список процессов, межпроцессное взаимодействие и имя хоста от остальной машины.
- Отключает сеть, если вызов явно её не разрешил.
- Умирает вместе с родителем, так что зависшая команда не переживает агента.
Список разрешённых рабочих папок задаётся настройкой, а путь вне него отклоняется до запуска обёртки.
🚫 Главное: нет песочницы — нет запуска
Если не установлена ни одна программа изоляции, инструмент не запускает команду «голой». Он возвращает ошибку no_sandbox_available и ничего не делает. Это решение, записанное в нашей заметке об архитектуре от 23 мая 2026: безопасное умолчание, которое отказывает при неисправности.
Аварийный выход существует, потому что на ноутбуке разработчика программы изоляции может не быть: переменная окружения, разрешающая команды без изоляции. Её использование пишет предупреждение при каждом запуске, а каждый вызов, разрешённый или отклонённый, попадает в запись аудита с указанием программы изоляции. Держите переключатель вне определений сервисов. Суть в форме: опасный режим требует осознанного заметного действия, а безопасный не требует ничего.
🛠️ Практика: оберните свой инструмент shell
- Решите, в какие папки команде можно писать, и запишите их одной настройкой.
- Установите программу изоляции на каждом хосте, где работают агенты. Проверьте скриптом, который печатает, какую он нашёл.
- Напишите обёртку так, чтобы список команды шёл в программу изоляции аргументами, а не строкой для второго shell.
- Отключите сеть по умолчанию. Добавьте флаг на вызов для немногих команд, которым она нужна, и логируйте каждое использование.
- Пусть инструмент возвращает понятную ошибку, если программы изоляции нет. Молчаливый запасной вариант не добавляйте.
- Добавьте одну переменную окружения для небезопасного режима. Пусть она печатает предупреждение каждый раз и не попадает в производственные юниты.
- Напишите тесты: запись вне разрешённых папок падает, сетевой вызов падает, отсутствие программы изоляции даёт отказ.
✅ Проверьте себя
- Запустите команду, которая пишет в вашу домашнюю папку. Она падает.
- Запустите команду, открывающую сетевое соединение. Она падает, если вызов не разрешил сеть.
- Уберите программу изоляции на тестовом хосте. Инструмент отказывает с названной ошибкой.
- Поищите переключатель небезопасного режима в определениях ваших сервисов. Его там нет.
🚧 Когда это не работает
- Выходы через разрешённые папки. Что вы сделали записываемым, то агент и может изменить. Не кладите в список корень репозитория, домашнюю папку и каталог с ключами.
- Включённая сеть. Если команде нужна сеть, она может отправить наружу всё, что прочитает. Разрешайте только для названных команд.
- Ошибки на уровне ядра. Песочница снижает риск, а не гарантирует. Обновляйте хост и не запускайте от самой привилегированной учётной записи.
- Медленные команды. Изоляция добавляет время старта. Не отключайте её ради миллисекунд.
- Контейнеры, скрывающие проблему. Если агент уже работает в одноразовом контейнере, второй слой может добавить мало. Решите это явно и запишите.
📊 Доказательства
На 3 ноября 2026, 21:53 UTC в коде инструмента shell было две программы изоляции. На хосте, где собрана эта страница, bwrap был установлен, а firejail — не установлен. В файле тестов песочницы shell было 14 тестов, а в файле общих тестов инструментов — 11.
| Что измерено | Варианты изоляции в коде инструмента, их наличие на этом хосте и число тестов |
| Когда | 3 ноября 2026, 21:53 UTC |
| Артефакт | Модуль инструмента shell, файл тестов песочницы и заметка о решении от 23 мая 2026 в нашем закрытом репозитории |
| Ограничение | Счётчики показывают, что поведение проверяется, но не что выхода нет |
➡️ Дальше
Что агент может затрагивать, читайте в Правах и потоках данных, а о выборах — в Развилках доступа агента к shell.
Источники
- Развилки доступа агента к shell: выбор вариантов доступа.
- Права и потоки данных: что агент может затрагивать.
- Чек-лист безопасности MCP-сервера: проверки перед подключением данных.
- Восстановление после сбойного, зависшего или неопределённого запуска: когда команда идёт не так.
🔗 Связи статьи
Открыть полный граф знаний ↗Связи опубликованных статей. Выберите узел, чтобы открыть статью у заголовка.
Связи статей · клавиатура / текст
Та же тема
- Векторная база — это карта, а не источник: чему нас научил поиск
- Когда неизвестно, сколько стоил вызов модели: заморозка, затем сверка
- Как разбить большую задачу для дешёвой модели: урок 24 000 байт
- Навыки, MCP-инструменты и правила: три способа дать агенту возможности
- Восемь ошибок наших агентов в shell и git и правило на каждую
- Несколько агентов, один репозиторий: правила владения из реальных инцидентов
Следующие шаги
Связанные материалы
Векторная база — это карта, а не источник: чему нас научил поиск
Векторная база находит фрагменты, близкие по смыслу к вашему вопросу. Она не знает, какие из них верны или актуальны. Считайте каждое попадание указателем: откройте названный файл, сверьте хэш, а числа берите из артефакта, а не из найденного абзаца.
ИИ-агенты и MCP простыми словамиКогда неизвестно, сколько стоил вызов модели: заморозка, затем сверка
Иногда вызов модели обрывается по таймауту, и вы не знаете, списал ли провайдер деньги. Никогда не записывайте это как ноль. Пометьте как неопределённое, остановите новые платные вызовы и пусть названный человек сверит это с выпиской провайдера. Отказы до генерации — исключение.
ИИ-агенты и MCP простыми словамиКак разбить большую задачу для дешёвой модели: урок 24 000 байт
Дешёвая модель хорошо справляется с одной небольшой чёткой задачей и плохо — с большой кучей. Мы ограничиваем задачу 24 000 байт и отклоняем большие до вызова любой модели. Режьте по единицам — один файл или одна страна на задачу — и проверяйте размер до запуска.
ИИ-агенты и MCP простыми словамиНавыки, MCP-инструменты и правила: три способа дать агенту возможности
Агенты получают способности по-разному. Правило ограничивает, что они делают, навык говорит, как делать работу, а MCP-инструмент позволяет вызывать функцию. У каждого свой риск, поэтому объявляйте все три в реестре и проверяйте тестом, что ничего не существует вне списка.
💬 Комментарии