Модель безопасности
Границы доверия в Cusp и механизмы защиты на каждой из них — барьер разрешений, песочница ОС и список разрешённых сетевых адресов, секреты, локальный демон, десктопное приложение и облако.
На этой странице описано, как Cusp удерживает агента в заданных вами рамках: кому и чему Cusp доверяет, где проходят границы и какой механизм защищает каждую из них. О том, какие данные покидают ваш компьютер, читайте в разделе Безопасность и конфиденциальность.
Принципы
- Один шлюз. Любой побочный эффект от любого вида запуска (ваша сессия, субагент, дорожка гонки, ревью, участник команды, скрипт на SDK) проходит через один и тот же движок разрешений. Политики Команды, флаги CLI и колбэки SDK — это его входные данные, а не альтернативы ему.
- Содержимое — это данные. Текст, который читает агент (файлы, веб-страницы, issue, журналы CI, вывод инструментов, сообщения от других агентов), никогда не действует от вашего имени.
- При сбое — запрет. Если проверку не удаётся выполнить, результатом будет запрос подтверждения или отказ, но никогда не молчаливое разрешение.
- Минимальные привилегии по умолчанию. Команды оболочки выполняются в песочнице, без сети и без ваших учётных данных в окружении.
Границы доверия
| Граница | Что по другую сторону | Основные механизмы защиты |
|---|---|---|
| Модель | Недоверенный вывод: любой предложенный ею вызов инструмента может быть ошибочным или спровоцированным внедрённым текстом | Движок разрешений, защищённые пути, песочница |
| Репозиторий | Код и конфигурация, которые вы, возможно, не писали | Доверие к рабочей области; репозитории не могут ослабить песочницу |
| Команды оболочки | Произвольные программы | Песочница ОС, сетевой прокси, очищенное окружение |
| Сеть | Любой хост | Сетевая политика песочницы, список разрешённых доменов |
| Другие локальные программы | Всё, что работает от вашего имени на том же компьютере | Bearer-токен демона, привязка только к loopback, проверка источника (origin) |
| Удалённые устройства | Ваши другие устройства через облако Cusp | Токены с ограниченной областью действия, которые не могут повысить привилегии |
| Расширения | Навыки, хуки, MCP-серверы, плагины | Тот же шлюз; хуки и MCP-серверы не получают токен демона |
Барьер разрешений
Перед выполнением каждый вызов инструмента проверяется по хукам, вашим правилам и режиму сессии. Режимы и синтаксис правил описаны в разделе Разрешения. Помимо ваших правил:
- Защищённые пути всегда требуют участия человека, в любом режиме:
.git, конфигурация агента (.cusp,.claude,.codex, …), файлы запуска оболочки и конфигурация, исполняющая код. - Хранилища секретов (
~/.ssh,~/.aws, связки ключей, токены CLI, профили браузеров, собственная папка данных Cusp и другие) файловые инструменты агента не могут прочитать без вашего подтверждения. Тот же список закрыт и для команд в песочнице. - Разбор команд оболочки. Составные команды, подстановки,
sh -c,evalи обёртки вродеsudoилиenvразбираются, поэтому опасная команда не может проскочить по разрешающему правилу для безопасной. - Классификатор режима auto видит ваши сообщения и предлагаемое действие, но никогда не видит вывод инструментов, поэтому внедрённый текст не может убедить его дать разрешение. После 3 блокировок подряд или 20 в сумме режим auto останавливается и спрашивает вас.
- Сообщения агентов не дают полномочий. Сообщение от другого агента приходит как информация. Сообщение для сессии, работающей с большей автономией, чем по умолчанию, ждёт вашего подтверждения.
- Администраторы могут отключить режимы bypass и auto (
disableBypassPermissionsMode,disableAutoMode) и запретить чтение за пределами рабочих папок (blockReadsOutsideWorkingDirectories).
Песочница
Команды оболочки, которые запускает агент (Bash, Process, Terminal и вспомогательные программы вроде проверки типов и языковых серверов), выполняются в песочнице операционной системы: Seatbelt в macOS и bubblewrap в Linux. Она включена по умолчанию. Настройки описаны в разделе Песочница.
По умолчанию команда в песочнице:
- Может писать только в рабочую область и временные папки. Конфигурация и хуки Git, а также конфигурация агента и редактора внутри рабочей области остаются доступными только для чтения.
- Может читать всё, кроме хранилищ секретов.
- Не имеет доступа к сети, включая localhost. Отдельные локальные порты открываются через
sandbox.network.allowLocalPorts. Собственный порт демона остаётся заблокированным (в Linux — только пока сеть полностью закрыта; в остальных случаях демон полагается на свой токен). - Выполняется без ключей провайдеров и учётных данных Cusp в окружении.
При сбое — запрет. Если песочницу нельзя применить (не установлен bubblewrap или на платформе её нет, как сейчас в Windows), команды оболочки отклоняются. Вы можете подтвердить отдельную команду без песочницы или задать sandbox.failIfUnavailable: false в пользовательских настройках, чтобы выполнять команды без песочницы.
Репозитории не могут её ослабить. Настройки, которые отключают или расширяют песочницу (enabled: false, failIfUnavailable: false, команды без песочницы или исключённые из неё, порты localhost, Unix-сокеты, дополнительные пути для чтения или записи), учитываются только из ваших пользовательских настроек, управляемых настроек или --settings, но никогда из собственных файлов проекта.
Список разрешённых сетевых адресов
Если задан sandbox.network.allowedDomains, команды в песочнице выходят в сеть только через фильтрующий прокси Cusp:
- Записи могут быть точными хостами (
registry.example.org), шаблонами поддоменов (*.example.com, который не совпадает с самимexample.com),*или IP-адресами, каждая с необязательным:port. deniedDomainsимеет приоритет надallowedDomains.- Если хоста нет ни в одном списке, вас спросят: разрешить один раз, разрешить на сессию или запретить.
- Частные и локальные адреса доступны только через явную запись хоста или IP, а DNS разрешается один раз, в прокси.
- Отклонённый запрос получает ответ 403 с заголовком
X-Cusp-Blockedи телом, которое начинается с «Blocked by Cusp network policy:», чтобы агент мог сообщить вам, какой хост ему нужен.
В Linux список разрешённых адресов пока носит рекомендательный характер. Трафик направляется в прокси через HTTP_PROXY и связанные переменные, но изоляции через сетевые пространства имён пока нет, поэтому программа, игнорирующая настройки прокси, может выйти в сеть напрямую. В macOS его соблюдение обеспечивает профиль песочницы.
Журнал аудита
Каждый вердикт о разрешении, каждое решение шлюза и каждое сетевое подключение через прокси дописываются в <data directory>/audit/<session>.jsonl, который можете читать только вы.
Секреты
- Десктопное приложение. Ключи провайдеров хранятся в системном хранилище учётных данных под службой
run.cusp.desktop. В базе данных Cusp хранится только ссылка. Размер значения ограничен 16 КиБ, и значения никогда не попадают в журналы или сообщения об ошибках. - Демон. Ключи извлекаются по ссылке (
env:NAMEили запись в связке ключей) только когда нужны, хранятся лишь в памяти и никогда не пишутся в журналы, не сохраняются и не возвращаются ни одним API. - Дочерние процессы. Команды оболочки, хуки и MCP-серверы не наследуют ключи провайдеров и токен демона.
Локальный демон
Демон (daemon) — это среда выполнения агента. Десктопное приложение, CLI, расширение VS Code и SDK — всё это его клиенты.
- Только loopback. Демон привязывается к
127.0.0.1. Чтобы слушать другой интерфейс, нужен явный флаг--allow-remote, предназначенный для облачных песочниц. - Bearer-токен. При каждом запуске генерируется новый случайный токен, который проверяется за постоянное время при каждом запросе. Исключения — проверка состояния и конечная точка, через который участники команды используют свои командные инструменты: у него вместо этого свой токен для каждой сессии.
- Файл обнаружения. Пока демон работает, он записывает свой адрес и токен в
daemon.jsonв своей папке данных с правами, позволяющими читать его только вам (файл0600, папка0700), и удаляет его при выходе. Так CLI и расширения редакторов находят работающий демон. - Источники. Запросы из браузера принимаются только с собственных источников десктопного приложения — и для HTTP, и для WebSocket-подключений.
- Ограниченный доступ. Запросы, пересылаемые с ваших других устройств через облако Cusp, используют отдельный токен с более узкой областью действия. С ним можно управлять сессиями и отвечать на запросы, но нельзя переключить сессию в режим bypass или auto, изменить правила разрешений, настройки или провайдеров или сохранить правила «Разрешать всегда». Терминалы доступны удалённо, только если вы включили
remote.terminalлокально.
Десктопное приложение
- Загружает только встроенный интерфейс и никогда не загружает удалённое содержимое.
- Строгая политика безопасности содержимого (CSP) ограничивает его им самим и демоном на loopback-адресе (
object-src,base-uriиform-actionустановлены в'none'). - Каждый вызов от интерфейса к нативной оболочке проходит через слой изоляции в изолированном фрейме, шифруется и сверяется со списком разрешённого. Каждой нативной команде нужно явное разрешение; неиспользуемые удаляются при сборке.
- Токен демона скрывается в отладочном выводе, и приложение никогда не записывает его на диск или в журналы.
- Файлы открываются в вашем редакторе через фиксированные схемы URL или обработчик ОС по умолчанию; приложение никогда не запускает для этого процесс.
Автоматизация GitHub
Когда Cusp действует в GitHub (GitHub Action, отслеживание PR, автоисправление):
- Запускать его или корректировать на ходу упоминанием могут только люди с доступом на запись.
- Текст PR и журналы CI передаются агенту как недоверенные данные.
- Для включения автоматического слияния (merge) нужно ваше подтверждение.
- PR из форков обрабатываются в Action только на чтение.
Облако
Облако Cusp появится скоро. Его архитектура безопасности: вход с устройства по одноразовому коду, API-ключи с узкой областью действия, ключи и токены хранятся только в виде хешей, учётные данные провайдеров зашифрованы конвертным шифрованием (envelope encryption), а в облачных песочницах учётные данные провайдеров и GitHub добавляет исходящий прокси, и в саму песочницу они никогда не попадают. Этот раздел будет дополнен, когда облако станет доступно.