Формальная верификация (Модели безопасности)
На этой странице отслеживаются формальные модели безопасности OpenClaw (на данный момент TLA+/TLC; по мере необходимости будут добавляться другие).
Примечание: в некоторых старых ссылках может упоминаться предыдущее название проекта.
Цель (основная): предоставить машинно-проверяемый аргумент, что OpenClaw обеспечивает соблюдение заявленной политики безопасности (авторизация, изоляция сессий, контроль инструментов и безопасность от неправильной конфигурации) при явных допущениях. Что это такое (на сегодня): исполняемый регрессионный набор тестов безопасности, ориентированный на атакующего:
- Каждое утверждение имеет выполняемую проверку модели на конечном пространстве состояний.
- Многие утверждения имеют парную негативную модель, которая воспроизводит трассировку контрпримера для реалистичного класса ошибок.
Чем это не является (пока): доказательством того, что «OpenClaw безопасен во всех отношениях» или что полная реализация на TypeScript корректна.
Где находятся модели
Модели поддерживаются в отдельном репозитории: vignesh07/openclaw-formal-models.
Важные оговорки
- Это модели, а не полная реализация на TypeScript. Возможен дрейф между моделью и кодом.
- Результаты ограничены пространством состояний, исследуемым TLC; статус «зелёный» не подразумевает безопасность за пределами смоделированных допущений и границ.
- Некоторые утверждения опираются на явные допущения о среде (например, корректное развертывание, корректные входные данные конфигурации).
Воспроизведение результатов
На сегодня результаты воспроизводятся путем локального клонирования репозитория с моделями и запуска TLC (см. ниже). В будущих итерациях может быть предложено:
- Модели, запускаемые в CI, с публичными артефактами (трассировки контрпримеров, логи выполнения)
- Размещенный рабочий процесс «запусти эту модель» для небольших, ограниченных проверок
Начало работы:
git clone https://github.com/vignesh07/openclaw-formal-models
cd openclaw-formal-models
# Требуется Java 11+ (TLC работает на JVM).
# Репозиторий содержит зафиксированный `tla2tools.jar` (инструменты TLA+) и предоставляет `bin/tlc` + цели Make.
make <target>
Экспозиция шлюза и ошибочная конфигурация открытого шлюза
Утверждение: привязка не к loopback-адресу без аутентификации может сделать возможным удаленный компрометас / увеличивает экспозицию; токен/пароль блокируют неавторизованных атакующих (в соответствии с допущениями модели).
- Зелёные запуски:
make gateway-exposure-v2make gateway-exposure-v2-protected
- Красные (ожидаемо):
make gateway-exposure-v2-negative
См. также: docs/gateway-exposure-matrix.md в репозитории моделей.
Конвейер Nodes.run (наиболее рискованная возможность)
Утверждение: nodes.run требует (a) разрешённого списка команд узла плюс объявленных команд и (b) живого подтверждения при настройке; подтверждения токенизированы для предотвращения повторного использования (в модели).
- Зелёные запуски:
make nodes-pipelinemake approvals-token
- Красные (ожидаемо):
make nodes-pipeline-negativemake approvals-token-negative
Хранилище сопряжения (контроль DM)
Утверждение: запросы на сопряжение соблюдают TTL и ограничения на количество ожидающих запросов.
- Зелёные запуски:
make pairingmake pairing-cap
- Красные (ожидаемо):
make pairing-negativemake pairing-cap-negative
Контроль входящего трафика (упоминания + обход управляющих команд)
Утверждение: в групповых контекстах, требующих упоминания, неавторизованная «управляющая команда» не может обойти контроль упоминаний.
- Зелёные:
make ingress-gating
- Красные (ожидаемо):
make ingress-gating-negative
Изоляция маршрутизации/ключей сессий
Утверждение: личные сообщения от разных участников не объединяются в одну сессию, если явно не связаны/не настроены.
- Зелёные:
make routing-isolation
- Красные (ожидаемо):
make routing-isolation-negative
v1++: дополнительные ограниченные модели (параллелизм, повторные попытки, корректность трассировки)
Это последующие модели, повышающие точность соответствия реальным сценариям сбоев (неатомарные обновления, повторные попытки и ветвление сообщений).
Параллелизм / идемпотентность хранилища сопряжения
Утверждение: хранилище сопряжения должно обеспечивать соблюдение MaxPending и идемпотентность даже при чередовании операций (т.е. операция «проверить-затем-записать» должна быть атомарной / заблокированной; обновление не должно создавать дубликаты). Что это означает:
- При параллельных запросах нельзя превысить
MaxPendingдля канала. - Повторные запросы/обновления для одной и той же пары
(channel, sender)не должны создавать дублирующиеся активные ожидающие строки. - Зелёные запуски:
make pairing-race(атомарная/заблокированная проверка ограничения)make pairing-idempotencymake pairing-refreshmake pairing-refresh-race
- Красные (ожидаемо):
make pairing-race-negative(гонка из-за неатомарной проверки ограничения при начале/фиксации)make pairing-idempotency-negativemake pairing-refresh-negativemake pairing-refresh-race-negative
Корреляция трассировки входящего трафика / идемпотентность
Утверждение: обработка входящих данных должна сохранять корреляцию трассировки при ветвлении и быть идемпотентной при повторных попытках от провайдера. Что это означает:
- Когда одно внешнее событие порождает несколько внутренних сообщений, каждая часть сохраняет одну и ту же идентичность трассировки/события.
- Повторные попытки не приводят к двойной обработке.
- Если идентификаторы событий провайдера отсутствуют, дедупликация переключается на безопасный ключ (например, ID трассировки), чтобы не отбрасывать различные события.
- Зелёные:
make ingress-tracemake ingress-trace2make ingress-idempotencymake ingress-dedupe-fallback
- Красные (ожидаемо):
make ingress-trace-negativemake ingress-trace2-negativemake ingress-idempotency-negativemake ingress-dedupe-fallback-negative
Приоритет dmScope маршрутизации + identityLinks
Утверждение: маршрутизация должна по умолчанию сохранять изоляцию сессий личных сообщений и объединять сессии только при явной настройке (приоритет канала + связи идентификаторов). Что это означает:
- Переопределения dmScope для конкретного канала должны иметь приоритет над глобальными значениями по умолчанию.
- Связи идентификаторов должны объединять сессии только внутри явно связанных групп, а не между несвязанными участниками.
- Зелёные:
make routing-precedencemake routing-identitylinks
- Красные (ожидаемо):
make routing-precedence-negativemake routing-identitylinks-negative