Формальная верификация (модели безопасности)

Эта страница отслеживает формальные модели безопасности 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-v2
    • make gateway-exposure-v2-protected
  • Красные (ожидаемые):
    • make gateway-exposure-v2-negative

Смотрите также: docs/gateway-exposure-matrix.md в репозитории моделей.

Конвейер Nodes.run (возможность наивысшего риска)

Утверждение: nodes.run требует (a) белый список команд узла плюс объявленные команды и (b) живое одобрение при настройке; одобрения токенизированы для предотвращения повтора (в модели).

  • Зелёные запуски:
    • make nodes-pipeline
    • make approvals-token
  • Красные (ожидаемые):
    • make nodes-pipeline-negative
    • make approvals-token-negative

Хранилище сопряжения (управление DM)

Утверждение: запросы на сопряжение уважают TTL и лимиты ожидающих запросов.

  • Зелёные запуски:
    • make pairing
    • make pairing-cap
  • Красные (ожидаемые):
    • make pairing-negative
    • make pairing-cap-negative

Управление входом (упоминания + обход команд управления)

Утверждение: в контекстах группы, требующих упоминания, неавторизованная "команда управления" не может обойти управление упоминаниями.

  • Зелёный:
    • make ingress-gating
  • Красный (ожидаемый):
    • make ingress-gating-negative

Изоляция маршрутизации/ключа сессии

Утверждение: DM от разных пиров не сворачиваются в одну и ту же сессию, если явно не связаны/настроены.

  • Зелёный:
    • make routing-isolation
  • Красный (ожидаемый):
    • make routing-isolation-negative

v1++: дополнительные ограниченные модели (параллелизм, повторы, корректность трассировки)

Это последующие модели, которые усиливают точность вокруг реальных режимов сбоев (неатомарные обновления, повторы и рассылка сообщений).

Параллелизм / идемпотентность хранилища сопряжения

Утверждение: хранилище сопряжения должно обеспечивать MaxPending и идемпотентность даже при чередовании (т.е., "проверка-затем-запись" должна быть атомарной / заблокированной; обновление не должно создавать дубликаты).

Что это означает:

  • При одновременных запросах вы не можете превысить MaxPending для канала.

  • Повторяющиеся запросы/обновления для одного и того же (channel, sender) не должны создавать дублирующиеся живые ожидающие строки.

  • Зелёные запуски:

    • make pairing-race (атомарная/заблокированная проверка лимита)
    • make pairing-idempotency
    • make pairing-refresh
    • make pairing-refresh-race
  • Красные (ожидаемые):

    • make pairing-race-negative (неатомарная гонка начало/коммит лимита)
    • make pairing-idempotency-negative
    • make pairing-refresh-negative
    • make pairing-refresh-race-negative

Корреляция трассировки входа / идемпотентность

Утверждение: приём должен сохранять корреляцию трассировки при рассылке и быть идемпотентным при повторах провайдера.

Что это означает:

  • Когда одно внешнее событие становится несколькими внутренними сообщениями, каждая часть сохраняет одну и ту же идентичность трассировки/события.

  • Повторы не приводят к двойной обработке.

  • Если ID событий провайдера отсутствуют, дедупликация переключается на безопасный ключ (например, ID трассировки), чтобы избежать потери отдельных событий.

  • Зелёный:

    • make ingress-trace
    • make ingress-trace2
    • make ingress-idempotency
    • make ingress-dedupe-fallback
  • Красный (ожидаемый):

    • make ingress-trace-negative
    • make ingress-trace2-negative
    • make ingress-idempotency-negative
    • make ingress-dedupe-fallback-negative

Утверждение: маршрутизация должна держать DM сессии изолированными по умолчанию, и сворачивать сессии только при явной настройке (приоритет канала + ссылки идентичности).

Что это означает:

  • Переопределения dmScope для конкретного канала должны побеждать глобальные настройки по умолчанию.

  • identityLinks должны сворачивать только внутри явных связанных групп, а не между несвязанными пирами.

  • Зелёный:

    • make routing-precedence
    • make routing-identitylinks
  • Красный (ожидаемый):

    • make routing-precedence-negative
    • make routing-identitylinks-negative