Security
Verificación formal (modelos de seguridad)
Esta página hace seguimiento de los modelos formales de seguridad de OpenClaw (TLA+/TLC hoy; más según sea necesario).
Nota: algunos enlaces antiguos pueden referirse al nombre anterior del proyecto.
Objetivo (guía principal): proporcionar un argumento verificado por máquina de que OpenClaw aplica su política de seguridad prevista (autorización, aislamiento de sesiones, control de herramientas y seguridad ante configuraciones incorrectas), bajo supuestos explícitos.
Qué es esto (hoy): un conjunto de regresión de seguridad ejecutable e impulsado por atacantes:
- Cada afirmación tiene una verificación de modelo ejecutable sobre un espacio de estados finito.
- Muchas afirmaciones tienen un modelo negativo emparejado que produce una traza de contraejemplo para una clase de error realista.
Qué no es esto (todavía): una prueba de que "OpenClaw es seguro en todos los aspectos" o de que la implementación completa en TypeScript es correcta.
Dónde viven los modelos
Los modelos se mantienen en un repositorio independiente: vignesh07/openclaw-formal-models.
Advertencias importantes
- Estos son modelos, no la implementación completa en TypeScript. Es posible que haya divergencias entre el modelo y el código.
- Los resultados están limitados por el espacio de estados explorado por TLC; "verde" no implica seguridad más allá de los supuestos y límites modelados.
- Algunas afirmaciones dependen de supuestos ambientales explícitos (por ejemplo, despliegue correcto, entradas de configuración correctas).
Reproducir los resultados
Hoy, los resultados se reproducen clonando localmente el repositorio de modelos y ejecutando TLC (ver abajo). Una iteración futura podría ofrecer:
- modelos ejecutados en CI con artefactos públicos (trazas de contraejemplo, registros de ejecución)
- un flujo de trabajo alojado de "ejecutar este modelo" para comprobaciones pequeñas y acotadas
Primeros pasos:
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>
Exposición del Gateway y configuración incorrecta de Gateway abierto
Afirmación: enlazarse más allá de loopback sin autenticación puede hacer posible el compromiso remoto / aumenta la exposición; token/contraseña bloquea atacantes no autenticados (según los supuestos del modelo).
- Ejecuciones verdes:
make gateway-exposure-v2make gateway-exposure-v2-protected
- Rojas (esperadas):
make gateway-exposure-v2-negative
Ver también: docs/gateway-exposure-matrix.md en el repositorio de modelos.
Canalización de exec de Node (capacidad de mayor riesgo)
Afirmación: exec host=node requiere (a) una lista de comandos Node permitidos más comandos declarados y (b) aprobación en vivo cuando está configurado; las aprobaciones se tokenizan para evitar la reproducción (en el modelo).
- Ejecuciones verdes:
make nodes-pipelinemake approvals-token
- Rojas (esperadas):
make nodes-pipeline-negativemake approvals-token-negative
Almacén de emparejamiento (control de DM)
Afirmación: las solicitudes de emparejamiento respetan el TTL y los límites de solicitudes pendientes.
- Ejecuciones verdes:
make pairingmake pairing-cap
- Rojas (esperadas):
make pairing-negativemake pairing-cap-negative
Control de entrada (menciones + omisión por comando de control)
Afirmación: en contextos de grupo que requieren mención, un "comando de control" no autorizado no puede omitir el control de menciones.
- Verde:
make ingress-gating
- Roja (esperada):
make ingress-gating-negative
Aislamiento de enrutamiento/clave de sesión
Afirmación: los DM de pares distintos no se colapsan en la misma sesión salvo que estén vinculados/configurados explícitamente.
- Verde:
make routing-isolation
- Roja (esperada):
make routing-isolation-negative
v1++: modelos acotados adicionales (concurrencia, reintentos, corrección de trazas)
Estos son modelos posteriores que refuerzan la fidelidad en torno a modos de fallo del mundo real (actualizaciones no atómicas, reintentos y distribución de mensajes).
Concurrencia / idempotencia del almacén de emparejamiento
Afirmación: un almacén de emparejamiento debería aplicar MaxPending y la idempotencia incluso bajo intercalados (es decir, "comprobar y luego escribir" debe ser atómico / bloqueado; la actualización no debería crear duplicados).
Qué significa:
-
Bajo solicitudes concurrentes, no puedes superar
MaxPendingpara un canal. -
Las solicitudes/actualizaciones repetidas para el mismo
(channel, sender)no deberían crear filas pendientes vivas duplicadas. -
Ejecuciones verdes:
make pairing-race(comprobación de límite atómica/bloqueada)make pairing-idempotencymake pairing-refreshmake pairing-refresh-race
-
Rojas (esperadas):
make pairing-race-negative(carrera de límite no atómica begin/commit)make pairing-idempotency-negativemake pairing-refresh-negativemake pairing-refresh-race-negative
Correlación de trazas de entrada / idempotencia
Afirmación: la ingesta debería preservar la correlación de trazas durante la distribución y ser idempotente bajo reintentos del proveedor.
Qué significa:
-
Cuando un evento externo se convierte en varios mensajes internos, cada parte mantiene la misma identidad de traza/evento.
-
Los reintentos no provocan procesamiento doble.
-
Si faltan los IDs de eventos del proveedor, la deduplicación recurre a una clave segura (por ejemplo, ID de traza) para evitar descartar eventos distintos.
-
Verde:
make ingress-tracemake ingress-trace2make ingress-idempotencymake ingress-dedupe-fallback
-
Rojas (esperadas):
make ingress-trace-negativemake ingress-trace2-negativemake ingress-idempotency-negativemake ingress-dedupe-fallback-negative
Precedencia de dmScope de enrutamiento + identityLinks
Afirmación: el enrutamiento debe mantener aisladas las sesiones de DM de forma predeterminada, y solo colapsar sesiones cuando se configura explícitamente (precedencia de canal + enlaces de identidad).
Qué significa:
-
Las anulaciones de dmScope específicas del canal deben prevalecer sobre los valores predeterminados globales.
-
identityLinks debería colapsar solo dentro de grupos vinculados explícitos, no entre pares no relacionados.
-
Verde:
make routing-precedencemake routing-identitylinks
-
Rojas (esperadas):
make routing-precedence-negativemake routing-identitylinks-negative