Модель безопасности

Границы доверия в 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 добавляет исходящий прокси, и в саму песочницу они никогда не попадают. Этот раздел будет дополнен, когда облако станет доступно.

Как сообщить об уязвимости

См. Безопасность и конфиденциальность.

На этой странице