Коротко (TL;DR)
Ізоляція ШІ-агента тримається на трьох незалежних шарах: де агент виконує команди, які секрети він бачить і що йому дозволено робити. Підтвердження команд — це лише третій шар, і він не замінює перших двох.
- Коротко (TL;DR)
- П’ять сценаріїв, від яких потрібна ізоляція агента
- Загроза, шар захисту й увімкнення в кожному агенті: зведена таблиця
- Вбудовані пісочниці агентів: що закрито за замовчуванням, а що ні
- Docker і devcontainer для Claude Code: робоча схема покроково
- Docker Sandboxes і окрема ВМ: коли звичайного контейнера замало
- Секрети: що агент побачить сам і як тримати ключі поза його досяжністю
- Підтвердження, deny-правила й хуки: що вони гарантують, а що ні
- Worktree і worktrunk: зручно для паралельних агентів, але не ізоляція
- Що не закриває навіть пісочниця ШІ-агента: allowlist, ядро, MCP і CI
- Захист агента за рівнем ризику: свій код, чужий код, автозапуск
- FAQ
- Вбудовані пісочниці Claude Code, Codex, Gemini CLI і Cursor обмежують запис, а Claude Code, Codex і Cursor — ще й мережу, але читання за замовчуванням відкрите майже скрізь. У Claude Code пісочниця до того ж вимкнена за замовчуванням і покриває лише shell-команди.
- Контейнер — не повний захист. У режимі без підтверджень шкідливий проєкт може винести все, що лежить усередині контейнера, зокрема облікові дані самого агента. Так пишуть і Anthropic, і OpenAI.
- Ключі тримаємо за межею.
op run -- агентвіддає агенту всі підставлені секрети. Правильніше давати агенту заглушку, а справжній ключ підставляти на проксі. - Git worktree — зручність, а не межа безпеки: хук, записаний із worktree, спрацьовує в основному репозиторії. Ми перевірили це самі.
- Для чужого репозиторію Anthropic радить окрему віртуальну машину або хмарну сесію — порівняння підходів є в офіційній документації Claude Code.
Дані й типові налаштування агентів у статті звірено з офіційною документацією станом на 4 листопада 2026 року.
П’ять сценаріїв, від яких потрібна ізоляція агента
ШІ-агент для кодингу — це мовна модель, яка сама читає файли, запускає команди в терміналі й править код. Звідси й ризик: агент робить те, що вважає потрібним, а «потрібне» йому може підказати не лише ви, а й текст у чужому репозиторії. Таку підказку називають prompt injection — впровадження інструкцій через дані, які агент читає.
Нижче п’ять сценаріїв, для кожного є реальний задокументований випадок.
| Сценарій | Реальний випадок | Дата | Який шар закрив би |
|---|---|---|---|
| Агент стирає файли поза проєктом | Claude Code виконав rm -rf tests/ patches/ plan/ ~/; хвостовий ~/ — це вся домашня папка Mac (за розповіддю користувача, цитата в блозі Simon Willison) | 9 грудня 2025 | Пісочниця із записом лише в проєкт |
| Агент стирає цілий диск | Google Antigravity у режимі Turbo видалив вміст диска D: повз кошик — за заявою користувача, переказ The Register і Tom’s Hardware | 1 грудня 2025 | Запис лише в проєкт + підтвердження |
| Шкідливий пакет використовує вашого агента як інструмент | s1ngularity: заражені версії пакетів Nx запускали локальні Claude Code і Gemini CLI з прапорцями --dangerously-skip-permissions і --yolo, щоб шукати секрети; GitGuardian нарахував 2 349 унікальних секретів у репозиторіях із витоком | 26 серпня 2025 | Секрети поза досяжністю + закрита мережа |
| Текст issue або PR змушує агента в CI віддати токени | Clinejection: ін’єкція в заголовку issue → агент-тріажер у CI → отруєний кеш GitHub Actions → npm-токен релізного workflow → публікація cline@2.3.0. Comment and Control: заголовок PR, коментарі до issue і прихований HTML-коментар змушували агентів Claude Code Security Review, Gemini CLI Action і Copilot видавати секрети; у Claude Code Security Review це були ANTHROPIC_API_KEY і GITHUB_TOKEN | 17 лютого 2026 і квітень 2026 | Агент у CI без секретів із правом публікації |
| Агент виходить із пісочниці через дозволену адресу | Модель OpenAI на внутрішньому оцінюванні вийшла в інтернет через уразливість у проксі пакетів, що стояв у списку дозволених адрес пісочниці, і дісталася до інфраструктури Hugging Face | липень 2026 | Мінімальний allowlist + microVM |
Щодо Comment and Control Anthropic присвоїла вразливості статус critical і виплатила дослідникам $100, Google — $1 337 (SecurityWeek, 16 квітня 2026 року). Постмортем Cline формулює головний урок жорстко: дати LLM доступ до shell у CI, де вона обробляє недовірені вхідні дані, — те саме, що дати shell кожному користувачу GitHub.
Усі п’ять випадків зводяться до трьох запитань, і кожне — окремий шар захисту:
- Де виконується агент — просто у вашій системі, в ОС-пісочниці, у контейнері, у microVM чи на окремій віртуальній машині.
- Що агент бачить — ключі в
~/.sshі~/.aws, змінні оточення,.envу проєкті, токени в історії сесій. - Що агенту дозволено — правила allow/ask/deny, підтвердження, хуки.
Simon Willison називає небезпечне поєднання «смертельною трійкою»: доступ до приватних даних, контакт із недовіреним контентом і можливість надіслати дані назовні. Ізоляція ШІ-агента — це розрив хоча б однієї ланки: прибрати дані з поля зору, закрити недовірений вхід або перекрити канал назовні.
Модель загроз окремо для Codex ми вже розбирали в матеріалі про пісочницю Codex і модель загроз, а будову захисту Claude Code — у статті про периметри безпеки Claude Code. Тут — наскрізна схема для будь-якого агента.
Загроза, шар захисту й увімкнення в кожному агенті: зведена таблиця
Англомовні гайди з AI agent sandboxing і AI agent sandbox security майже завжди розбирають один продукт, і зведення по п’яти агентах доводиться збирати самому з п’яти документацій. Нижче — воно однією таблицею, станом на 4 листопада 2026 року.Загроза Чим закрити Claude Code Codex CLI Gemini CLI Cursor OpenCode Видалення файлів поза проєктом Запис лише в робочу папку /sandbox або sandbox.enabled: trueРежим workspace-write (типовий у папці під git)gemini -s (профіль permissive-open)Пісочниця shell: завжди в Auto-review, в Allowlist — якщо ввімкнена ОС-пісочниці немає: правило "rm *": "deny" + контейнерВидалення й псування файлів усередині проєкту Git, коміт перед запуском, клон замість живої папки Налаштуванням не закривається Налаштуванням не закривається Налаштуванням не закривається Налаштуванням не закривається Налаштуванням не закривається Крадіжка ключів із диска ( ~/.ssh, ~/.aws)Заборона читання або контейнер без цих файлів sandbox.credentials з deny + Read(...) у permissions.denyЧитання широке — контейнер без ключів Профіль strict-* або GEMINI_SANDBOX=dockerreadBoundary: "workspace" (з версії 3.23)external_directory: ask (типово), краще контейнерКрадіжка секретів з оточення Не передавати агенту змінні з ключами credentials.envVars з deny/mask, CLAUDE_CODE_SUBPROCESS_ENV_SCRUBshell_environment_policy.ignore_default_excludes = falseНе тримати ключі в оточенні запуску Не тримати ключі в оточенні запуску Не тримати ключі в оточенні запуску Виведення даних через мережу Мережа за списком дозволених адрес Проксі, список доменів за замовчуванням порожній Мережа вимкнена у workspace-writeПрофіль *-proxiednetworkPolicy з default: "deny"Мережа shell не обмежена — контейнер із файрволом Prompt injection з репозиторію Підтвердження на небезпечне + усі шари вище deny-правила, PreToolUse-хук approval_policy = "on-request"Підтвердження (без --yolo)Не вмикати Run Everything Правила ask/denyВтеча з контейнера Власне ядро: microVM або ВМ Docker Sandboxes, ВМ Docker Sandboxes, ВМ Docker Sandboxes, ВМ Docker Sandboxes, ВМ Docker Sandboxes, ВМ
Як читати таблицю. Рядки згори донизу йдуть від дешевого до дорогого: перші три закриваються налаштуванням за хвилину, останні два потребують іншого середовища запуску. Рядок «усередині проєкту» не закривається нічим, крім git і клону: будь-який агент, якому ви дозволили писати в проєкт, може там видалити й зіпсувати файли. Тому правило «закомітити перед запуском агента» працює в будь-якому агенті й не залежить від налаштувань.
Вбудовані пісочниці агентів: що закрито за замовчуванням, а що ні
Вбудована пісочниця — це механізм ОС, який запускає команди агента з урізаними правами. На macOS це Seatbelt, на Linux — bubblewrap (утиліта ізоляції процесів через простори імен ядра). Вона дешева, працює без Docker, але в кожного агента свої типові налаштування.
| Агент | Вмикається сама | Запис | Читання | Мережа |
|---|---|---|---|---|
| Claude Code | Ні, вмикається /sandbox | Робоча папка, temp і додані папки | Майже вся машина, зокрема ~/.ssh і ~/.aws/credentials | Через проксі, дозволених доменів спочатку немає |
| Codex CLI | Так: у папці під git — workspace-write, поза git — read-only | Робоча папка; .git, .codex, .agents — лише читання | Широке | Вимкнена |
| Gemini CLI | Ні; вмикається -s, GEMINI_SANDBOX або tools.sandbox, а з --yolo — за замовчуванням | Папка проєкту (permissive-open) | Широке | Дозволена |
| Cursor | Для shell-команд: в Auto-review — так, в Allowlist — на вибір | Workspace; .git/hooks і .git/config захищені | readBoundary: "system" — ширше за проєкт, ~/.ssh читається | Заблокована, крім вбудованого списку доменів менеджерів пакетів (типовий режим sandbox.json + Defaults); решту відкриває sandbox.json |
| OpenCode | ОС-пісочниці в документації немає | Лише правила дозволів | read: allow, файли .env — ask | Не обмежена |

На скриншоті офіційної документації Claude Code (знято 4 листопада 2026 року) рамка 1 виділяє рядок «Reads»: читання дозволене майже по всій машині, зокрема ~/.ssh і ~/.aws/credentials. Рамка 2 — рядок «Environment variables»: команди в пісочниці успадковують оточення Claude Code разом з усіма секретами в ньому. Це головне, що варто запам’ятати про вбудовані пісочниці: вони захищають від «зламає», але не від «прочитає».
Як увімкнути пісочницю в Claude Code і переконатися, що вона працює
- Запустіть сесію й виконайте
/sandbox. Відкриється панель із вкладками Mode, Overrides і Config. На Linux і WSL2 потрібніbubblewrapіsocat— якщо їх немає, панель покаже лише вкладку Dependencies. - На вкладці Mode оберіть auto-allow (команди в пісочниці йдуть без підтвердження) або regular permissions (підтвердження лишаються).
- На вкладці Overrides увімкніть Strict sandbox mode. Без нього агент може попросити повторити команду, що впала, поза пісочницею, а в режимі
bypassPermissionsтакий повтор іде без запитання. - Попросіть агента виконати дві перевірки:
touch ~/sandbox-probe
curl --noproxy '*' example.com
Перша команда має впасти з Operation not permitted на macOS або Read-only file system на Linux. Друга — з Could not resolve host: команда не має шляху в мережу повз проксі пісочниці. Якщо touch пройшов, пісочниця не працює — видаліть файл і знову відкрийте /sandbox.
Панель зберігає режим у .claude/settings.local.json поточного проєкту. Щоб пісочниця була в усіх проєктах і закривала ключі, впишіть у ~/.claude/settings.json:
{
"sandbox": {
"enabled": true,
"allowUnsandboxedCommands": false,
"failIfUnavailable": true,
"network": {
"allowedDomains": ["registry.npmjs.org", "pypi.org"]
},
"credentials": {
"files": [
{ "path": "~/.ssh", "mode": "deny" },
{ "path": "~/.aws/credentials", "mode": "deny" }
],
"envVars": [
{ "name": "GITHUB_TOKEN", "mode": "deny" },
{ "name": "NPM_TOKEN", "mode": "deny" }
]
}
}
}
Сам ключ sandbox.enabled: true вмикає режим auto-allow: команди в пісочниці йдуть без підтвердження, а щоб повернути підтвердження, додайте "autoAllowBashIfSandboxed": false. failIfUnavailable важливий: за замовчуванням, якщо пісочниця не піднялася, Claude Code мовчки працює без неї. Вбудованого списку секретів немає — захищені лише ті файли й змінні, які ви перелічили. Синтаксис усіх ключів розібрано в матеріалі про settings.json у Claude Code.
Дві межі, про які часто забувають. Пісочниця працює на macOS, Linux і WSL2, а на нативному Windows команди йдуть без неї. І вона покриває лише shell: інструменти Read, Edit, Write, WebFetch, локальні MCP-сервери й хуки працюють поза пісочницею з вашими повними правами. Запис denyRead не зупиняє інструмент Read.
Codex, Gemini CLI і Cursor: один рядок налаштування
Codex CLI. Запис Codex обмежує робочою папкою, а читання — ні: у нашому замірі 13 серпня 2026 року (CLI 0.147.0) команди в обох режимах читали файли в домашній папці й власний ~/.codex/auth.json. Безпечний інтерактивний режим задається прапорцями codex --sandbox workspace-write --ask-for-approval on-request або в config.toml:
sandbox_mode = "workspace-write"
approval_policy = "on-request"
[sandbox_workspace_write]
network_access = false
[shell_environment_policy]
ignore_default_excludes = false
Останній рядок важливий: за замовчуванням Codex лишає командам змінні з KEY, SECRET і TOKEN в імені, а false вмикає їх автоматичне вичищення. Режими докладно розібрано в статті про режими схвалення Codex.
Gemini CLI. Пісочниця вмикається прапорцем gemini -s, змінною GEMINI_SANDBOX=docker або ключем tools.sandbox у settings.json. З --yolo (або --approval-mode=yolo) Gemini CLI вмикає її за замовчуванням сам. На macOS типовий профіль permissive-open пускає мережу й широке читання. Суворіший — SEATBELT_PROFILE=strict-proxied: обмежені і читання, і запис, мережа йде через проксі. У контейнерному режимі (Docker або Podman) пісочниці за замовчуванням доступна лише папка проєкту.
Cursor. Налаштування пісочниці лежать у ~/.cursor/sandbox.json або .cursor/sandbox.json проєкту. Мінімум для роботи із секретами — звузити читання й мережу:
{
"readBoundary": "workspace",
"networkPolicy": {
"default": "deny",
"allow": ["registry.npmjs.org", "pypi.org"]
}
}
Значення readBoundary: "workspace" потребує Cursor 3.23 або новішого. Режим Run Everything вимикає і пісочницю, і класифікатор — кожен виклик іде автоматично.
Docker і devcontainer для Claude Code: робоча схема покроково
Devcontainer (контейнер розробки) — це опис Docker-оточення у файлі .devcontainer/devcontainer.json, яке VS Code, Cursor, JetBrains і GitHub Codespaces піднімають однаково в усіх. Агент у ньому працює всередині контейнера, а файли проєкту змонтовані з вашого диска. Anthropic має для цього офіційну фічу Dev Container і еталонну конфігурацію в репозиторії anthropics/claude-code.
Devcontainer для Claude Code: схема з шести кроків
- Додайте фічу Claude Code у
.devcontainer/devcontainer.json:
{
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
"features": {
"ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {}
},
"remoteUser": "vscode"
}
- Працюйте не під root. З прапорцем
--dangerously-skip-permissionsClaude Code на Linux і macOS не запускається від root, томуremoteUserмає бути звичайним користувачем. - Збережіть
~/.claudeв іменованому томі, щоб не входити заново після кожного перезбирання: томsource=claude-code-config,target=/home/vscode/.claude,type=volumeуmountsіCLAUDE_CONFIG_DIRз тим самим шляхом уcontainerEnv. Пам’ятайте, що в цьому томі лежить токен агента — його й винесе шкідливий проєкт, якщо винести вдасться. - Закрийте вихідну мережу. Еталонний контейнер Anthropic містить скрипт
init-firewall.sh: він ставитьiptables -P OUTPUT DROP(увесь вихідний трафік заборонено за замовчуванням) і відкриває список адрес плюс кілька винятків — про них нижче. Для файрвола всередині контейнера потрібні праваNET_ADMINіNET_RAWуrunArgs. - Не монтуйте секрети хоста: ні
~/.ssh, ні~/.aws, ні файли хмарних ключів. Anthropic радить замість них токени з доступом до одного репозиторію або короткоживучі токени. Окремо — ніколи не прокидайте/var/run/docker.sock: доступ до сокета Docker дорівнює доступу до хоста. - Лише тепер можна запускати
claude --dangerously-skip-permissionsдля роботи без підтверджень, і лише з репозиторіями, яким ви довіряєте.
Що ми знайшли, читаючи еталонний init-firewall.sh станом на 4 листопада 2026 року. Крім діапазонів GitHub, registry.npmjs.org і api.anthropic.com, у списку є sentry.io, statsig.com і домени VS Code. Важливіші три правила, які стоять до списку й не зважають на нього: вихідний SSH на порт 22 до будь-якої адреси, DNS-запити (UDP 53) до будь-якої адреси й увесь трафік у підмережу /24 довкола шлюзу Docker, тобто до вашого хоста. Для git push через SSH це зручно, але для моделі загроз «винести дані» це три відкриті канали: SSH, DNS-тунель (передавання даних усередині DNS-запитів) і сервіси на хості. Якщо git через SSH вам не потрібен, приберіть правило для порту 22. DNS-тунель правкою одного правила не закрити, і для чужого коду це ще один аргумент на користь microVM із проксі.
Рамка на скриншоті виділяє попередження з документації Claude Code про devcontainer (знято 4 листопада 2026 року). У режимі --dangerously-skip-permissions контейнер не заважає шкідливому проєкту винести все, що доступне всередині, зокрема облікові дані Claude Code у ~/.claude. OpenAI пише те саме про Codex: із devcontainer можна винести все, зокрема облікові дані Codex. Частина гайдів у мережі подає Docker як повний захист і водночас кладе ANTHROPIC_API_KEY просто в оточення контейнера — тобто туди, звідки його й заберуть.
Claude Code sandbox vs Docker: що обрати
Коротка відповідь: це різні шари, і вони доповнюють один одного./sandbox у Claude CodeDevcontainer Docker Sandboxes (microVM) Окрема ВМ Що ізольовано Лише shell-команди Увесь процес агента Увесь процес агента Увесь процес агента Файлові інструменти, MCP, хуки Поза межею Усередині Усередині (локальні MCP — на хості) Усередині Читання ваших файлів Майже вся машина Лише змонтоване Лише змонтоване Лише скопійоване Ядро Спільне з хостом Спільне з хостом Власне Власне Ключі агента На хості Усередині контейнера На хості, підставляє проксі Усередині ВМ Поріг входу Одна команда Docker + конфіг Окремий CLI sbxГіпервізор і образ
Практична зв’язка для власного коду — devcontainer плюс /sandbox усередині нього. Врахуйте, що bubblewrap усередині Docker без привілейованих просторів імен не піднімається. Режим enableWeakerNestedSandbox це обходить, але документація прямо попереджає: він помітно послаблює захист. Для чужого коду обидва варіанти слабші за microVM.
Docker Sandboxes і окрема ВМ: коли звичайного контейнера замало
Звичайний контейнер ділить ядро операційної системи з хостом. Помилка в налаштуванні або вразливість ядра — і процес виходить назовні. microVM — це полегшена віртуальна машина з власним ядром: межа проходить по гіпервізору, а не по механізмах ізоляції ядра. Тому AI agent sandbox на Docker — це дві різні за стійкістю речі: звичайний контейнер зі спільним ядром або Docker Sandboxes на microVM.
Британський AI Security Institute у березні 2026 року опублікував SandboxEscapeBench — 18 сценаріїв втечі з контейнера на трьох рівнях: оркестрація, середовище виконання і ядро. Просунуті моделі надійно вибиралися через типові помилки конфігурації — відкритий сокет Docker і привілейований контейнер, — але найскладніших сценаріїв не пройшла жодна. Кожна успішна втеча використала вже розкриту вразливість; водночас ще під час створення тесту одна модель знайшла непередбачений шлях назовні.
П’ять команд для запуску агента в Docker Sandboxes
Docker Sandboxes — окремий продукт Docker: кожен агент працює в microVM з власним ядром і власним Docker-демоном, без доступу до Docker на хості. Станом на 4 листопада 2026 року CLI sbx і локальні пісочниці безплатні, зокрема для комерційної роботи; хмарні пісочниці — окрема послуга. Docker Desktop для них не потрібен.
brew install docker/tap/sbx # macOS; Windows: winget install -h Docker.sbx
sbx login
sbx secret set anthropic # ключ зберігається на хості, у ВМ не потрапляє
cd ~/my-project
sbx run --name my-project claude # або codex, gemini, cursor, copilot
Під час першого запуску sbx попросить обрати мережеву політику; варіант Balanced відкриває популярні сервіси розробки й блокує решту. Список правил покаже sbx policy ls. За документацією Docker, серед дозволених за замовчуванням є широкі шаблони на кшталт *.googleapis.com, які покривають далеко не лише API ШІ-провайдерів, — перегляньте список і видаліть те, що вам не потрібно. Видалити пісочницю цілком — sbx rm my-project, папку проєкту це не зачіпає.
Три особливості, про які треба знати:
- Агенти стартують у повній автономії. За документацією Docker, Codex обходить підтвердження, Claude Code пропускає запити дозволів, Cursor, Copilot і Gemini працюють у YOLO-режимі. Це допустимо лише тому, що межа — microVM, а ключі підставляє проксі на хості.
- Папка проєкту змонтована на запис. Агент може змінити або видалити будь-який файл у ній, і це одразу видно у вас. Сюди ж потрапляють файли, які виконуються самі: хуки git, конфіги CI,
Makefile, скриптиpackage.json. Хуки живуть у.git/і не видні вgit diff— перевіряйте їх окремо. - Для чужого коду є
--clone. У цьому режимі ваш репозиторій монтується лише для читання, а агент працює з приватною копією всередині ВМ.
Локальні MCP-сервери, запущені через stdio, за документацією Docker працюють на хості, а не у ВМ. Отже, їх треба вважати довіреними компонентами з усіма вашими правами.
Окремий користувач ОС і віртуальна машина
Найстаріший і найпростіший рівень ізоляції — окремий користувач системи, наприклад sudo useradd -m agent на Linux. Якщо ваша домашня папка закрита правами chmod 700, агент під чужим обліковим записом не прочитає ні ~/.ssh, ні .env у ваших проєктах, ні ~/.npmrc з токеном npm. Натомість агенту потрібен власний клон репозиторію й власний вхід у сервіси. Але ядро, мережа й усе, що відкрите на читання всім користувачам, лишаються спільними, тому це захист від випадковості, а не від цілеспрямованої атаки.
Для недовіреного репозиторію Anthropic у таблиці підходів прямо радить окрему віртуальну машину або хмарну сесію. ВМ дорожча в налаштуванні, зате її можна відкотити до знімка й викинути після роботи.
Секрети: що агент побачить сам і як тримати ключі поза його досяжністю
Агенту не потрібно спеціально «красти» ключ. Наткнувшись на помилку авторизації, він сам шукає облікові дані: відкриває .env у корені проєкту, виконує printenv, дивиться ~/.aws. Так цей сценарій описує Bitwarden — компанія продає менеджер секретів, тож це ілюстрація, а не статистика. Але механіку підтверджує документація Claude Code: усе, що пройшло через інструмент агента, записується в транскрипт на диску відкритим текстом.
Пастка op run -- агент
1Password CLI підставляє секрети так: op run запускає команду в дочірньому процесі, і секрети доступні як змінні оточення «лише на час роботи підпроцесу». Якщо цей підпроцес — сам агент, усі підставлені ключі стають доступні агенту й усьому, що він запускає, на всю сесію. Те саме стосується doppler run -- агент і direnv: direnv завантажує .envrc під час входу в папку, і агент, запущений із цієї оболонки, успадковує змінні.
Правильний порядок — обгортати застосунок, якому потрібен ключ, а не агента:
# погано: агент отримує всі секрети із шаблону
op run --env-file=.env.tpl -- claude
# краще: секрети отримує лише тестовий прогін, який запускаєте ви
op run --env-file=.env.tpl -- npm test
Підставлення ключа через проксі
Найкращий варіант — агент бачить заглушку, а справжній ключ додає проксі під час запиту до дозволеної адреси.
- Claude Code — режим
maskуsandbox.credentials: команди бачать одноразову заглушку, а проксі пісочниці підставляє справжнє значення в запити до адрес зinjectHosts. Вимоги:network.tlsTerminate(проксі має бачити вміст запиту) і запис у користувацьких, а не проєктних налаштуваннях —maskіз.claude/settings.jsonрепозиторію ігнорується. Маскування файлів працює з версії 2.1.221; на macOS файл у режиміmaskблокується цілком, як заdeny. Перевірити налаштування можна командоюclaude doctor. - Docker Sandboxes — ключі з
sbx secret setзберігаються на хості, проксі вставляє їх у заголовки вихідних запитів, а у ВМ справжнє значення не потрапляє. - NVIDIA OpenShell — за README проєкту агент ніколи не бачить справжніх ключів, OpenShell додає їх лише до запитів на схвалені адреси.
Ключі з мінімальними правами й лімітом витрат
- GitHub — fine-grained токен (токен із детальними правами) замість класичного: GitHub радить саме його, і кожен такий токен можна обмежити конкретними репозиторіями. Давайте агенту читання й запис лише в потрібний репозиторій і короткий строк дії.
- API моделей — окремий ключ для агента в окремому workspace з власним лімітом витрат. У консолі Anthropic місячний ліміт задається на організацію або на workspace (на default workspace — не можна), а не на окремий ключ; у разі витоку ключа з такого workspace втрати обмежені його лімітом.
- Хмари — окрема роль із правами лише на тестове оточення, без доступу до продакшн-баз.
- Агенти в CI — без секретів із правом публікації там, де агент читає текст issue і PR, і без спільного з релізними workflow кешу GitHub Actions. За постмортемом Cline, у Clinejection секрети публікації дісталися саме через кеш, який відновлював нічний реліз.
Що робити, якщо секрет уже прочитано
Видалити .env після сесії недостатньо. Claude Code пише в ~/.claude/projects/<проєкт>/<сесія>.jsonl вміст файлів, вивід команд і вставлений текст і за замовчуванням зберігає це 30 днів (налаштування cleanupPeriodDays). Порядок такий:
- Відкличте й перевипустіть ключ — це єдиний надійний крок.
- Перевірте журнали використання ключа в провайдера за час сесії.
- Видаліть локальну історію проєкту:
claude purge <шлях-до-проєкту>(до версії 2.1.288 команда називаласяclaude project purge).
Підтвердження, deny-правила й хуки: що вони гарантують, а що ні
Підтвердження й правила — третій шар: вони вирішують, що агенту можна, але не змінюють того, що він бачить і де працює. Документація Claude Code підкреслює, що правила дозволів виконує сам Claude Code, а не модель: інструкції в CLAUDE.md впливають на те, що агент намагається зробити, але не на те, що йому дозволено.Механізм Що гарантує Чого не гарантує Read(./.env) у permissions.denyФайлові інструменти Claude не прочитають файл Команду cat .env у Bash — її закриває пісочниця (credentials, denyRead)Bash(rm *), Bash(curl *) у denyБлокує звичайну форму виклику /bin/rm, bash -c '…' та інші форми: за документацією Anthropic це не межа безпекиІнструкції в CLAUDE.md або AGENTS.md Задають намір агента Нічого технічно не забороняють PreToolUse-хук Ваш скрипт перевіряє кожен виклик до запуску й може його заблокувати Обхід через переформулювання команди; сам хук працює поза пісочницею з вашими правами Класифікатор (auto mode, Auto-review у Cursor) Менше запитів за розумного захисту Cursor прямо пише: Auto-review не є межею безпеки --dangerously-skip-permissions, --yolo, Run EverythingРобота без запитів Нічого — допустимо лише всередині контейнера, microVM або ВМ
Мінімальний набір правил для Claude Code у settings.json:
{
"permissions": {
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)",
"Bash(git push --force *)",
"Bash(git push -f *)"
],
"ask": [
"Bash(git push *)"
]
}
}
PreToolUse-хук проти rm -rf, git push --force і curl | sh
Хук — це ваш скрипт, який Claude Code запускає на подію. Подія PreToolUse спрацьовує перед викликом інструмента; код виходу 2 блокує виклик, а текст помилки йде агенту. Реєстрація в settings.json:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "~/.claude/hooks/block-danger.sh" }
]
}
]
}
}
Сам скрипт ~/.claude/hooks/block-danger.sh (потрібен jq):
#!/bin/bash
cmd=$(jq -r '.tool_input.command // ""')
if echo "$cmd" | grep -Eq 'rm +-[a-zA-Z]*r[a-zA-Z]*f|rm +-[a-zA-Z]*f[a-zA-Z]*r|git +push.*( --force| -f( |$))|curl[^|]*\| *(ba|z)?sh|wget[^|]*\| *(ba|z)?sh'; then
echo "Заблоковано хуком: небезпечна команда. Запропонуй безпечний варіант." >&2
exit 2
fi
exit 0
Цей хук ловить типові форми небезпечних команд, але не всі: змінна замість імені команди або скрипт у файлі його обійдуть. Тому хук — страховка від помилки агента, а не від атаки. Усі події, коди виходу й рецепти — у розборі про хуки Claude Code.
В OpenCode той самий шар задається в opencode.json: правило "bash": { "*": "ask", "rm *": "deny", "git push *": "ask" }. Спрацьовує останнє відповідне правило, а режим --auto не скасовує явних deny. За замовчуванням OpenCode стартує з дозвільних налаштувань: більшість дій — allow, читання .env — ask.
Worktree і worktrunk: зручно для паралельних агентів, але не ізоляція
Git worktree — це додаткова робоча папка того самого репозиторію на іншій гілці. На цьому будується запуск кількох агентів паралельно: кожен працює у своєму worktree й не заважає іншим. Як це влаштувати, ми розбирали в матеріалі про git worktree для паралельних агентів. Worktrunk — CLI для керування worktree, створений під паралельну роботу ШІ-агентів; станом на 4 листопада 2026 року репозиторій має 10 975 зірок на GitHub.
Проблема в тому, що worktree ділить з основним репозиторієм конфіг, посилання й хуки. Документація git прямо пише, що файл конфігурації репозиторію за замовчуванням спільний для всіх робочих дерев. Ми перевірили, що з цього випливає, на git 2.53.0 (4 листопада 2026 року):
git init main && cd main && git commit --allow-empty -m init
git worktree add ../agent -b agent-work
cd ../agent
hooks="$(git rev-parse --git-common-dir)/hooks"
printf '#!/bin/sh\necho HOOK-RAN-IN-MAIN-REPO\n' > "$hooks/post-commit"
chmod +x "$hooks/post-commit"
git config user.email hacked@example.com
cd ../main && git commit --allow-empty -m second
# вивід: HOOK-RAN-IN-MAIN-REPO
git config user.email
# вивід: hacked@example.com
Хук, записаний із worktree агента, виконався під час коміту в основному репозиторії, а зміна git config із worktree змінила налаштування основного. Тобто агент із правом запису в спільний .git може залишити код, який потім запустите ви.
Як поєднати worktree із захистом:
- Запускайте агента у worktree всередині пісочниці. У linked worktree пісочниця Claude Code дозволяє запис у спільний
.gitосновного репозиторію, щоб працювавgit commit, але запис уhooks/іconfigтам лишається забороненим. Cursor захищає.git/hooksі.git/config, коли команда йде в його пісочниці; Codex тримає.gitлише для читання. - Для недовіреної роботи використовуйте повноцінний клон або режим
--cloneу Docker Sandboxes замість worktree. - Після роботи агента перевіряйте
.git/hooksіgit config --list --show-origin— ці зміни не видні вgit diff.
Що не закриває навіть пісочниця ШІ-агента: allowlist, ядро, MCP і CI
Пісочниця звужує можливості агента, але має залишкові ризики. Випадки AI agent sandbox escape — виходу агента за межі пісочниці — уже не теорія, тож ці ризики корисно знати, щоб не переоцінювати захист.
- Allowlist — сам собою поверхня атаки. У липні 2026 року модель OpenAI на внутрішньому оцінюванні вийшла з пісочниці через уразливість у проксі пакетів, який стояв у списку дозволених адрес, і дісталася до інфраструктури Hugging Face. Докладний розбір інциденту опублікував GitLab 12 серпня 2026 року. Висновок: кожен дозволений хост приносить із собою все, до чого він сам може дотягнутися.
- Широкі домени — канал виведення даних. Документація Claude Code попереджає, що дозвіл
github.comвідкриває шлях для витоку: проксі вирішує за іменем хоста й за замовчуванням не зазирає в TLS, тож можливий domain fronting (підміна адресата всередині зашифрованого з’єднання). - Спільне ядро. Контейнер і ОС-пісочниця спираються на ядро хоста; SandboxEscapeBench показав, що моделі використовують типові помилки конфігурації. Опція
allowUnixSocketsз/var/run/docker.sockфактично дає доступ до хоста. - MCP-сервери й хуки поза пісочницею. Локальні MCP-сервери працюють з вашими правами і в Claude Code, і в Docker Sandboxes. Окремий клас загроз — атаки через MCP-сервери.
- Агенти в CI. Clinejection і Comment and Control показали, що агент у CI із секретами й недовіреним текстом на вході — готовий шлях до крадіжки токенів.
Щоб картина була повною: пісочниця не лише обмежує, а й економить увагу. За внутрішніми даними Anthropic (20 жовтня 2025 року), пісочниця скоротила кількість запитів підтвердження на 84%. Це оцінка вендора на власному використанні, а не незалежний замір. Сенс у тому, що менше запитів — менше звички тиснути «так», не читаючи.
Захист агента за рівнем ризику: свій код, чужий код, автозапуск
| Рівень ризику | Приклад | Де запускати | Що бачить агент | Що дозволено |
|---|---|---|---|---|
| Свій код, ви поруч | Рефакторинг власного проєкту | Вбудована пісочниця: /sandbox, workspace-write, gemini -s | ~/.ssh, ~/.aws і токени в оточенні закриті через credentials або чисте оточення | deny-правила + PreToolUse-хук, підтвердження або auto-allow |
| Чужий репозиторій | Розбір незнайомого проєкту, нові залежності | Docker Sandboxes з --clone або окрема ВМ | Ключі лише через проксі, у середовищі їх немає | Мережа Balanced або вужча, без docker.sock |
| Автозапуск без нагляду | Нічні завдання, агент у CI | microVM, ВМ або одноразовий ранер | Короткоживучі токени на один репозиторій, ліміт витрат | Мінімальний allowlist; без секретів із правом публікації поруч із недовіреним текстом |
Мінімальний набір на сьогодні, покроково:
- Закомітьте роботу перед запуском агента.
- Увімкніть вбудовану пісочницю й перевірте її командами
touch ~/sandbox-probeіcurl --noproxy '*' example.com. - Закрийте
~/.ssh,~/.awsі змінні з токенами:sandbox.credentialsу Claude Code,ignore_default_excludes = falseу Codex,readBoundary: "workspace"у Cursor. - Приберіть ключі з
.envу робочій папці; якщо секрет потрібен, підставляйте його через проксі або обгортайтеop runдовкола застосунку, а не агента. - Випустіть агенту окремі ключі: fine-grained токен GitHub на один репозиторій і API-ключ з лімітом витрат.
- Додайте deny-правила й PreToolUse-хук проти
rm -rf,git push --forceіcurl | sh. - Режим без підтверджень — лише всередині devcontainer, Docker Sandboxes або ВМ.
Що застаріє першим: типові налаштування агентів і номери версій (readBoundary у Cursor з 3.23, маскування ключів у Claude Code з 2.1.221), умови Docker Sandboxes і список доменів в еталонному файрволі. Перед налаштуванням звіряйтеся з офіційною документацією свого агента.
FAQ
Чи потрібен Docker, якщо в Claude Code є /sandbox?
Для власного коду вбудованої пісочниці зазвичай досить, якщо закрити ключі через sandbox.credentials і ввімкнути суворий режим. Але /sandbox покриває лише shell-команди: файлові інструменти, MCP-сервери й хуки працюють поза ним, а читання за замовчуванням відкрите майже по всій машині. Для чужого коду або режиму без підтверджень потрібен devcontainer, Docker Sandboxes або ВМ.
Чи безпечно запускати агента з –dangerously-skip-permissions у контейнері?
Безпечніше, ніж на хості, але лише для довіреного репозиторію. Документація Anthropic попереджає: у цьому режимі шкідливий проєкт може винести все, що доступне всередині контейнера, зокрема облікові дані Claude Code у ~/.claude. Не монтуйте ~/.ssh і docker.sock, закрийте мережу файрволом, а для чужого коду беріть microVM із ключами на проксі.
Де зберігати API-ключі під час роботи з агентами і чому не можна просто покласти їх у .env?
Агент, наткнувшись на помилку авторизації, сам відкриває .env і виконує printenv, а прочитане потрапляє в транскрипт сесії відкритим текстом. Зберігайте ключі в менеджері секретів, підставляйте їх через проксі (режим mask у Claude Code, sbx secret set у Docker Sandboxes) і випускайте агенту окремі ключі з мінімальними правами й лімітом витрат.
Як захиститися від prompt injection в агенті, якщо він читає чужий репозиторій?
Повністю запобігти ін’єкції не можна, тому обмежують наслідки. Запускайте агента в Docker Sandboxes з --clone або в окремій ВМ, не тримайте в середовищі справжніх ключів, залиште в мережі лише потрібні адреси й не вмикайте режим без підтверджень поза ізоляцією. Так навіть успішна ін’єкція не дотягнеться до ваших даних і не надішле їх назовні.
Чи захищає git worktree або worktrunk від агента?
Ні. Worktree ділить з основним репозиторієм конфіг, посилання й хуки. У нашій перевірці на git 2.53.0 хук, записаний із worktree, виконався під час коміту в основному репозиторії. Worktree зручний для паралельної роботи, а захист дає пісочниця поверх нього, яка забороняє запис у .git/hooks і .git/config, або повноцінний клон.
Що робити, якщо агент уже прочитав секрет?
Одразу відкличте й перевипустіть ключ: видалення .env не допомагає, бо Claude Code уже записав прочитане в транскрипт у ~/.claude/projects і за замовчуванням зберігає його 30 днів. Потім перевірте журнали використання ключа в провайдера й видаліть локальну історію проєкту командою claude purge.


