
Открытая песочница для ИИ-агентов — изоляция gVisor/Docker, хранилище учётных данных, неизменяемый журнал аудита. Создана после CVE-2026-25253.
Открытая песочница для ИИ-агентов
Запускайте ИИ-агентов с уверенностью. Каждый агент получает собственную область разрешений, хранилище учётных данных, журнал аудита и аварийный выключатель.
27 января 2026 года CVE-2026-25253 стал первым CVE, когда-либо присвоенным агентной ИИ-системе. Критическая уязвимость перехвата WebSocket в OpenClaw позволяла выполнить удалённый код в один клик на любом открытом экземпляре — включая те, что были привязаны только к localhost.
В ту же неделю кампания ClawHavoc внедрила 341+ вредоносный навык в маркетплейс OpenClaw. Каждый навык, установленный из ClawHub, работал с теми же правами, что и сам OpenClaw — полный доступ к диску, OAuth-токены, API-ключи. Без песочницы. Без журнала аудита. Без аварийного выключателя.
«Установка навыка из ClawHub предоставляет ему доступ к тем же ресурсам, что и самому OpenClaw. По умолчанию между навыками нет изоляции песочницы.» — Анализ безопасности DEV Community, апрель 2026
Цифры:
AgentBox — это структурное решение. Не заплатка, а среда выполнения.
Каждый запускаемый агент получает:
| Защита | Как это работает |
|---|---|
| Разрешения с нулевым доверием | Агенты объявляют ровно то, что им нужно. Всё остальное недоступно. |
| Изоляция на уровне ядра | gVisor перехватывает каждый системный вызов. Инъекция промптов не может пересечь эту границу. |
| Хранилище учётных данных | Шифрование AES-256-GCM. Агенты никогда не видят сырые секреты — только ограниченные токены. |
| Неизменяемый журнал аудита | Хеш-цепочка SHA-256. Каждое действие логируется. Защита от подделки. |
| Аварийный выключатель | Завершение любого агента менее чем за 100 мс. Автоубийство при нарушении лимитов. |
| Лимиты ресурсов | Время, память, количество запросов — применяются во время выполнения, а не в конфигурации. |
До AgentBox После AgentBox
───────────────── ──────────────
Агент → полный диск ❌ Агент → только разрешённые пути ✅
Агент → вся сеть ❌ Агент → только разрешённые хосты ✅
Агент → сырые секреты ❌ Агент → ограниченные токены ✅
Нет журнала аудита ❌ Каждое действие логируется ✅
Нет аварийного выключателя ❌ Завершение за <100 мс ✅
Навыки работают от root ❌ Песочница с изоляцией ядра ✅
# Установка
go install github.com/siyad01/agentbox/cmd/agentbox@latest
# Проверка манифеста перед запуском
agentbox validate manifests/email-sorter.yaml
# Запуск агента в песочнице
agentbox run --manifest manifests/email-sorter.yaml python agent.py
# Просмотр действий агента
agentbox audit --log logs/email-sorter-audit.log
# Проверка, что журнал не был изменён
agentbox verify logs/email-sorter-audit.log
# Управление секретами
agentbox vault add ANTHROPIC_API_KEY
agentbox vault list
Каждый агент объявляет ровно то, что ему нужно. Всё, что не указано, недоступно.
name: "email-sorter"
version: "1.0.0"
description: "Читает входящие, сортирует письма по категориям, записывает в отсортированную папку"
runtime: docker # или: gvisor (уровень ядра), firecracker (MicroVM)
permissions:
filesystem:
read:
- "~/Documents/inbox"
write:
- "~/Documents/sorted"
deny: # ВСЕГДА заблокировано — даже если есть в списке чтения
- "~/.ssh"
- "~/.aws"
- "~/.config"
- "/etc"
network:
allow:
- "api.anthropic.com"
- "gmail.googleapis.com"
deny:
- "*" # заблокировать всё остальное
tools:
allow:
- "read_file"
- "write_file"
- "list_*"
deny:
- "execute_shell" # никакого доступа к оболочке, никогда
- "*_delete" # никаких инструментов удаления
credentials:
- ANTHROPIC_API_KEY # внедряется из хранилища во время выполнения
- GMAIL_TOKEN # агент никогда не видит сырое значение
limits:
max_tokens: 50000 # бюджет токенов LLM
max_duration: "30m" # завершение через 30 минут
max_memory_mb: 256 # потолок ОЗУ
max_requests: 500 # максимум вызовов инструментов
audit:
log_level: full
alert_on:
- filesystem_deny
- network_deny
- token_budget_80pct
log_path: "logs/email-sorter-audit.log"
agentbox run --manifest agent.yaml python agent.py
│
▼
┌─────────────────────────────────────────────────────┐
│ Policy Engine │
│ Разбирает манифест → строит списки разрешений/запретов │
│ Проверяет подписи → отклоняет неподписанные навыки │
│ Внедряет учётные данные из хранилища │
└──────────────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ Isolation Layer │
│ │
│ Docker → контейнер + seccomp + cap-drop │
│ gVisor → ядро в пользовательском пространстве, перехват системных вызовов │
│ Firecracker → выделенное ядро MicroVM для каждого агента │
│ │
│ Файловая система: только объявленные пути │
│ Сеть: только объявленные хосты доступны │
│ Возможности: ВСЕ отброшены, ничего не добавлено │
└──────────────────────┬──────────────────────────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
Audit Logger Credential Resource
(hash-chain) Vault Monitor
каждое действие AES-256-GCM автоубийство
логируется ограниченные при превышении
токены лимита
Все остальные песочницы останавливаются на границе контейнера. Агент, эксплуатирующий уязвимость ядра, может вырваться наружу.
gVisor перехватывает каждый системный вызов до того, как он достигнет ядра хоста:
Агент пытается: write("/home/user/.ssh/id_rsa")
│
▼
Ядро gVisor в пользовательском пространстве
│
Путь в списке запретов? → ДА
│
▼
EPERM возвращается немедленно
Ядро хоста никогда не видит этот системный вызов
Инъекция промптов не может пересечь этот слой
agentbox <command> [options]
Команды:
run Запустить агента в песочнице
validate Проверить файл манифеста
kill Завершить работающего агента
audit Просмотреть журналы аудита агента
verify Проверить целостность журнала аудита
vault Управлять зашифрованными учётными данными
serve Запустить сервер REST API
version Показать версию
Примеры:
agentbox validate manifests/email-sorter.yaml
agentbox run --manifest manifests/email-sorter.yaml python agent.py
agentbox kill agent-abc123
agentbox audit --log logs/email-sorter.log --deny
agentbox audit --log logs/email-sorter.log --last 1h
agentbox verify logs/email-sorter.log
agentbox vault add ANTHROPIC_API_KEY
agentbox vault list
agentbox vault delete OLD_KEY
agentbox serve :8081
Запустите с помощью agentbox serve (по умолчанию: :8081).
| Метод | Конечная точка | Описание |
|---|---|---|
| GET | /health | Проверка работоспособности |
| GET | /dashboard | Веб-панель управления |
| GET | /api/agents | Список всех агентов |
| POST | /api/agents | Запуск нового агента |
| DELETE | /api/agents/:id | Завершить агента |
| GET | /api/audit | Запрос журнала аудита |
# Список работающих агентов
curl http://localhost:8081/api/agents
# Запуск агента
curl -X POST http://localhost:8081/api/agents \
-H "Content-Type: application/json" \
-d '{"manifest":"manifests/email-sorter.yaml","command":["python","agent.py"]}'
# Завершение агента
curl -X DELETE http://localhost:8081/api/agents/abc123
# Запрос журнала аудита
curl "http://localhost:8081/api/audit?deny=true&agent=email-sorter"
Каждое действие агента логируется в файл JSON Lines с добавлением только в конец и хеш-цепочкой:
{"id":1,"hash":"a3f2...","prev_hash":"genesis","timestamp":"2026-05-05T09:00:00Z","agent_id":"abc123","agent_name":"email-sorter","event_type":"agent_start","allowed":true,"resource":"manifests/email-sorter.yaml"}
{"id":2,"hash":"b7c1...","prev_hash":"a3f2...","timestamp":"2026-05-05T09:00:01Z","agent_id":"abc123","agent_name":"email-sorter","event_type":"filesystem_allow","allowed":true,"resource":"read:/home/user/Documents/inbox/mail.txt","rule":"filesystem.read: ~/Documents/inbox"}
{"id":3,"hash":"d9e4...","prev_hash":"b7c1...","timestamp":"2026-05-05T09:00:01Z","agent_id":"abc123","agent_name":"email-sorter","event_type":"filesystem_deny","allowed":false,"resource":"read:/home/user/.ssh/id_rsa","rule":"filesystem.deny: ~/.ssh","reason":"path is explicitly denied"}
Обнаружение подделки:
agentbox verify logs/email-sorter-audit.log
✅ Журнал аудита не повреждён
Записей: 47 (ID 1–47)
Хеш-цепочка: неразрывна
Измените любой символ в любой записи — и проверка немедленно завершится ошибкой: цепочка разорвана.
# Сохранить секрет (никогда не логируется, никогда в открытом виде в env)
agentbox vault add ANTHROPIC_API_KEY
# Список имён сохранённых учётных данных (значения никогда не показываются)
agentbox vault list
# Проверить, что учётные данные можно расшифровать
agentbox vault test ANTHROPIC_API_KEY
# Ротация учётных данных
agentbox vault add ANTHROPIC_API_KEY # add обновляет существующие
Учётные данные шифруются с помощью AES-256-GCM. Главный ключ выводится из вашего пароля хранилища — никогда не хранится на диске. При запуске агента AgentBox внедряет учётные данные как ограниченные переменные окружения. Агент вызывает os.getenv("ANTHROPIC_API_KEY") обычным образом — он никогда не касается хранилища.
AgentBox завершает агентов, превышающих объявленные лимиты:
# Этот агент настроен с max_duration: 5s
agentbox run --manifest manifests/timeout-test.yaml python long_running_agent.py
Agent started
tick 1
tick 2
tick 3
tick 4
tick 5
🛑 Killing agent timeout-test: duration limit exceeded: 5s
⚠️ Agent timeout-test exited code 137 in 5.2s
Код выхода 137 = SIGKILL. Чистое завершение, финальная запись аудита записывается.
# Клонирование
git clone https://github.com/siyad01/agentbox
cd agentbox
# Сборка
go build -o agentbox ./cmd/agentbox/
# Запуск тестов (27 тестов, все проходят)
go test ./...
# Глобальная установка
go install ./cmd/agentbox/
Требования:
agentbox/
├── cmd/agentbox/main.go ← точка входа CLI
├── internal/
│ ├── policy/
│ │ ├── manifest.go ← схема YAML-манифеста
│ │ ├── parser.go ← проверка + значения по умолчанию
│ │ └── engine.go ← движок решений с приоритетом запретов (20 тестов)
│ ├── audit/
│ │ ├── logger.go ← журнал с добавлением в конец и SHA-256 хеш-цепочкой
│ │ ├── verifier.go ← обнаружение подделки
│ │ └── reader.go ← запрос + фильтрация
│ ├── vault/
│ │ ├── store.go ← хранилище учётных данных с шифрованием AES-256-GCM
│ │ └── injector.go ← внедрение во время выполнения (7 тестов)
│ ├── sandbox/
│ │ ├── sandbox.go ← интерфейс Sandbox
│ │ ├── docker.go ← бэкенд Docker
│ │ ├── gvisor.go ← бэкенд gVisor (уровень ядра)
│ │ ├── manager.go ← управление жизненным циклом агента
│ │ └── util.go ← обнаружение WSL2, вспомогательные функции путей
│ ├── monitor/
│ │ └── enforcer.go ← лимиты ресурсов + автоубийство
│ └── api/
│ └── server.go ← REST API на :8081
└── manifests/
├── email-sorter.yaml ← производственный пример
└── timeout-test.yaml ← пример применения лимитов
Запрет по умолчанию. Агенты запускаются с нулевыми разрешениями. Каждая возможность должна быть явно объявлена.
Список запретов всегда побеждает. Даже если путь есть и в списке чтения, и в списке запретов, список запретов имеет приоритет. Без исключений.
Принудительное применение на уровне ядра с gVisor. Фильтры seccomp и отбрасывание возможностей работают на границе системных вызовов. Вывод модели — который контролируется атакующим — выполняется в пользовательском пространстве и не может изменить политику на уровне ядра.
Изоляция учётных данных. Главный ключ хранилища никогда не хранится на диске. Учётные данные внедряются как кратковременные ограниченные токены при запуске песочницы и отбрасываются при выходе. Компрометация процесса агента не приводит к компрометации хранилища учётных данных.
Неизменяемый журнал аудита. Хеш-цепочка SHA-256 означает, что ретроактивное изменение журнала обнаружимо. Любое изменение любой записи разрывает цепочку с этого момента.
См. SECURITY.md для сообщения об уязвимостях.
| Возможность | AgentBox | OpenClaw sandbox | Docker only | AccuKnox |
|---|---|---|---|---|
| Открытый исходный код (Apache 2.0) | ✅ | ✅ | ✅ | ❌ |
| Самостоятельное размещение | ✅ | ✅ | ✅ | Только K8s |
| gVisor / изоляция ядра | ✅ | ❌ | ❌ | ✅ |
| Хранилище учётных данных | ✅ | ❌ | ❌ | ✅ |
| Неизменяемый журнал аудита | ✅ | ❌ | ❌ | ✅ |
| Автоубийство при нарушении лимитов | ✅ | ❌ | ❌ | ✅ |
| Независимость от фреймворка | ✅ | ❌ (только OpenClaw) | ✅ | ✅ |
| Развёртывание одним бинарником | ✅ | ❌ | ✅ | ❌ |
См. CONTRIBUTING.md.
Apache 2.0 — свободно для использования, изменения и распространения. См. LICENSE.
Создано на Go · Ноль внешних зависимостей для основных функций безопасности · Самостоятельное размещение одной командой
Если CVE-2026-25253 вас беспокоил, это решение. Поставьте ⭐