Tvijo wiki
Каталог

Темы

Агенту нужен shell: либо песочница, либо отказ

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

🎯 Для Разработчик, который даёт агенту shell или инструмент выполнения кода

📚 Вы узнаете
  • Что изолирует минимальная песочница для команд агента
  • Почему по умолчанию должен быть отказ, когда песочницы нет
  • Как не дать аварийному выходу стать обычным путём

🐚 Чем shell отличается

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

🧱 Что делает наша песочница

Наш инструмент shell для агентов никогда не запускает команду напрямую. Он оборачивает её программой изоляции: сначала bwrap, запасной вариант — firejail. С bwrap обёртка делает следующее.

  • Начинает с пустого корня файловой системы в памяти и добавляет только то, что нужно команде, подключая это только для чтения: системные программы и библиотеки.
  • Делает записываемыми лишь разрешённые рабочие папки и создаёт рабочий каталог внутри них.
  • Изолирует список процессов, межпроцессное взаимодействие и имя хоста от остальной машины.
  • Отключает сеть, если вызов явно её не разрешил.
  • Умирает вместе с родителем, так что зависшая команда не переживает агента.

Список разрешённых рабочих папок задаётся настройкой, а путь вне него отклоняется до запуска обёртки.

🚫 Главное: нет песочницы — нет запуска

Если не установлена ни одна программа изоляции, инструмент не запускает команду «голой». Он возвращает ошибку no_sandbox_available и ничего не делает. Это решение, записанное в нашей заметке об архитектуре от 23 мая 2026: безопасное умолчание, которое отказывает при неисправности.

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

🛠️ Практика: оберните свой инструмент shell

  1. Решите, в какие папки команде можно писать, и запишите их одной настройкой.
  2. Установите программу изоляции на каждом хосте, где работают агенты. Проверьте скриптом, который печатает, какую он нашёл.
  3. Напишите обёртку так, чтобы список команды шёл в программу изоляции аргументами, а не строкой для второго shell.
  4. Отключите сеть по умолчанию. Добавьте флаг на вызов для немногих команд, которым она нужна, и логируйте каждое использование.
  5. Пусть инструмент возвращает понятную ошибку, если программы изоляции нет. Молчаливый запасной вариант не добавляйте.
  6. Добавьте одну переменную окружения для небезопасного режима. Пусть она печатает предупреждение каждый раз и не попадает в производственные юниты.
  7. Напишите тесты: запись вне разрешённых папок падает, сетевой вызов падает, отсутствие программы изоляции даёт отказ.

✅ Проверьте себя

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

🚧 Когда это не работает

  • Выходы через разрешённые папки. Что вы сделали записываемым, то агент и может изменить. Не кладите в список корень репозитория, домашнюю папку и каталог с ключами.
  • Включённая сеть. Если команде нужна сеть, она может отправить наружу всё, что прочитает. Разрешайте только для названных команд.
  • Ошибки на уровне ядра. Песочница снижает риск, а не гарантирует. Обновляйте хост и не запускайте от самой привилегированной учётной записи.
  • Медленные команды. Изоляция добавляет время старта. Не отключайте её ради миллисекунд.
  • Контейнеры, скрывающие проблему. Если агент уже работает в одноразовом контейнере, второй слой может добавить мало. Решите это явно и запишите.

📊 Доказательства

На 3 ноября 2026, 21:53 UTC в коде инструмента shell было две программы изоляции. На хосте, где собрана эта страница, bwrap был установлен, а firejail — не установлен. В файле тестов песочницы shell было 14 тестов, а в файле общих тестов инструментов — 11.

Что измерено Варианты изоляции в коде инструмента, их наличие на этом хосте и число тестов
Когда 3 ноября 2026, 21:53 UTC
Артефакт Модуль инструмента shell, файл тестов песочницы и заметка о решении от 23 мая 2026 в нашем закрытом репозитории
Ограничение Счётчики показывают, что поведение проверяется, но не что выхода нет

➡️ Дальше

Что агент может затрагивать, читайте в Правах и потоках данных, а о выборах — в Развилках доступа агента к shell.

Источники

Связи опубликованных статей. Выберите узел, чтобы открыть статью у заголовка.

100%
→ Связанные статьи← Ссылаются сюда⋯ Та же тема
Связи статей · клавиатура / текст

💬 Комментарии

Комментарии публичны и модерируются. Не публикуйте персональные данные.
  • Комментариев пока нет. Будьте первым!

Следующие шаги

ИИ-агенты и MCP простыми словами

Векторная база — это карта, а не источник: чему нас научил поиск

Векторная база находит фрагменты, близкие по смыслу к вашему вопросу. Она не знает, какие из них верны или актуальны. Считайте каждое попадание указателем: откройте названный файл, сверьте хэш, а числа берите из артефакта, а не из найденного абзаца.

ИИ-агенты и MCP простыми словами

Когда неизвестно, сколько стоил вызов модели: заморозка, затем сверка

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

ИИ-агенты и MCP простыми словами

Как разбить большую задачу для дешёвой модели: урок 24 000 байт

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

ИИ-агенты и MCP простыми словами

Навыки, MCP-инструменты и правила: три способа дать агенту возможности

Агенты получают способности по-разному. Правило ограничивает, что они делают, навык говорит, как делать работу, а MCP-инструмент позволяет вызывать функцию. У каждого свой риск, поэтому объявляйте все три в реестре и проверяйте тестом, что ничего не существует вне списка.