Security
Verificação formal (modelos de segurança)
Esta página acompanha os modelos formais de segurança do OpenClaw (TLA+/TLC hoje; mais conforme necessário).
Observação: alguns links antigos podem se referir ao nome anterior do projeto.
Objetivo (referência norteadora): fornecer um argumento verificado por máquina de que o OpenClaw aplica sua política de segurança pretendida (autorização, isolamento de sessão, controle de ferramentas e segurança contra configuração incorreta), sob premissas explícitas.
O que isto é (hoje): uma suíte de regressão de segurança executável e orientada por atacante:
- Cada alegação tem uma verificação de modelo executável sobre um espaço de estados finito.
- Muitas alegações têm um modelo negativo pareado que produz um rastro de contraexemplo para uma classe realista de bugs.
O que isto ainda não é: uma prova de que "o OpenClaw é seguro em todos os aspectos" ou de que a implementação completa em TypeScript está correta.
Onde os modelos ficam
Os modelos são mantidos em um repositório separado: vignesh07/openclaw-formal-models.
Ressalvas importantes
- Estes são modelos, não a implementação completa em TypeScript. Pode haver divergência entre o modelo e o código.
- Os resultados são limitados pelo espaço de estados explorado pelo TLC; "verde" não implica segurança além das premissas e limites modelados.
- Algumas alegações dependem de premissas ambientais explícitas (por exemplo, implantação correta, entradas de configuração corretas).
Reproduzindo os resultados
Hoje, os resultados são reproduzidos clonando o repositório de modelos localmente e executando o TLC (veja abaixo). Uma iteração futura poderia oferecer:
- Modelos executados em CI com artefatos públicos (rastros de contraexemplo, logs de execução)
- um fluxo hospedado "executar este modelo" para verificações pequenas e limitadas
Primeiros passos:
git clone https://github.com/vignesh07/openclaw-formal-models
cd openclaw-formal-models
# Java 11+ required (TLC runs on the JVM).
# The repo vendors a pinned `tla2tools.jar` (TLA+ tools) and provides `bin/tlc` + Make targets.
make <target>
Exposição do Gateway e configuração incorreta de gateway aberto
Alegação: fazer binding além do loopback sem autenticação pode tornar um comprometimento remoto possível / aumenta a exposição; token/senha bloqueia atacantes não autenticados (conforme as premissas do modelo).
- Execuções verdes:
make gateway-exposure-v2make gateway-exposure-v2-protected
- Vermelho (esperado):
make gateway-exposure-v2-negative
Veja também: docs/gateway-exposure-matrix.md no repositório de modelos.
Pipeline de exec do Node (capacidade de maior risco)
Alegação: exec host=node exige (a) uma allowlist de comandos node mais comandos declarados e (b) aprovação ativa quando configurado; aprovações são tokenizadas para impedir repetição (no modelo).
- Execuções verdes:
make nodes-pipelinemake approvals-token
- Vermelho (esperado):
make nodes-pipeline-negativemake approvals-token-negative
Armazenamento de pareamento (controle de DM)
Alegação: solicitações de pareamento respeitam TTL e limites de solicitações pendentes.
- Execuções verdes:
make pairingmake pairing-cap
- Vermelho (esperado):
make pairing-negativemake pairing-cap-negative
Controle de ingresso (menções + bypass de comando de controle)
Alegação: em contextos de grupo que exigem menção, um "comando de controle" não autorizado não consegue contornar o controle de menção.
- Verde:
make ingress-gating
- Vermelho (esperado):
make ingress-gating-negative
Isolamento de roteamento/chave de sessão
Alegação: DMs de pares distintos não colapsam na mesma sessão, a menos que estejam explicitamente vinculadas/configuradas.
- Verde:
make routing-isolation
- Vermelho (esperado):
make routing-isolation-negative
v1++: modelos limitados adicionais (concorrência, tentativas novamente, correção de rastro)
Estes são modelos subsequentes que aumentam a fidelidade em torno de modos de falha do mundo real (atualizações não atômicas, tentativas novamente e fan-out de mensagens).
Concorrência / idempotência do armazenamento de pareamento
Alegação: um armazenamento de pareamento deve impor MaxPending e idempotência mesmo sob interleavings (ou seja, "verificar-então-gravar" deve ser atômico / bloqueado; refresh não deve criar duplicatas).
O que isso significa:
-
Sob solicitações concorrentes, você não pode exceder
MaxPendingpara um canal. -
Solicitações/refreshes repetidos para o mesmo
(channel, sender)não devem criar linhas pendentes ativas duplicadas. -
Execuções verdes:
make pairing-race(verificação de limite atômica/bloqueada)make pairing-idempotencymake pairing-refreshmake pairing-refresh-race
-
Vermelho (esperado):
make pairing-race-negative(corrida de limite begin/commit não atômica)make pairing-idempotency-negativemake pairing-refresh-negativemake pairing-refresh-race-negative
Correlação / idempotência de rastros de ingresso
Alegação: a ingestão deve preservar a correlação de rastro ao longo do fan-out e ser idempotente sob novas tentativas do provedor.
O que isso significa:
-
Quando um evento externo se torna várias mensagens internas, cada parte mantém a mesma identidade de rastro/evento.
-
Novas tentativas não resultam em processamento duplicado.
-
Se os IDs de evento do provedor estiverem ausentes, a deduplicação recorre a uma chave segura (por exemplo, ID de rastro) para evitar descartar eventos distintos.
-
Verde:
make ingress-tracemake ingress-trace2make ingress-idempotencymake ingress-dedupe-fallback
-
Vermelho (esperado):
make ingress-trace-negativemake ingress-trace2-negativemake ingress-idempotency-negativemake ingress-dedupe-fallback-negative
Precedência de dmScope no roteamento + identityLinks
Alegação: o roteamento deve manter sessões de DM isoladas por padrão, e só colapsar sessões quando configurado explicitamente (precedência de canal + links de identidade).
O que isso significa:
-
Overrides de dmScope específicos do canal devem prevalecer sobre os padrões globais.
-
identityLinks devem colapsar apenas dentro de grupos vinculados explícitos, não entre pares não relacionados.
-
Verde:
make routing-precedencemake routing-identitylinks
-
Vermelho (esperado):
make routing-precedence-negativemake routing-identitylinks-negative