Ну чё, малютки, агентам мы уже выдали shell, токены от GitHub, интернет и разрешили ставить себе скиллы. А кто за ними смотрит? Обычно сам агент: системный промпт «не делай плохого» плюс встроенная песочница харнеса, которая выключается одним флагом. Я на днях сам видел, как Codex не смог поднять свою песочницу bwrap внутри песочницы Claude Code, и выход мне предложили ровно один: --dangerously-bypass-approvals-and-sandbox.
NVIDIA в марте выкатила OpenShell — отдельный рантайм, который сидит между агентом и железом и решает, что агенту можно, а что нельзя. Поменять эти решения агент не может, даже если его взломали. Разбираемся, как оно устроено и от чего реально спасает.
OpenShell запускает агента (Claude Code, Codex, OpenCode, Copilot CLI, OpenClaw) в песочнице с изоляцией на уровне ядра. Файлы режет Landlock, сеть перехватывает seccomp, а решает всё супервизор снаружи песочницы по YAML-политике: какой бинарь, на какой хост, каким HTTP-методом и по какому пути. Настоящих токенов агент вообще не видит, их подставляют на выходе. Новые правила агент может попросить сам, а prover на Z3 проверяет, не открывают ли они дорогу к кредам. Лицензия Apache 2.0, написано на Rust.
Открыто целиком, репозиторий NVIDIA/OpenShell. Входит в NVIDIA Agent Toolkit.
Считал по байтам кода в репозитории. Ещё немного Go, Python и TypeScript для SDK и Helm-чарты для Kubernetes.
Вышла 27 октября 2026. Стабильные релизы раз в неделю, по вторникам. 20 тысяч звёзд на GitHub.
Зачем это всё
NVIDIA в анонсе описывает проблему как трилемму: безопасность, возможности, автономность — надёжно получаются только две из трёх. Дашь агенту полный доступ и отпустишь работать сутками — получишь, цитата, «долгоживущий процесс, который сам себя контролирует». Охрана сидит в том же процессе, который она охраняет.
Дальше в анонсе три фразы, которые хорошо показывают, чего бояться:
OpenShell выносит проверку за пределы процесса агента. Ограничения висят на окружении, в котором агент запущен, а не на его поведении. Промпт можно уговорить, Landlock — нет. NVIDIA сравнивает это со вкладками браузера: каждая сессия изолирована, а права рантайм проверяет до того, как что-то выполнится.
Справедливости ради, песочницы в Claude Code и Codex тоже работают на механизмах ядра, а не на промпте. Разница в том, кто ими управляет: харнес сам решает, когда включать песочницу и что в неё пускать, а ты можешь отключить её флагом. OpenShell оборачивает харнес снаружи, и изнутри его не выключишь.
Хронология: март → октябрь
Проект молодой и быстро меняется, так что весенние статьи про него местами уже устарели.
- 24 февраля 2026 — на GitHub появился репозиторий.
- 16 марта 2026 — анонс в блоге NVIDIA вместе с NemoClaw на GTC 2026. Тогда были версии 0.0.x.
- 25 сентября 2026 — v0.1.0, большой релиз, который ломает совместимость. Обновиться с 0.0.x на месте нельзя: только снести, поставить заново и пересоздать все песочницы.
- 27 октября 2026 — v0.1.6, актуальная на момент написания.
Самое заметное изменение в 0.1.0: из OpenShell выпилили управляемый маршрут инференса. В мартовском анонсе был «privacy router», который сам решал, куда отправить запрос к модели, по твоим правилам цены и приватности. В 0.0.x это работало так: агент стучался в inference.local, а OpenShell перенаправлял запрос дальше. Теперь openshell inference, API маршрутов и inference.local удалены. Ты подключаешь к песочнице провайдера (OpenAI, Anthropic, NVIDIA и т. д.), и агент ходит в его API напрямую, в родном формате. Видишь в гайде inference.local — значит, гайд для 0.0.x.
Как устроено
Компонентов немного:
Песочница с супервизором общаются по одному HTTP/2-соединению с взаимной аутентификацией. По чему его пустить, решает драйвер: Unix-сокет для Docker и Podman, TCP для Kubernetes, vsock для microVM.
Как проходит один запрос (по документации):
- Агент открывает TCP-соединение или делает DNS-запрос.
- Песочница определяет, какая программа это делает.
- Запрос уходит супервизору по Sandbox Protocol.
- Супервизор сверяет его с политикой и, если можно, добавляет креды.
- Если всё ок, супервизор сам открывает настоящее соединение и гоняет трафик.
Всё работает по принципу fail closed. Агент не стартует, пока супервизор не ответил, а если связь с супервизором пропала, агента замораживают.
На чём держится клетка
Внутри песочницы всё держится на механизмах ядра Linux:
- Landlock ограничивает доступ к файлам. Нужна ABI 3, то есть ядро 6.2+. Документация предупреждает, что одной версии ядра мало: нужные возможности надо проверять отдельно.
- seccomp user notification перехватывает сетевые вызовы и держит их, пока супервизор решает, пускать или нет.
- Агент работает от обычного пользователя без Linux capabilities. Root политика просто не пропустит:
run_as_userможно ставить от 1 до 4294967294.
Снаружи стоит второй забор, у каждого рантайма свой:
| Рантайм | Как отрезана сеть |
|---|---|
| Docker / Podman | у контейнера с агентом сеть выключена |
| Kubernetes | NetworkPolicy пускает только к сервису супервизора |
| microVM | у гостевой системы нет сетевого устройства |
Так что даже если агент как-то обойдёт seccomp, напрямую в интернет он не выйдет. Вся сеть идёт через супервизор.
Политика: кто, куда и каким методом
Политика — это YAML-файл. Вот пример прямо из документации:
version: 1
filesystem_policy:
include_workdir: true
read_only: [/usr, /lib, /etc]
read_write: [/tmp]
network_policies:
github_rest_api:
endpoints:
- host: api.github.com
port: 443
protocol: rest
enforcement: enforce
access: read-only
binaries:
- path: /usr/bin/gh
npm_registry:
endpoints:
- host: registry.npmjs.org
port: 443
protocol: rest
enforcement: enforce
access: read-only
allow_encoded_slash: true
binaries:
- path: /usr/bin/node
Что здесь важно:
Одни секции меняются на ходу, другие нет. filesystem_policy, landlock и process фиксируются при старте песочницы. network_policies и network_middlewares можно менять прямо во время работы, без рестарта. Доступ к файлам посреди сессии не расширишь, а сеть — пожалуйста.
Запрещено всё, что не разрешено. Любое исходящее соединение отклоняется, если под него нет правила в network_policies.
Правило привязано к бинарю. gh может читать API GitHub, а curl на тот же хост не пустят. Смотрят на настоящий путь к исполняемому файлу, а скрипт считается своим интерпретатором. Ещё OpenShell запоминает хэш бинаря при первом соединении и отказывает, если файл потом поменяли. Подложить свой gh не выйдет.
Проверка в два этапа. Сначала хост, порт и бинарь (L4). Если у эндпоинта задан protocol, дальше проверяется каждый запрос внутри соединения (L7): для rest это метод, путь и параметры. Ещё поддерживаются websocket, graphql, mcp, json-rpc и голый tcp. Пресет read-only — это GET, HEAD, OPTIONS, read-write добавляет POST, PUT, PATCH, full пускает всё. Запрет из deny_rules перебивает любой allow, где бы тот ни стоял в файле.
Метаданные облака закрыты всегда. Политика никогда не пустит на loopback, link-local и 0.0.0.0, в том числе на 169.254.169.254. Классический способ утащить креды инстанса в облаке здесь не сработает, даже если ты по глупости впишешь такое правило.
По умолчанию enforcement стоит в audit: нарушение L7-правил попадает в лог, а запрос проходит. Блокирует только enforce. Запрет соединений по умолчанию работает всегда, но если ты написал access: read-only и забыл enforcement: enforce, POST спокойно уйдёт. В примере выше enforce прописан явно, и это не случайно.
Покрути сам: политика та же, что в примере, плюс подключён провайдер GitHub.
gh может читать api.github.com, node может читать registry.npmjs.org, больше ничего. К песочнице подключён провайдер GitHub. Собери запрос и посмотри, на каком шаге его пропустят или завернут.Authorization: Bearer openshell:resolve:env:GITHUB_TOKEN
Креды, которых агент не видит
Больше всего мне в OpenShell нравится, как сделаны креды. Настоящих ключей агент внутри песочницы не видит вообще. При старте OpenShell меняет каждый кред в окружении агента на заглушку вида openshell:resolve:env:GITHUB_TOKEN. Агент кладёт её в заголовок как обычный токен, а супервизор на выходе подставляет настоящий.
Подставит он его, только если:
- сетевая политика пускает этот бинарь на этот адрес;
- кред привязан к хосту, порту и пути этого запроса.
Если агент (или injection, который им рулит) отправит заглушку на чужой хост, в ответ прилетит 403 с причиной credential_endpoint_mismatch. Украсть из окружения можно только строку openshell:resolve:env:..., а вне песочницы она ничего не стоит. Подставлять креды OpenShell умеет в заголовки, Basic auth, query, путь URL, тело запроса и WebSocket (последние два надо включать явно), а ещё умеет подписывать запросы AWS SigV4.
Провайдер создаётся и подключается так:
openshell provider create --name my-claude --type claude-code --from-existing
openshell sandbox create --from registry.example.com/your-org/claude-agent:latest \
--provider my-claude --provider my-github -- claude
Агент сам просит доступ
Беда любой строгой песочницы в том, что агент постоянно упирается в отказы. Ему нужен PyPI, потом какой-то CDN, потом API, про который ты не подумал. Если на каждый отказ дёргать человека, никакой автономности не будет.
Для этого в OpenShell есть policy advisor (по умолчанию выключен). Если его включить, OpenShell кладёт в песочницу гайд и SKILL.md, а агенту становится доступен локальный API policy.local. Через него агент смотрит текущую политику и недавние отказы, отправляет предложение и ждёт решения. Предложить можно только новое сетевое правило: удалять правила и трогать настройки файлов и процессов нельзя. Кстати, OpenShell и сам набрасывает черновики правил по заблокированным соединениям, даже когда advisor выключен.
Каждое предложение потом проверяет prover. Он переводит политику, набор кредов и реестр бинарей в SMT-модель для Z3 и ищет ответ на четыре вопроса:
| Категория | Вопрос |
|---|---|
link_local_reach | Есть ли доступ к 169.254.0.0/16 или fe80::/10? |
l7_bypass_credentialed | Может ли бинарь с не-HTTP протоколом достучаться до хоста, где есть кред? |
credential_reach_expansion | Достаёт ли бинарь до хоста с кредом, куда раньше не мог? |
capability_expansion | Появился ли новый HTTP-метод там, где кред уже был? |
Последние два вопроса prover задаёт старой и новой политике и показывает только то, что добавилось. Если нашлось хоть что-то, автоодобрения не будет. Если автоодобрение включено и находок нет, правило применяется сразу, без рестарта. Но по умолчанию автоодобрение выключено, и каждое предложение ждёт человека.
gh читает api.github.com. В песочнице лежат креды GitHub для api.github.com:443 и github.com:22. Агент упёрся в отказ и просит новое правило. Выбери, что он просит.В README prover-а честно написано, чего он не умеет. Он проверяет, может ли бинарь это сделать, но не опасно ли это. PUT и GET в репозиторий для него одинаково «действия с кредом», а нужно ли это действие вообще, решает тот, кто ревьюит.
Как запустить
Требования (по support matrix v0.1.6):
| Что | Минимум |
|---|---|
| ОС | Linux Debian/Ubuntu x86_64 и aarch64, macOS Apple Silicon через Docker Desktop; Windows через WSL 2 — экспериментально |
| Ядро | Landlock ABI 3 (Linux 6.2+), seccomp user notification |
| Рантайм | Docker 28.0+, или Podman 5.x, или Kubernetes 1.29 + Helm 3 |
Установка и первая песочница:
curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | sh
openshell sandbox create --name demo
Установщик ставит CLI и локальный gateway. Образ по умолчанию — минимальная Ubuntu 24.04 (nvcr.io/nvidia/base/ubuntu:24.04), и агента в нём нет. Образ с Claude Code или Codex собираешь сам, пушишь в registry и передаёшь через --from: с 0.1.0 OpenShell больше не собирает Dockerfile на лету.
Дальше пригодятся:
# зайти внутрь
openshell sandbox connect demo
# выполнить команду
openshell sandbox exec -n demo -- ls -la /workspace
# логи, включая решения allow/deny
openshell logs demo --tail
# что сейчас разрешено
openshell policy get demo --full
# TUI
openshell term
Есть SDK для Python (uv add openshell), TypeScript (@nvidia/openshell-sdk) и Go, а для самих агентов — скилл: npx skills add NVIDIA/OpenShell.
NemoClaw — надстройка NVIDIA, которая запускает OpenClaw внутри OpenShell. Песочница, политики и маршрутизация — это всё OpenShell, а NemoClaw только дёргает его CLI и API, ставит политику построже и чистит образ (выкидывает gcc, make, netcat). Весной NemoClaw часто называли «корпоративной альтернативой OpenClaw», но точнее сказать, что это плагин OpenClaw для OpenShell.
Где не спасёт
- В рамках разрешённого агент делает что хочет. Дал
ghправоread-writeна свой репозиторий — injection может заставить агента запушить мусор, и OpenShell это пропустит. Он ограничивает ущерб от injection, но саму injection не ловит. auditпо умолчанию. Про это выше: L7-правила безenforcement: enforceтолько пишут в лог.tls: skipпропускает трафик без расшифровки TLS, и тогда метод и путь никто не видит. Документация прямо запрещает ставить его вместе с L7-протоколом.- От сети он не отрезает совсем. Модель такая: заранее разрешённые адреса плюс ревью всего нового. Нужен полный air gap — это не сюда.
- Проект молодой. 0.1.0, после которого старые установки пришлось сносить, вышел месяц назад. Интерфейсы с пометкой Experimental могут поменяться даже в патч-релизе. Windows пока экспериментальный, WebSocket-транспорт Codex App Server в проде не поддерживается.
- Телеметрия включена по умолчанию. Выключается через
OPENSHELL_TELEMETRY_ENABLED=false.
TL;DR
- OpenShell — открытый (Apache 2.0) рантайм NVIDIA, который запускает агента в песочнице, а все решения принимает за пределами его процесса.
- Файлы режет Landlock, сеть перехватывает seccomp, а у самого контейнера или VM сети нет вообще. Всё идёт через супервизор.
- Политика на YAML: бинарь + хост + порт, затем метод + путь. Всё, что не разрешено, запрещено, хэш бинаря проверяется, метаданные облака закрыты всегда.
- Настоящих кредов агент не видит: в окружении лежит заглушка, а ключ подставляется на выходе и только для привязанного хоста.
- Агент может сам попросить правило, а prover на Z3 ищет в нём новые пути к кредам. Нашёл — решает человек.
- Ловушки:
enforcementпо умолчаниюaudit,inference.localбольше нет, с 0.0.x на 0.1.x — только через переустановку.
Мне эта штука нравится больше, чем очередной «AI-файрвол» на промптах. Тут понятная модель угроз и механизмы ядра, которые можно проверить, а не ещё одна LLM, которая просит другую LLM вести себя хорошо. Из чего вообще состоит агент, я разбирал в статье про харнесы. А если надо, чтобы секреты не уезжали к LLM-провайдеру прямо в промптах, смотри guardrails-llm-filter: это другой слой защиты, и одно другое не заменяет.
Источники
- NVIDIA OpenShell — документация (v0.1.6)
- Архитектура OpenShell
- Политики: обзор, схема, сетевые правила
- Провайдеры и креды
- Инференс и миграция с managed routes
- Support matrix
- Upgrade to OpenShell 0.1.0
- Policy advisor
- openshell-prover README
- GitHub: NVIDIA/OpenShell
- NVIDIA Technical Blog: Run Autonomous, Self-Evolving Agents More Safely with NVIDIA OpenShell (16.03.2026)
- NemoClaw: экосистема и отношение к OpenShell
- ScreenshotOne: NemoClaw by NVIDIA is not really an OpenClaw alternative


