NotariumДокументация
Версия документации: latest
RU

Безопасность и видимость

Дать агенту прямой доступ к движку хранения — значит собрать «lethal trifecta»: приватные данные × недоверенный контент заметок × исходящий канал. Любая из осей сама по себе безобидна, но вместе они позволяют инъекции в заметке увести ваши данные наружу. MCP-гейтвей Notarium разрывает каждую ось конструкцией, а не настройкой. Это не обёртка ради удобства — это граница доверия.

Трифекта разорвана конструкцией

  • Нет исходящего канала. У всех инструментов выставлен openWorldHint:false — ни один инструмент не ходит в сеть. Нет переноса или копирования между пространствами — внутренняя утечка данных тоже закрыта. Уводить данные некуда.
  • Недоверенный контент обезврежен. Инструкции сервера статичны и никогда не смешиваются с содержимым заметок: контент не подмешивается ни в описания инструментов, ни в server instructions. Так инъекция в теле заметки не станет командой агенту.
  • Деструктив только обратимый. delete_note шлёт заметку в корзину; восстановление и безвозвратную очистку делает человек, не агент. Это и есть линия «агент не делает необратимого».

Проверка прав на каждом вызове

Права проверяются дважды. Сначала tools/list фильтруется потолком токена — read-токен просто не видит пишущие инструменты. Затем каждый tools/call дополнительно проверяет доступ к конкретному пространству (can(principal, action, {space})). Формула прав — effective = scopes(token) ∩ grants(principal): права токена (потолок действий) пересекаются с живым членством в пространствах. Отзыв гранта сужает токен мгновенно.

Management-действия (выпуск токенов, управление членами) лежат выше write — утёкший токен уровня write не выпустит новый токен и не выдаст доступ.

Отказ = 404, не 403

Отказ в доступе отдаётся как 404 («нет такого»), а не 403 («нельзя»). Так по кодам ответа нельзя перебором выяснить, какие заметки или пространства существуют за пределами выданных прав. Чужое пространство недостижимо в принципе и неотличимо от несуществующего.

flowchart TD
  call[tools/call] --> listed{инструмент в<br/>потолке токена?}
  listed -->|нет| gone[инструмента нет в tools/list]
  listed -->|да| acl{can principal,<br/>action, space?}
  acl -->|нет| notfound[404 · анти-enumeration]
  acl -->|да| exec[выполнить · провенанс в журнал]

Обезвреживание недоверенного контента

Всё, что уходит агенту — title, snippet, content, frontmatter — очищается перед отправкой: у псевдо-control-тегов (<system>, <instructions> и подобных) обезвреживаются угловые скобки. Заметка, в которую кто-то вписал «системную инструкцию», приедет агенту как обычный текст, а не как команда.

История правок видна

Каждая правка записывает в историю правок, кто её сделал — конкретный человек или агент. get_note и recall умеют вернуть, кто правил заметку: человек или агент, какой именно. Инъекция, прошедшая через агента, остаётся видимой и отслеживаемой.

Что это значит на практике

Даже полностью скомпрометированный промптом агент ограничен своим токеном: он не выйдет в сеть, не дотянется до чужого пространства, не сделает необратимого удаления и не выдаст себе прав. Худшее, что он может, — обратимая правка в пределах своих прав, с полным провенансом в журнале.

Граница: не E2EE

Notarium осознанно не делает сквозного шифрования. Умный сервер — поиск, семантика, история, агенты — требует доступа к plaintext. Приватность здесь строится на self-host и владении файлами, а не на E2EE. Модель угроз гейтвея защищает от компрометации агента, а не от компрометации хоста, которому вы и так доверяете свои файлы.

Дальше