Alcance: modelo de seguridad de asistente personal
- Compatible: un usuario/límite de confianza por Gateway (preferiblemente un usuario del SO/host/VPS por límite).
- No compatible: un Gateway/agente compartido usado por usuarios mutuamente no confiables o adversarios.
- El aislamiento de usuarios adversarios necesita Gateways separados (e idealmente usuarios del SO/hosts separados).
- Si varios usuarios no confiables pueden enviar mensajes a un agente con herramientas habilitadas, comparten la autoridad delegada de herramientas de ese agente.
- Si alguien puede modificar el estado/configuración del host del Gateway (
~/.openclaw, incluidoopenclaw.json), trátalo como operador de confianza. - Dentro de un Gateway, el acceso autenticado del operador es un rol de plano de control de confianza, no un rol de inquilino por usuario.
sessionKey(ID de sesión, etiquetas) es un selector de enrutamiento, no un token de autorización.
openclaw security audit
Ejecútalo después de cualquier cambio de configuración o antes de exponer superficies de red:
--fix es intencionalmente limitado: cambia las políticas de grupos abiertos a listas de permitidos, restaura logging.redactSensitive: "tools", endurece los permisos de estado/configuración/archivos incluidos (archivos 600, directorios 700) y en Windows usa restablecimientos de ACL en lugar de chmod POSIX.
Qué comprueba la auditoría (alto nivel)
- Acceso entrante - políticas de DM/grupo, listas de permitidos: ¿pueden desconocidos activar el bot?
- Radio de impacto de herramientas - herramientas elevadas + salas abiertas: ¿podría una inyección de prompt convertirse en acciones de shell/archivo/red?
- Deriva del sistema de archivos de exec - herramientas de sistema de archivos mutantes denegadas mientras
exec/processsiguen disponibles sin restricciones de sandbox. - Deriva de aprobaciones de exec -
security="full",autoAllowSkills, listas de permitidos de intérpretes sinstrictInlineEval.security="full"por sí solo es una advertencia de postura amplia, no prueba de un bug: es el valor predeterminado elegido para configuraciones de asistente personal de confianza; endurécelo solo cuando tu modelo de amenazas necesite aprobaciones o barreras de lista de permitidos. - Exposición de red - enlace/autenticación del Gateway, Tailscale Serve/Funnel, tokens de autenticación débiles/cortos.
- Exposición de control del navegador - nodos remotos, puertos de relé, endpoints CDP remotos.
- Higiene de disco local - permisos, symlinks, inclusiones de configuración, rutas de carpetas sincronizadas.
- Plugins - carga sin una lista de permitidos explícita.
- Deriva de políticas - configuración de Docker de sandbox configurada pero modo sandbox desactivado; entradas
gateway.nodes.denyCommandsque parecen efectivas pero solo coinciden con ID exactos de comandos (por ejemplosystem.run), no con texto de shell dentro de la carga útil; entradas peligrosas degateway.nodes.allowCommands;tools.profile="minimal"global sobrescrito por agente; herramientas propiedad de plugins accesibles bajo una política permisiva. - Deriva de expectativas de runtime - asumir que exec implícito aún significa
sandboxcuandotools.exec.hostahora tieneautocomo valor predeterminado, o establecertools.exec.host="sandbox"mientras el modo sandbox está desactivado. - Higiene del modelo - advierte sobre modelos heredados configurados (advertencia suave, no bloqueo estricto).
checkId estructurado (por ejemplo gateway.bind_no_auth, tools.exec.security_full_configured). Prefijos: fs.* (permisos), gateway.* (enlace/autenticación/Tailscale/Control UI/proxy de confianza), hooks.*/browser.*/sandbox.*/tools.exec.* (endurecimiento por superficie), plugins.*/skills.* (cadena de suministro), security.exposure.* (política de acceso x radio de impacto de herramientas). Catálogo completo con severidad y compatibilidad con corrección automática: Comprobaciones de auditoría de seguridad. Consulta también Verificación formal.
Orden de prioridad al clasificar hallazgos
- Cualquier cosa “abierta” + herramientas habilitadas: bloquea primero DM/grupos (emparejamiento/listas de permitidos), luego endurece la política de herramientas/sandboxing.
- Exposición de red pública (enlace LAN, Funnel, autenticación ausente): corrígela de inmediato.
- Exposición remota de control del navegador: trátala como acceso de operador (solo tailnet, empareja nodos deliberadamente, sin exposición pública).
- Permisos: estado/configuración/credenciales/autenticación no deben ser legibles por grupo/mundo.
- Plugins: carga solo lo que confías explícitamente.
- Elección de modelo: prefiere modelos modernos, endurecidos para instrucciones, para cualquier bot con herramientas.
Línea base endurecida en 60 segundos
cron o gateway independientemente de la configuración.
Matriz de límites de confianza
Modelo rápido para clasificar informes de riesgo:| Límite o control | Qué significa | Malinterpretación común |
|---|---|---|
gateway.auth (token/contraseña/proxy de confianza/autenticación de dispositivo) | Autentica llamadores a las API del Gateway | ”Necesita firmas por mensaje en cada frame para ser seguro” |
sessionKey | Clave de enrutamiento para selección de contexto/sesión | ”La clave de sesión es un límite de autenticación de usuario” |
| Barreras de prompt/contenido | Reducen el riesgo de abuso del modelo | ”La inyección de prompt por sí sola prueba una omisión de autenticación” |
canvas.eval / evaluación en navegador | Capacidad intencional del operador cuando está habilitada | ”Cualquier primitiva de evaluación JS es automáticamente una vulnerabilidad en este modelo de confianza” |
Shell ! de TUI local | Ejecución local activada explícitamente por el operador | ”El comando de conveniencia de shell local es inyección remota” |
| Emparejamiento de Node y comandos de Node | Ejecución remota de nivel operador en dispositivos emparejados | ”El control de dispositivos remotos debe tratarse como acceso de usuario no confiable de forma predeterminada” |
gateway.nodes.pairing.autoApproveCidrs | Política opt-in de inscripción de nodos en red de confianza | ”Una lista de permitidos deshabilitada de forma predeterminada es una vulnerabilidad de emparejamiento automática” |
No son vulnerabilidades por diseño
Hallazgos comunes cerrados sin acción
Hallazgos comunes cerrados sin acción
- Cadenas solo de inyección de prompt sin omisión de política, autenticación o sandbox.
- Afirmaciones que presuponen operación multiinquilino hostil en un host o configuración compartidos.
- Acceso normal del operador a rutas de lectura (por ejemplo
sessions.list/sessions.preview/chat.history) clasificado como IDOR en una configuración de Gateway compartido. - Hallazgos de despliegue solo en localhost (por ejemplo HSTS ausente en un Gateway solo local loopback).
- Hallazgos de firma de Webhook entrante de Discord para rutas entrantes que no existen en este repo.
- Metadatos de emparejamiento de Node tratados como una segunda capa oculta de aprobación por comando para
system.run; el límite real de ejecución es la política global de comandos de nodo del Gateway más las propias aprobaciones de exec del nodo. gateway.nodes.pairing.autoApproveCidrstratado como una vulnerabilidad por sí mismo. Está deshabilitado de forma predeterminada, requiere entradas CIDR/IP explícitas, solo se aplica al primer emparejamientorole: nodesin scopes solicitados y nunca aprueba automáticamente operador/navegador/Control UI, WebChat, actualizaciones de rol/scope, cambios de metadatos o clave pública, ni rutas de encabezado trusted-proxy de local loopback en el mismo host (incluso cuando la autenticación trusted-proxy de loopback está habilitada).- Hallazgos de “autorización por usuario ausente” que tratan
sessionKeycomo un token de autenticación.
Confianza de Gateway y nodo
Trata Gateway y nodo como un único dominio de confianza de operador con roles distintos:- Gateway: plano de control y superficie de políticas (
gateway.auth, política de herramientas, enrutamiento). - Node: superficie de ejecución remota emparejada con ese Gateway (comandos, acciones de dispositivo, capacidades locales del host).
- Un llamador autenticado ante el Gateway es de confianza en el alcance del Gateway; después del emparejamiento, las acciones de nodo son acciones de operador de confianza en ese nodo. Consulta Scopes de operador.
- Los clientes backend directos de loopback autenticados con el token/contraseña compartidos del Gateway pueden hacer RPC internas de plano de control sin presentar una identidad de dispositivo de usuario. Esto no es una omisión de emparejamiento remoto o del navegador: los clientes de red, clientes de nodo, clientes con token de dispositivo e identidades explícitas de dispositivo siguen pasando por la aplicación de emparejamiento y actualización de scope.
- Las aprobaciones de exec (lista de permitidos + preguntar) son barreras para la intención del operador, no aislamiento multiinquilino hostil. Vinculan el contexto exacto de la solicitud y operandos locales directos de archivo en modo de mejor esfuerzo; no modelan semánticamente cada ruta de cargador de runtime/intérprete. Usa sandboxing y aislamiento de host para límites sólidos.
- Valor predeterminado de operador único de confianza: exec de host en
gateway/nodeestá permitido sin solicitudes de aprobación (security="full",ask="off"). Es una UX intencional, no una vulnerabilidad por sí misma.
Modelo de amenazas
Tu asistente de IA puede ejecutar comandos de shell arbitrarios, leer/escribir archivos, acceder a servicios de red y enviar mensajes a cualquiera (si se le da acceso a canales). Las personas que le envían mensajes pueden intentar engañarlo para que haga cosas malas, aplicar ingeniería social para acceder a tus datos o sondear detalles de infraestructura. La mayoría de los fallos aquí no son exploits exóticos: son “alguien envió un mensaje al bot y el bot hizo lo que le pidieron”. La postura de OpenClaw, en orden:- Identidad primero - decide quién puede hablar con el bot (emparejamiento de DM / listas de permitidos / “abierto” explícito).
- Alcance después - decide dónde puede actuar el bot (listas de permitidos de grupos + requisito de mención, herramientas, sandboxing, permisos de dispositivo).
- Modelo al final - asume que el modelo puede ser manipulado; diseña para que la manipulación tenga un radio de impacto limitado.
Acceso por DM: emparejamiento, lista de permitidos, abierto, deshabilitado
Cada canal compatible con DM admitedmPolicy (o *.dm.policy), que bloquea los DM entrantes antes de que se procese el mensaje:
| Política | Comportamiento |
|---|---|
pairing | Predeterminado. Los remitentes desconocidos reciben un código de emparejamiento; el bot los ignora hasta que se aprueben. Los códigos caducan después de 1 hora; los DM repetidos no reenvían un código hasta que se crea una nueva solicitud. Las solicitudes pendientes tienen un límite de 3 por canal. |
allowlist | Los remitentes desconocidos quedan bloqueados, sin protocolo de emparejamiento. |
open | Cualquiera puede enviar DM (público). Requiere que la lista de permitidos del canal incluya "*" (activación explícita). |
disabled | Los DM entrantes se ignoran por completo. |
dmPolicy="open" y groupPolicy="open" como ajustes de último recurso; prefiere el emparejamiento + las listas de permitidos a menos que confíes plenamente en todos los miembros de la sala.
Listas de permitidos (dos capas)
- Lista de permitidos de DM (
allowFrom/channels.discord.allowFrom/channels.slack.allowFrom; heredado:channels.discord.dm.allowFrom,channels.slack.dm.allowFrom): quién puede enviar DM al bot. CuandodmPolicy="pairing", las aprobaciones se escriben en~/.openclaw/credentials/<channel>-allowFrom.json(cuenta predeterminada) o<channel>-<accountId>-allowFrom.json(cuentas no predeterminadas), combinadas con las listas de permitidos de la configuración. - Lista de permitidos de grupo (específica del canal): qué grupos/canales/gremios acepta el bot.
channels.whatsapp.groups,channels.telegram.groups,channels.imessage.groups: valores predeterminados por grupo comorequireMention; cuando se configuran, también actúan como una lista de permitidos de grupo (incluye"*"para mantener el comportamiento de permitir todo). Personaliza los activadores de mención conagents.list[].groupChat.mentionPatterns(por ejemplo["@openclaw", "@mybot"]) para querequireMentionse active con tus propios nombres de bot.groupPolicy="allowlist"+groupAllowFrom: restringe quién puede activar el bot dentro de una sesión de grupo (WhatsApp/Telegram/Signal/iMessage/Microsoft Teams).channels.discord.guilds/channels.slack.channels: listas de permitidos por superficie + valores predeterminados de mención.- Orden de comprobación:
groupPolicy/listas de permitidos de grupo primero, luego activación por mención/respuesta. Responder a un mensaje del bot (mención implícita) no omitegroupAllowFrom.
Aislamiento de sesiones de DM (modo multiusuario)
De forma predeterminada, OpenClaw enruta todos los DM a la sesión principal para mantener la continuidad entre dispositivos. Si varias personas pueden enviar DM al bot (DM abiertos o una lista de permitidos con varias personas), aísla las sesiones de DM:session.dmScope:
| Valor | Alcance |
|---|---|
main (config predeterminada) | Todos los DM comparten una sesión. |
per-channel-peer | Cada par canal+remitente obtiene un contexto de DM aislado (modo DM seguro). |
per-account-channel-peer | Igual que arriba, dividido además por cuenta (canales multicuentas). |
per-peer | Cada remitente obtiene una sesión en todos los canales del mismo tipo. |
session.dmScope: "per-channel-peer" cuando no está definido y conserva cualquier valor existente explícito.
Este es un límite de contexto de mensajería, no un límite de administrador del host. Si los usuarios son mutuamente adversarios y comparten el mismo host/configuración de Gateway, ejecuta gateways separados por límite de confianza.
Si la misma persona te contacta por varios canales, usa session.identityLinks para contraer esas sesiones de DM en una identidad canónica. Consulta Gestión de sesiones y Configuración.
Visibilidad de contexto frente a autorización de activación
Dos conceptos separados:- Autorización de activación: quién puede activar el agente (
dmPolicy,groupPolicy, listas de permitidos, puertas de mención). - Visibilidad de contexto: qué contexto suplementario llega al modelo (cuerpo de respuesta, texto citado, historial del hilo, metadatos reenviados).
contextVisibility controla lo segundo:
"all"(predeterminado): el contexto suplementario se conserva tal como se recibió."allowlist": el contexto suplementario se filtra a remitentes permitidos por las comprobaciones activas de listas de permitidos."allowlist_quote": comoallowlist, pero aún conserva una respuesta citada explícita.
contextVisibility, no omisiones de autenticación o sandbox por sí mismos; un informe con impacto de seguridad aún necesita demostrar una omisión de límite de confianza.
Inyección de prompts
Un atacante crea un mensaje que manipula el modelo para que realice una acción insegura (“ignora tus instrucciones”, “vuelca tu sistema de archivos”, “sigue este enlace y ejecuta comandos”). La inyección de prompts no se soluciona solo con barreras de prompt del sistema: esas son guías blandas; la aplicación estricta proviene de la política de herramientas, las aprobaciones de ejecución, el sandboxing y las listas de permitidos de canales (que los operadores aún pueden desactivar por diseño). La inyección de prompts no requiere DM públicos: incluso si solo tú puedes enviar mensajes al bot, cualquier contenido no confiable que lea (resultados de búsqueda/obtención web, páginas de navegador, correos electrónicos, documentos, adjuntos, registros/código pegados) puede contener instrucciones adversarias. El contenido en sí es una superficie de amenaza, no solo el remitente. Señales de alerta que debes tratar como no confiables:- “Lee este archivo/URL y haz exactamente lo que dice.”
- “Ignora tu prompt del sistema o las reglas de seguridad.”
- “Revela tus instrucciones ocultas o salidas de herramientas.”
- “Pega el contenido completo de ~/.openclaw o tus registros.”
- Mantén los DM entrantes bloqueados (emparejamiento/listas de permitidos); prefiere puertas de mención en grupos; evita bots siempre activos en salas públicas.
- Trata enlaces, adjuntos e instrucciones pegadas como hostiles de forma predeterminada.
- Ejecuta herramientas sensibles en un sandbox; mantén los secretos fuera del sistema de archivos alcanzable por el agente. El sandboxing es opt-in: si el modo sandbox está desactivado,
host=autoimplícito se resuelve al host del gateway, mientras quehost=sandboxexplícito todavía falla de forma cerrada (no hay runtime de sandbox disponible). Configurahost=gatewaypara hacer explícito ese comportamiento en la configuración. - Limita las herramientas de alto riesgo (
exec,browser,web_fetch,web_search) a agentes confiables o listas de permitidos explícitas. - Si permites intérpretes (
python,node,ruby,perl,php,lua,osascript), habilitatools.exec.strictInlineEvalpara que las formas de evaluación inline (-c,-ey similares) sigan necesitando aprobación explícita. En modo de lista de permitidos, cualquier segmento heredoc (<<) siempre requiere revisor o aprobación explícita, independientemente de las comillas: un comando en la lista de permitidos no puede usar un cuerpo heredoc para omitir la revisión de la lista de permitidos. - Reduce el radio de impacto usando un agente lector de solo lectura o con herramientas deshabilitadas para resumir contenido no confiable y luego pasa el resumen a tu agente principal.
- Mantén
web_search/web_fetch/browserdesactivados para agentes con herramientas habilitadas salvo que sean necesarios. - Para entradas de URL de OpenResponses (
input_file/input_image), configura unagateway.http.endpoints.responses.files.urlAllowlist/images.urlAllowlistestricta y manténmaxUrlPartsbajo (las listas de permitidos vacías cuentan como no definidas). Usafiles.allowUrl: false/images.allowUrl: falsepara desactivar por completo la obtención de URL. - Mantén los secretos fuera de los prompts; pásalos mediante env/config en el host del gateway.
- Usa el modelo de última generación y mejor nivel para cualquier bot que pueda ejecutar herramientas o tocar archivos/redes.
- No uses niveles más antiguos/débiles/pequeños para agentes con herramientas habilitadas o bandejas de entrada no confiables.
- Si debes usar un modelo más pequeño, reduce el radio de impacto: herramientas de solo lectura, sandboxing fuerte, acceso mínimo al sistema de archivos, listas de permitidos estrictas. Habilita sandboxing para todas las sesiones y desactiva
web_search/web_fetch/browsersalvo que las entradas estén estrictamente controladas. - Para asistentes personales solo de chat con entrada confiable y sin herramientas, los modelos más pequeños suelen estar bien.
Contenido externo y envoltura de entradas no confiables
El textoinput_file de OpenResponses se inyecta igualmente como contenido externo no confiable aunque el Gateway lo decodifique localmente: el bloque lleva marcadores de límite <<<EXTERNAL_UNTRUSTED_CONTENT ...>>> más metadatos Source: External (esta ruta omite el banner más largo SECURITY NOTICE: usado en otros lugares). La misma envoltura basada en marcadores se aplica cuando la comprensión de medios extrae texto de documentos adjuntos antes de anexarlo al prompt de medios.
OpenClaw también elimina literales comunes de tokens especiales de plantillas de chat de LLM autoalojados (Qwen/ChatML, Llama, Gemma, Mistral, Phi, tokens de rol/turno GPT-OSS) del contenido externo envuelto y los metadatos antes de que lleguen al modelo. Los backends autoalojados compatibles con OpenAI (vLLM, SGLang, TGI, LM Studio, pilas de tokenizadores personalizados de Hugging Face) a veces tokenizan cadenas literales como <|im_start|> o <|start_header_id|> como tokens estructurales de plantillas de chat dentro del contenido del usuario; sin esta sanitización, el texto no confiable de una página obtenida, el cuerpo de un correo electrónico o la salida de una herramienta de contenido de archivos podría falsificar un límite sintético de rol assistant/system. La sanitización ocurre en la capa de envoltura de contenido externo, por lo que se aplica de manera uniforme en herramientas de obtención/lectura y contenido entrante de canales. Los proveedores alojados (OpenAI, Anthropic) ya aplican su propia sanitización del lado de la solicitud; mantén habilitada la envoltura de contenido externo y prefiere ajustes de backend que dividan/escapen tokens especiales cuando estén disponibles.
Las respuestas salientes del modelo tienen un sanitizador separado que elimina <tool_call>, <function_calls>, <system-reminder>, <previous_response> y andamiaje interno similar filtrado de las respuestas visibles para el usuario en el límite final de entrega del canal.
Esto no reemplaza dmPolicy, las listas de permitidos, las aprobaciones de ejecución, el sandboxing ni contextVisibility: cierra una omisión específica de la capa de tokenizador.
Banderas de omisión (mantener desactivadas en producción)
hooks.mappings[].allowUnsafeExternalContenthooks.gmail.allowUnsafeExternalContent- Campo de payload de Cron
allowUnsafeExternalContent
tools.profile: "messaging" o más estricta), además de sandboxing cuando sea posible.
Razonamiento y salida detallada en grupos
/reasoning, /verbose y /trace pueden exponer razonamiento interno, salida de herramientas o diagnósticos de plugins que no están pensados para un canal público; pueden incluir argumentos de herramientas, URLs, diagnósticos de plugins y datos que vio el modelo. Mantenlos deshabilitados en salas públicas; habilítalos solo en DMs de confianza o salas estrictamente controladas.
Autorización de comandos
Los comandos slash y las directivas solo se respetan para remitentes autorizados, derivados de las listas de permisos/emparejamiento del canal máscommands.useAccessGroups (consulta Configuración y Comandos slash). Si una lista de permisos de canal está vacía o incluye "*", los comandos quedan efectivamente abiertos para ese canal.
/exec es una comodidad solo de sesión para operadores autorizados; no escribe configuración ni cambia otras sesiones.
Herramientas del plano de control
Dos herramientas integradas pueden hacer cambios persistentes:gatewayinspecciona la configuración conconfig.schema.lookup/config.get, y la muta conconfig.apply,config.patchyupdate.run.croncrea trabajos programados que siguen ejecutándose después de que termina el chat/tarea original.
gateway config.apply/config.patch fallan cerradas por defecto: solo una lista de permisos estrecha de ajustes de bajo riesgo del runtime del agente (agents.defaults.thinkingDefault, campos por agente de modelo/thinking/reasoning/fast-mode), control de menciones (channels.*.requireMention en varias profundidades de anidación) y ajustes de respuestas visibles (messages.visibleReplies, messages.groupChat.visibleReplies, messages.groupChat.unmentionedInbound) puede ser ajustada por agentes. Cualquier otra ruta de configuración cambiada se rechaza. Los valores predeterminados globales de modelo y las superposiciones de prompts permanecen controlados por el operador, y los nuevos árboles de configuración sensibles quedan protegidos salvo que se agreguen deliberadamente a esa lista de permisos. La herramienta sigue negándose a reescribir tools.exec.ask o tools.exec.security; los alias heredados tools.bash.* se normalizan a la ruta equivalente tools.exec.* antes de comprobar la escritura.
Para cualquier agente/superficie que maneje contenido no confiable, deniega estos por defecto:
commands.restart=false solo bloquea acciones de reinicio; no deshabilita las acciones de configuración/actualización de gateway.
Ejecución en Node (system.run)
Si un nodo macOS está emparejado, el Gateway puede invocar system.run en él; esto es ejecución remota de código en ese Mac.
- Requiere emparejamiento del nodo (aprobación + token). El emparejamiento establece la identidad/confianza del nodo y la emisión de tokens; no es una superficie de aprobación por comando.
- El Gateway aplica una política global gruesa de comandos de nodo mediante
gateway.nodes.allowCommands/denyCommands.denyCommandscoincide solo con nombres exactos de comandos de nodo (por ejemplosystem.run), no con texto de shell dentro de la carga de un comando; un nodo que se reconecta anunciando una lista de comandos distinta no es, por sí mismo, una vulnerabilidad si la política global del gateway y las aprobaciones de exec propias del nodo siguen aplicando el límite. - La política por nodo de
system.runes el propio archivo de aprobaciones de exec del nodo (exec.approvals.node.*), controlado en el Mac mediante Settings -> Exec approvals (security + ask + allowlist); puede ser más estricta o más laxa que la política global de ID de comando del gateway. - Un nodo que se ejecuta con
security="full"yask="off"sigue el modelo predeterminado de operador de confianza: comportamiento esperado, no un bug, salvo que tu despliegue necesite una postura más estricta. - El modo de aprobación vincula el contexto exacto de la solicitud y, cuando es posible, un operando concreto de script/archivo local. Si OpenClaw no puede identificar exactamente un archivo local directo para un comando de intérprete/runtime, la ejecución respaldada por aprobación se deniega en vez de prometer cobertura semántica completa.
- Para
host=node, las ejecuciones respaldadas por aprobación también almacenan unsystemRunPlanpreparado canónico; los reenvíos aprobados posteriores reutilizan ese plan almacenado, y la validación del gateway rechaza ediciones del llamador al contexto de comando/cwd/sesión después de creada la solicitud de aprobación. - Para deshabilitar por completo la ejecución remota: establece security en
denyy elimina el emparejamiento de nodo para ese Mac.
Skills dinámicas (watcher / nodos remotos)
OpenClaw puede actualizar la lista de skills a mitad de sesión: el watcher de skills actualiza la instantánea en el siguiente turno del agente cuando cambiaSKILL.md, y conectar un nodo macOS puede hacer que skills solo de macOS sean elegibles (según sondeo de binarios). Trata las carpetas de skills como código de confianza y restringe quién puede modificarlas.
Plugins
Los plugins se ejecutan dentro del proceso con el Gateway; trátalos como código de confianza.- Instala solo desde fuentes en las que confíes; prefiere listas de permisos explícitas
plugins.allow; revisa la configuración del plugin antes de habilitarlo; reinicia el Gateway después de cambios de plugins. - Instalar/actualizar (
openclaw plugins install <package>,openclaw plugins update <id>) ejecuta código no confiable:- La ruta de instalación es el directorio por plugin bajo la raíz activa de instalación de plugins.
- OpenClaw no ejecuta bloqueo local integrado de código peligroso durante la instalación/actualización. Usa
security.installPolicypara decisiones locales de permitir/bloquear propiedad del operador yopenclaw security audit --deeppara escaneo diagnóstico. - Las instalaciones de plugins por npm y git ejecutan convergencia de dependencias del gestor de paquetes solo durante el flujo explícito de instalación/actualización. Las rutas locales y los archivos comprimidos se tratan como paquetes autocontenidos; OpenClaw los copia/referencia sin ejecutar
npm install. - Prefiere versiones exactas fijadas (
@scope/pkg@1.2.3) e inspecciona el código desempaquetado antes de habilitarlo. --dangerously-force-unsafe-installestá obsoleto y ya no cambia el comportamiento de instalación/actualización.security.installPolicypermite a los operadores ejecutar un comando local de confianza para tomar decisiones de permitir/bloquear específicas del host para instalaciones de skills y plugins. Se ejecuta después de preparar el material fuente pero antes de que continúe la instalación, también se aplica a skills de ClawHub y no se omite mediante flags inseguros obsoletos.
Sandboxing
Documento dedicado: Sandboxing Dos enfoques complementarios:- Gateway completo en Docker (límite de contenedor): Docker
- Sandbox de herramientas (
agents.defaults.sandbox; gateway host + herramientas aisladas por sandbox; Docker es el backend predeterminado): Sandboxing
Para evitar el acceso entre agentes, mantén
agents.defaults.sandbox.scope en "agent" (predeterminado) o usa "session" para un aislamiento por sesión más estricto. scope: "shared" usa un único contenedor o espacio de trabajo.agents.defaults.sandbox.workspaceAccess):
"none"(predeterminado): las herramientas ven un espacio de trabajo de sandbox bajo~/.openclaw/sandboxes; el espacio de trabajo del agente queda fuera de límites."ro": monta el espacio de trabajo del agente en modo solo lectura en/agent(deshabilitawrite/edit/apply_patch)."rw": monta el espacio de trabajo del agente en lectura/escritura en/workspace.
sandbox.docker.binds adicionales se validan contra rutas fuente normalizadas y canonicalizadas. Una lista de denegación de rutas bloqueadas cubre /etc, /private/etc, /proc, /sys, /dev, /root, /boot y directorios que comúnmente contienen o aliasan el socket de Docker (/run, /var/run y docker.sock bajo ellos), además de subrutas de credenciales en HOME (.aws, .cargo, .config, .docker, .gnupg, .netrc, .npm, .ssh). Los trucos de enlaces simbólicos de directorios padre y los alias canónicos de home se resuelven mediante ancestros existentes y se vuelven a comprobar, por lo que siguen fallando cerrados si se resuelven dentro de una raíz bloqueada.
Barrera de seguridad para delegación de subagentes
Si permites herramientas de sesión, trata las ejecuciones delegadas de subagentes como otra decisión de límite:- Deniega
sessions_spawnsalvo que el agente realmente necesite delegación. - Mantén
agents.defaults.subagents.allowAgentsy cualquier anulación por agenteagents.list[].subagents.allowAgentsrestringidas a agentes destino conocidos como seguros. - Para flujos de trabajo que deben permanecer en sandbox, llama a
sessions_spawnconsandbox: "require"(el valor predeterminado es"inherit");"require"falla rápido cuando el runtime hijo de destino no está en sandbox.
Modo solo lectura
Construye un perfil de solo lectura combinandoagents.defaults.sandbox.workspaceAccess: "ro" (o "none" para no tener acceso al espacio de trabajo) con listas de permitir/denegar herramientas que bloqueen write, edit, apply_patch, exec, process, etc.
tools.exec.applyPatch.workspaceOnly: true(predeterminado): evita queapply_patchescriba/elimine fuera del directorio del espacio de trabajo incluso con el sandbox desactivado. Establecefalsesolo si quieres intencionalmente queapply_patchtoque archivos fuera del espacio de trabajo.tools.fs.workspaceOnly: true(opcional): restringe las rutas deread/write/edit/apply_patchy las rutas nativas de carga automática de imágenes de prompt al directorio del espacio de trabajo.- Mantén estrechas las raíces del sistema de archivos; evita raíces amplias como tu directorio home para espacios de trabajo de agentes/sandbox, que pueden exponer archivos locales sensibles (por ejemplo estado/configuración bajo
~/.openclaw) a herramientas del sistema de archivos.
Perfiles de acceso por agente (multiagente)
Cada agente puede tener su propia política de sandbox + herramientas: acceso completo, solo lectura o sin acceso. Consulta Sandbox y herramientas multiagente para las reglas de precedencia. Patrones comunes: agente personal (acceso completo, sin sandbox), agente de familia/trabajo (en sandbox + herramientas de solo lectura), agente público (en sandbox + sin herramientas de sistema de archivos/shell).Acceso completo (sin sandbox)
Herramientas de solo lectura + espacio de trabajo de solo lectura
Sin acceso al sistema de archivos/shell (mensajería de proveedor permitida)
Riesgos del control del navegador
Habilitar el control del navegador da al modelo un navegador real. Si ese perfil ya tiene sesiones iniciadas, el modelo puede acceder a esas cuentas y datos; trata los perfiles de navegador como estado sensible.- Prefiere un perfil dedicado para el agente (el perfil
openclawpredeterminado); evita tu perfil personal de uso diario. - Mantén el control del navegador del host desactivado para agentes aislados en sandbox, salvo que confíes en ellos.
- La API independiente de control del navegador por loopback solo acepta autenticación con secreto compartido (autenticación bearer con token del gateway o contraseña del gateway); no consume encabezados de identidad de trusted-proxy ni de Tailscale Serve.
- Trata las descargas del navegador como entrada no confiable; prefiere un directorio de descargas aislado.
- Desactiva la sincronización del navegador y los gestores de contraseñas en el perfil del agente si es posible.
- Para gateways remotos, “control del navegador” equivale a “acceso de operador” a todo lo que ese perfil pueda alcanzar.
- Mantén los hosts de Gateway y Node solo en la tailnet; evita exponer los puertos de control del navegador a la LAN o a internet público.
- Desactiva el enrutamiento por proxy del navegador cuando no sea necesario (
gateway.nodes.browser.mode="off"). - El modo de sesión existente de Chrome MCP no es “más seguro”; puede actuar como tú en todo lo que ese perfil de Chrome del host pueda alcanzar.
- Ejecuta un host de Node en la máquina del navegador y deja que el Gateway proxifique las acciones del navegador cuando el Gateway esté remoto respecto del navegador (consulta Herramienta de navegador); trata el emparejamiento de Node como acceso administrativo, mantén el Gateway y el host de Node en la misma tailnet y evita exponer puertos de relay/control por LAN, internet público o Tailscale Funnel.
Política SSRF del navegador (estricta de forma predeterminada)
Los destinos privados/internos permanecen bloqueados salvo que optes explícitamente por permitirlos.- Predeterminado:
browser.ssrfPolicy.dangerouslyAllowPrivateNetworksin definir, por lo que los destinos privados/internos/de uso especial permanecen bloqueados. El alias heredadoallowPrivateNetworkaún se acepta. - Opt-in: configura
dangerouslyAllowPrivateNetwork: truepara permitir esos destinos. - En modo estricto, usa
hostnameAllowlist(patrones como*.example.com) yallowedHostnames(excepciones exactas de host, incluidos nombres bloqueados de otro modo comolocalhost) para excepciones explícitas. - La navegación se comprueba antes de la solicitud y se vuelve a comprobar con el mejor esfuerzo en la URL
http(s)final después de la navegación, para reducir pivotes basados en redirecciones.
Exposición de red
Bind, puerto, firewall
El Gateway multiplexa WebSocket + HTTP en un puerto (predeterminado18789; configuración/flags/env: gateway.port, --port, OPENCLAW_GATEWAY_PORT). Esa superficie HTTP incluye la Control UI (recursos de SPA, ruta base predeterminada /) y el host del lienzo (/__openclaw__/canvas y /__openclaw__/a2ui - HTML/JS arbitrario; trátalo como contenido no confiable cuando se cargue en un navegador normal; no lo expongas a redes/usuarios no confiables ni compartas un origen con superficies web privilegiadas).
gateway.bind controla dónde escucha el Gateway:
"loopback"(predeterminado): solo los clientes locales pueden conectarse."lan","tailnet","custom": amplían la superficie de ataque. Úsalos solo con autenticación del gateway (token/contraseña compartidos, o un proxy confiable correctamente configurado) y un firewall real.
0.0.0.0.
Publicación de puertos Docker con UFW
Los puertos de contenedor publicados (-p HOST:CONTAINER o ports: de Compose) se enrutan por las cadenas de reenvío de Docker, no solo por las reglas INPUT del host. Aplica reglas en DOCKER-USER (evaluadas antes de las reglas accept propias de Docker); la mayoría de las distribuciones modernas usan el frontend iptables-nft, que aun así aplica estas reglas al backend nftables.
/etc/ufw/after6.rules si Docker IPv6 está habilitado. Evita codificar nombres de interfaz (eth0) porque varían entre imágenes VPS (ens3, enp*, etc.) y una discrepancia puede omitir silenciosamente tu regla de denegación.
Descubrimiento mDNS/Bonjour
Cuando el pluginbonjour incluido está habilitado, el Gateway anuncia presencia mediante mDNS (_openclaw-gw._tcp, puerto 5353) para el descubrimiento de dispositivos locales. El modo completo incluye registros TXT que exponen detalles operativos: cliPath (ruta del sistema de archivos que revela el nombre de usuario y la ubicación de instalación), sshPort (anuncia disponibilidad de SSH), displayName/lanHost (información de hostname). Anunciar detalles de infraestructura facilita el reconocimiento de LAN.
- Mantén Bonjour desactivado salvo que se necesite descubrimiento en LAN; se inicia automáticamente en hosts macOS y es opt-in en otros entornos; las URL directas del Gateway, Tailnet, SSH o DNS-SD de área amplia evitan la multidifusión local.
-
Modo mínimo (predeterminado cuando Bonjour está habilitado, recomendado para gateways expuestos) omite campos sensibles:
-
Desactivado suprime el descubrimiento local mientras mantiene habilitado el plugin:
-
Modo completo (opt-in) incluye
cliPath+sshPort: -
O configura
OPENCLAW_DISABLE_BONJOUR=1para desactivar mDNS sin cambios de configuración.
role, gatewayPort, transport, pero omite cliPath/sshPort; las apps que necesiten la ruta de la CLI pueden obtenerla mediante la conexión WebSocket autenticada.
Autenticación WebSocket del Gateway
La autenticación del Gateway es obligatoria de forma predeterminada: sin una ruta de autenticación válida configurada, el Gateway rechaza conexiones WebSocket (fail-closed). El onboarding genera un token de forma predeterminada (incluso para loopback), por lo que los clientes locales deben autenticarse.openclaw doctor --generate-gateway-token puede generar uno por ti.
gateway.remote.token y gateway.remote.password son fuentes de credenciales de cliente; no protegen por sí mismas el acceso WS local. Las rutas de llamada locales usan gateway.remote.* solo como fallback cuando gateway.auth.* no está definido. Si gateway.auth.token o gateway.auth.password se configuran explícitamente mediante SecretRef y no se resuelven, la resolución falla de forma cerrada (sin enmascaramiento por remote-fallback).gateway.remote.tlsFingerprint al usar wss://. ws:// en texto claro se acepta para loopback, literales de IP privada, .local y URL de gateway Tailnet *.ts.net; para otros nombres private-DNS confiables, configura OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 en el proceso cliente como mecanismo de emergencia (solo entorno del proceso, no una clave de openclaw.json). El emparejamiento móvil y las rutas de gateway manuales/escaneadas de Android son más estrictas: texto claro solo para loopback, mientras que LAN privada, link-local, .local y hostnames sin punto deben usar TLS salvo que optes explícitamente por la ruta de texto claro para red privada confiable.
El emparejamiento de dispositivos se aprueba automáticamente para conexiones directas de local loopback (más una ruta estrecha de autoconexión backend/container-local para flujos auxiliares confiables con secreto compartido); las conexiones Tailnet y LAN, incluidos binds tailnet del mismo host, se tratan como remotas y aun así necesitan aprobación. La evidencia de encabezados reenviados en una solicitud loopback descalifica la localidad loopback; la autoaprobación por actualización de metadatos tiene un alcance estrecho. Consulta Emparejamiento del Gateway.
Modos de autenticación:
"token": token bearer compartido (recomendado para la mayoría de configuraciones)."password": prefiere configurarlo medianteOPENCLAW_GATEWAY_PASSWORD."trusted-proxy": confía en un proxy inverso con conciencia de identidad para autenticar usuarios y pasar identidad mediante encabezados. Consulta Autenticación con proxy confiable.
gateway.auth.token o OPENCLAW_GATEWAY_PASSWORD); reinicia el Gateway (o la app macOS si supervisa el Gateway); actualiza los clientes remotos (gateway.remote.token/.password); verifica que las credenciales antiguas ya no funcionen.
Encabezados de identidad de Tailscale Serve
Cuandogateway.auth.allowTailscale es true (predeterminado para Serve), OpenClaw acepta el encabezado de identidad de Tailscale Serve tailscale-user-login para autenticación de Control UI/WebSocket. Verifica la identidad resolviendo la dirección x-forwarded-for mediante el daemon local de Tailscale (tailscale whois) y comparándola con el encabezado; esto solo se activa para solicitudes loopback que lleven x-forwarded-for, x-forwarded-proto y x-forwarded-host tal como los inyecta Tailscale. Para esta comprobación asíncrona, los intentos fallidos para el mismo {scope, ip} se serializan antes de que el limitador registre el fallo, por lo que reintentos incorrectos concurrentes desde un cliente Serve pueden bloquear el segundo intento inmediatamente.
Los endpoints de API HTTP (/v1/*, /tools/invoke, /api/channels/*) no usan autenticación por encabezado de identidad de Tailscale; siguen el modo de autenticación HTTP configurado del gateway.
La autenticación bearer HTTP del Gateway es, en la práctica, acceso de operador todo o nada. Las credenciales que pueden llamar a /v1/chat/completions, /v1/responses, rutas de plugin como /api/v1/admin/rpc o /api/channels/* son secretos de operador con acceso completo para ese gateway: la autenticación bearer con secreto compartido restaura todos los alcances de operador predeterminados (operator.admin, operator.approvals, operator.pairing, operator.read, operator.talk.secrets, operator.write) y la semántica de propietario para turnos de agente, y valores x-openclaw-scopes más estrechos no reducen esa ruta de secreto compartido. La semántica de alcance por solicitud solo se aplica cuando la solicitud proviene de un modo con identidad (autenticación trusted proxy) o de un ingreso privado explícitamente sin autenticación; en esos modos, omitir x-openclaw-scopes recurre al conjunto normal de alcances predeterminados de operador, y los encabezados de nivel propietario como x-openclaw-model requieren operator.admin cuando los alcances se estrechan. /tools/invoke y los endpoints HTTP de historial de sesión siguen la misma regla de secreto compartido. No compartas estas credenciales con llamadores no confiables; prefiere gateways separados por límite de confianza.
La autenticación Serve sin token asume que el propio host del gateway es confiable; no es protección contra procesos hostiles en el mismo host. Si puede ejecutarse código local no confiable en el host del gateway, desactiva allowTailscale y exige autenticación explícita con secreto compartido (token o password).
No reenvíes estos encabezados desde tu propio proxy inverso. Si terminas TLS o haces proxy delante del gateway, desactiva allowTailscale y usa autenticación con secreto compartido o Autenticación con proxy confiable en su lugar.
Consulta Tailscale y Descripción general de la web.
Configuración de proxy inverso
Configuragateway.trustedProxies para gestionar correctamente la IP de cliente reenviada detrás de nginx/Caddy/Traefik/etc. Cuando el Gateway detecta encabezados de proxy desde una dirección no incluida en trustedProxies, no tratará la conexión como local; si la autenticación del gateway está desactivada, esa conexión se rechaza. Esto impide que las conexiones proxificadas parezcan venir de localhost y reciban confianza automática.
trustedProxies también alimenta gateway.auth.mode: "trusted-proxy", que es más estricto: falla de forma cerrada con proxies de origen loopback de forma predeterminada. Los proxies inversos loopback del mismo host pueden usar trustedProxies para la detección de cliente local y la gestión de IP reenviada, pero solo pueden satisfacer el modo de autenticación trusted-proxy cuando gateway.auth.trustedProxy.allowLoopback = true; de lo contrario, usa autenticación token/contraseña.
trustedProxies está configurado, el Gateway usa X-Forwarded-For para determinar la IP del cliente; X-Real-IP se ignora a menos que gateway.allowRealIpFallback: true se configure explícitamente. Asegúrate de que tu proxy sobrescriba X-Forwarded-For/X-Real-IP en lugar de anexarles valores:
gateway.nodes.pairing.autoApproveCidrs es una política de operador separada y deshabilitada de forma predeterminada, y las rutas de encabezado de proxy de confianza con origen en loopback siguen excluidas de la aprobación automática de nodos incluso cuando la autenticación de proxy de confianza por loopback está habilitada (porque los llamadores locales pueden falsificar esos encabezados).
Notas sobre HSTS y origen
- El Gateway de OpenClaw prioriza local/loopback. Si terminas TLS en un proxy inverso, configura HSTS allí.
- Si el propio Gateway termina HTTPS,
gateway.http.securityHeaders.strictTransportSecurityemite el encabezado HSTS desde las respuestas de OpenClaw. - Las implementaciones no loopback de la Control UI requieren
gateway.controlUi.allowedOriginsde forma predeterminada;allowedOrigins: ["*"]es una política explícita de permitir todo, no un valor predeterminado endurecido: evítala fuera de pruebas locales estrictamente controladas. - Los errores de autenticación por origen de navegador en loopback siguen sujetos a límite de tasa incluso con la exención general de loopback habilitada, pero la clave de bloqueo se limita por cada valor
Originnormalizado en lugar de un único bucket compartido de localhost. gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=truehabilita el modo de fallback de origen por encabezado Host; trátalo como una política peligrosa seleccionada por el operador.- Trata el DNS rebinding y el comportamiento del encabezado host del proxy como preocupaciones de endurecimiento de implementación; mantén
trustedProxiesestricto y evita exponer el Gateway directamente a internet público. - Guía detallada de implementación: Autenticación por proxy de confianza.
Control UI por HTTP
La Control UI necesita un contexto seguro (HTTPS o localhost) para generar la identidad del dispositivo.gateway.controlUi.allowInsecureAuth: alternador de compatibilidad local. En localhost, permite autenticación de Control UI sin identidad de dispositivo cuando la página carga por HTTP no seguro. No omite las comprobaciones de emparejamiento y no relaja los requisitos de identidad de dispositivo remoto (no localhost). Prefiere HTTPS (Tailscale Serve) o abre la UI en127.0.0.1.gateway.controlUi.dangerouslyDisableDeviceAuth: solo para emergencias, deshabilita por completo las comprobaciones de identidad de dispositivo. Degradación de seguridad severa; mantenlo desactivado salvo que estés depurando activamente y puedas revertirlo rápido.- Aparte de esas banderas, un
gateway.auth.mode: "trusted-proxy"exitoso puede admitir sesiones operator de Control UI sin identidad de dispositivo: un comportamiento intencional del modo de autenticación, no un atajo deallowInsecureAuth, y no se extiende a sesiones de Control UI con rol de nodo.
openclaw security audit advierte cuando allowInsecureAuth está habilitado.
Banderas inseguras/peligrosas
openclaw security audit genera config.insecure_or_dangerous_flags por cada interruptor de depuración inseguro/peligroso conocido que esté habilitado (un hallazgo por bandera). Mantén estos valores sin configurar en producción. Si las supresiones de auditoría están configuradas, security.audit.suppressions.active permanece en la salida activa incluso cuando los hallazgos coincidentes pasan a suppressedFindings.
Flags tracked by the audit today
Flags tracked by the audit today
gateway.controlUi.allowInsecureAuth=truegateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=truegateway.controlUi.dangerouslyDisableDeviceAuth=truesecurity.audit.suppressions configured (<count>)hooks.gmail.allowUnsafeExternalContent=truehooks.mappings[<index>].allowUnsafeExternalContent=truetools.exec.applyPatch.workspaceOnly=falseplugins.entries.acpx.config.permissionMode=approve-all
All dangerous*/dangerously* keys in the config schema
All dangerous*/dangerously* keys in the config schema
Control UI y navegador:
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallbackgateway.controlUi.dangerouslyDisableDeviceAuthbrowser.ssrfPolicy.dangerouslyAllowPrivateNetwork
accounts.<accountId> cuando aplique):channels.discord.dangerouslyAllowNameMatchingchannels.googlechat.dangerouslyAllowNameMatchingchannels.msteams.dangerouslyAllowNameMatchingchannels.slack.dangerouslyAllowNameMatchingchannels.irc.dangerouslyAllowNameMatching(canal de plugin)channels.mattermost.dangerouslyAllowNameMatching(canal de plugin)channels.synology-chat.dangerouslyAllowNameMatching(canal de plugin)channels.synology-chat.dangerouslyAllowInheritedWebhookPath(canal de plugin)channels.zalouser.dangerouslyAllowNameMatching(canal de plugin)
channels.telegram.network.dangerouslyAllowPrivateNetwork(también por cuenta)
agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargetsagents.defaults.sandbox.docker.dangerouslyAllowExternalBindSourcesagents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin
Implementación y confianza del host
- Cifrado de disco completo en el host del Gateway; prefiere una cuenta de usuario del sistema operativo dedicada para el Gateway si el host es compartido.
- Bloqueo de dependencias de paquetes publicados: los checkouts de código fuente usan
pnpm-lock.yaml; el paquete npm publicadoopenclawy los paquetes npm de plugin propiedad de OpenClaw incluyennpm-shrinkwrap.jsonpara que las instalaciones usen el grafo de dependencias transitivas revisado de la versión en lugar de resolver un grafo nuevo durante la instalación. Esto es un límite de endurecimiento de cadena de suministro y reproducibilidad de versiones, no un sandbox; consulta npm shrinkwrap. - Operaciones de archivos seguras: OpenClaw usa
@openclaw/fs-safepara acceso a archivos limitado por raíz, escrituras atómicas, extracción de archivos, espacios de trabajo temporales y helpers de archivos secretos. El helper POSIX opcional en Python está desactivado de forma predeterminada; configuraOPENCLAW_FS_SAFE_PYTHON_MODE=autoorequiresolo cuando quieras el endurecimiento adicional de mutación relativa a fd y puedas admitir un runtime de Python. Detalles: Operaciones de archivos seguras. - Riesgo de espacio de trabajo compartido en Slack: si todos en Slack pueden enviar mensajes al bot, el riesgo central es la autoridad delegada de herramientas: cualquier remitente permitido puede inducir llamadas a herramientas (
exec, navegador, herramientas de red/archivo) dentro de la política del agente, la inyección de prompts/contenido de un remitente puede afectar estado/dispositivos/salidas compartidos, y si el agente compartido tiene credenciales/archivos sensibles, cualquier remitente permitido puede potencialmente provocar exfiltración mediante el uso de herramientas. Usa agentes/Gateways separados con herramientas mínimas para flujos de trabajo de equipo; mantén privados los agentes con datos personales. - Agente compartido por la empresa (patrón aceptable): está bien cuando todos los que usan el agente están en el mismo límite de confianza (por ejemplo, un equipo de una empresa) y el agente tiene un alcance estrictamente empresarial. Ejecútalo en una máquina/VM/contenedor dedicado, usa un usuario del sistema operativo dedicado + navegador/perfil/cuentas dedicados, y no inicies sesión en ese runtime con cuentas personales de Apple/Google ni con perfiles personales de gestor de contraseñas/navegador. Mezclar identidades personales y de empresa en el mismo runtime elimina la separación y aumenta el riesgo de exposición de datos personales.
Secretos en disco
Asume que cualquier cosa bajo~/.openclaw/ (o $OPENCLAW_STATE_DIR/) puede contener secretos o datos privados:
| Ruta | Contenido |
|---|---|
openclaw.json | La configuración puede incluir tokens (Gateway, Gateway remoto), ajustes de proveedores y listas de permitidos. |
credentials/** | Credenciales de canales (por ejemplo, credenciales de WhatsApp), listas de permitidos de emparejamiento, importaciones OAuth heredadas. |
agents/<agentId>/agent/auth-profiles.json | Claves de API, perfiles de tokens, tokens OAuth, keyRef/tokenRef opcionales. |
agents/<agentId>/agent/codex-home/** | Cuenta, configuración, Skills, Plugins, estado nativo de hilos y diagnósticos del servidor de aplicaciones Codex por agente (predeterminado). |
$CODEX_HOME/** o ~/.codex/** | Estado compartido opcional del runtime de Codex, solo cuando plugins.entries.codex.config.appServer.homeScope es "user". Usa la cuenta, configuración, Plugins y almacén de hilos nativos de Codex; actívalo solo para un Gateway local controlado por el propietario. Consulta harness de Codex. |
secrets.json (opcional) | Carga útil secreta respaldada por archivo usada por proveedores SecretRef de file (secrets.providers). |
agents/<agentId>/agent/auth.json | Archivo de compatibilidad heredado; las entradas estáticas api_key se eliminan al descubrirse. |
agents/<agentId>/sessions/** | Transcripciones de sesión (*.jsonl) + metadatos de enrutamiento (sessions.json) que pueden contener mensajes privados y salida de herramientas. |
| paquetes de Plugin incluidos | Plugins instalados (más sus node_modules/). |
sandboxes/** | Espacios de trabajo de sandbox de herramientas; pueden acumular copias de archivos leídos/escritos dentro del sandbox. |
Mapa de almacenamiento de credenciales
También útil para decisiones de respaldo:- WhatsApp:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - Token de bot de Telegram: configuración/env o
channels.telegram.tokenFile(solo archivo normal; se rechazan symlinks) - Token de bot de Discord: configuración/env o SecretRef (proveedores env/file/exec)
- Tokens de Slack: configuración/env (
channels.slack.*) - Listas de permitidos de emparejamiento:
~/.openclaw/credentials/<channel>-allowFrom.json(cuenta predeterminada) /<channel>-<accountId>-allowFrom.json(cuentas no predeterminadas) - Perfiles de autenticación de modelos:
~/.openclaw/agents/<agentId>/agent/auth-profiles.json - Importación OAuth heredada:
~/.openclaw/credentials/oauth.json
700 en directorios, 600 en archivos); usa cifrado de disco completo en el host del Gateway; prefiere una cuenta de usuario de SO dedicada si el host es compartido.
Permisos de archivo
~/.openclaw/openclaw.json:600(solo lectura/escritura del usuario)~/.openclaw:700(solo usuario)
openclaw doctor puede advertir y ofrecer ajustar estos permisos.
Archivos .env del espacio de trabajo
OpenClaw carga archivos .env locales del espacio de trabajo para agentes y herramientas, pero nunca permite que sobrescriban silenciosamente los controles del runtime del Gateway:
- Las variables de entorno de credenciales de proveedores se bloquean desde archivos
.envde espacios de trabajo no confiables; por ejemplo,GEMINI_API_KEY,GOOGLE_API_KEY,XAI_API_KEY,MISTRAL_API_KEY,GROQ_API_KEY,DEEPSEEK_API_KEY,PERPLEXITY_API_KEY,BRAVE_API_KEY,TAVILY_API_KEY,EXA_API_KEY,FIRECRAWL_API_KEYy las claves de autenticación de proveedores declaradas por Plugins confiables instalados. En su lugar, coloca las credenciales de proveedores en el entorno del proceso Gateway,~/.openclaw/.env($OPENCLAW_STATE_DIR/.env), el bloqueenvde configuración o una importación opcional de login-shell. - Cualquier clave que empiece por
OPENCLAW_se bloquea desde archivos.envde espacios de trabajo no confiables, reservando todo el espacio de nombres del runtime para que un control futuroOPENCLAW_*falle de forma cerrada de manera predeterminada en lugar de heredarse silenciosamente desde contenido.envregistrado o suministrado por un atacante. - Los ajustes de endpoints de canal para Matrix, Mattermost, IRC y Synology Chat también se bloquean frente a sobrescrituras desde
.envdel espacio de trabajo (por ejemplo,MATRIX_HOMESERVER,MATTERMOST_URL,IRC_HOST,SYNOLOGY_CHAT_INCOMING_URL), de modo que un espacio de trabajo clonado no pueda redirigir el tráfico de conectores incluidos mediante configuración de endpoints locales. Deben provenir del entorno del proceso Gateway o deenv.shellEnv. - Las variables de entorno confiables del proceso/SO, el dotenv global del runtime,
envde configuración y la importación de login-shell habilitada siguen aplicándose; esto solo restringe la carga de archivos.envdel espacio de trabajo.
.env del espacio de trabajo suelen vivir junto al código del agente, se confirman por accidente o los escriben herramientas; bloquear credenciales de proveedores evita que un espacio de trabajo clonado sustituya cuentas de proveedores controladas por un atacante.
Registros y transcripciones
OpenClaw almacena transcripciones de sesión en disco bajo~/.openclaw/agents/<agentId>/sessions/*.jsonl para continuidad de sesión e indexación opcional de memoria; cualquier proceso/usuario con acceso al sistema de archivos puede leerlas. Trata el acceso al disco como el límite de confianza y restringe los permisos de ~/.openclaw; ejecuta agentes bajo usuarios o hosts de SO separados para un aislamiento más fuerte.
Los registros del Gateway pueden incluir resúmenes de herramientas, errores y URLs; las transcripciones de sesión pueden incluir secretos pegados, contenido de archivos, salida de comandos y enlaces.
- Mantén activada la redacción de registros/transcripciones (
logging.redactSensitive: "tools", predeterminado). - Añade patrones personalizados para tu entorno mediante
logging.redactPatterns(tokens, nombres de host, URLs internas). - Al compartir diagnósticos, prefiere
openclaw status --all(pegable, secretos redactados) en lugar de registros sin procesar. - Poda transcripciones de sesión y archivos de registro antiguos si no necesitas retención prolongada.
Línea base segura (copiar/pegar)
Números separados (WhatsApp, Signal, Telegram)
Para canales basados en números de teléfono, considera ejecutar el asistente en un número separado del personal, para que las conversaciones personales sigan siendo privadas y el número del bot gestione la automatización con sus propios límites.Respuesta a incidentes
Contener
- Detenlo: detén la app de macOS (si supervisa el Gateway) o termina tu proceso
openclaw gateway. - Cierra la exposición: establece
gateway.bind: "loopback"(o desactiva Tailscale Funnel/Serve) hasta que entiendas qué ocurrió. - Congela el acceso: cambia los DM/grupos riesgosos a
dmPolicy: "disabled"/ exige menciones, y elimina cualquier entrada"*"que permita todo.
Rotar (asume compromiso si se filtraron secretos)
- Rota la autenticación del Gateway (
gateway.auth.token/OPENCLAW_GATEWAY_PASSWORD) y reinicia. - Rota los secretos de clientes remotos (
gateway.remote.token/.password) en cualquier máquina que pueda llamar al Gateway. - Rota credenciales de proveedores/API (credenciales de WhatsApp, tokens de Slack/Discord, claves de modelos/API en
auth-profiles.jsony valores cifrados de cargas útiles secretas cuando se usen).
Auditar
- Revisa los registros del Gateway:
/tmp/openclaw/openclaw-YYYY-MM-DD.log(ologging.file). - Revisa las transcripciones relevantes:
~/.openclaw/agents/<agentId>/sessions/*.jsonl. - Revisa cambios recientes de configuración que podrían haber ampliado el acceso:
gateway.bind,gateway.auth, políticas de DM/grupo,tools.elevated, cambios de Plugins. - Vuelve a ejecutar
openclaw security audit --deepy confirma que los hallazgos críticos estén resueltos.
Recopilar para un informe
- Marca de tiempo, SO del host del Gateway + versión de OpenClaw.
- Las transcripciones de sesión + una cola breve del registro (después de redactar).
- Qué envió el atacante y qué hizo el agente.
- Si el Gateway estuvo expuesto más allá de loopback (LAN/Tailscale Funnel/Serve).
Escaneo de secretos
CI ejecuta el hook de pre-commitdetect-private-key sobre el repositorio. Si falla, elimina o rota el material de claves confirmado y luego reprodúcelo localmente:
Reportar problemas de seguridad
¿Encontraste una vulnerabilidad en OpenClaw? Repórtala de forma responsable:- Correo electrónico: security@openclaw.ai
- No publiques nada hasta que se haya corregido.
- Te daremos crédito (a menos que prefieras el anonimato).