OpenClaw 技术栈与安全管控能力调研
时间:2026-04-15
作用域:梳理 OpenClaw(开源 AI 助手 / Agent 平台)当前的技术实现栈,以及围绕它可以落地的安全管控点,供安全团队评估部署与加固方向。
一、OpenClaw 简介
OpenClaw 是一款开源、自托管、跨平台的个人 AI 助手 / Agent 平台,MIT 协议,支持 200+ LLM 后端(Claude / GPT / Gemini / Llama / Mistral 等)。其核心定位是"单用户、本地优先"——所有凭证与会话都在本机 ~/.openclaw/ 下,而不是集中式多租户 SaaS。这一点直接决定了它的威胁模型:一个 Gateway = 一位受信任操作员,官方明确声明它不是一个面向相互敌对多租户的隔离边界。
二、技术栈总览
2.1 运行时与语言
| 项 | 说明 |
|---|---|
| 运行时 | Node.js 24(推荐)/ 22.16+ |
| 语言 | TypeScript + JavaScript |
| 平台 | macOS / Linux / Windows |
| 发行方式 | npm install -g openclaw@latest,也可 systemd/daemon 常驻 |
| License | MIT |
2.2 进程与架构
OpenClaw 不做微服务,而是以一个常驻的 Node.js Gateway 进程承载 5 个子系统:
- Gateway — 控制面:会话、channel 路由、工具调度、事件总线,默认监听
127.0.0.1:18789,同时对外提供 Control UI 与 WebChat。 - Channels — 消息入站/出站适配,官方已支持 50+ 渠道:WhatsApp、Telegram、Slack、Discord、Signal、iMessage、Matrix、Google Chat、Microsoft Teams、Zalo 等。
- Skills — 技能系统,每个 Skill 是一个带
SKILL.md的目录(含元信息与调用指令),分三类:bundled(内置)/ managed(ClawHub 下发)/ workspace(本地)。 - Plugins — 可注册 Tool、HTTP 路由、Gateway RPC、后台服务,官方通过 allowlist 控制。
- Hooks — 事件驱动钩子(见 Hooks 专题),监听命令 / 会话 / 生命周期 / 消息等 13 个事件。
2.3 存储与配置
- Agent 由 Markdown 配置文件定义(身份、记忆、权限)。
- 会话与历史以 JSONL 存储在本机
~/.openclaw/agents/<agentId>/sessions/*.jsonl。 - 凭证存在
~/.openclaw/credentials/<channel>/…,明文(官方承认这是已知取舍)。 - 推荐
~/.openclaw/权限700,openclaw.json权限600。
2.4 对外协议与互通
- WebSocket:Gateway ↔ 本地 / 远端客户端。
- MCP:
openclaw mcp serve启动一个 stdio MCP server,让 Claude / 其他 MCP 客户端接入;同时也有社区实现的 openclaw-mcp-bridge,反向把任意 MCP server 注册成 OpenClaw 的 Tool。 - ClawHub:公开的 Skill 市场,3500+ Skill,只要一周龄的 GitHub 账号即可投递(供应链风险点)。
2.5 一张图
┌──────────────────────── Gateway (Node.js, :18789) ─────────────────────┐
│ │
│ ┌───────────┐ ┌─────────┐ ┌───────┐ ┌────────┐ ┌────────┐ │
│ │ Channels │ -> │ Session │ -> │ LLM │ -> │ Tools │ - │ Hooks │ │
│ │ 50+ IM │ │ Router │ │ 200+ │ │ /Skills│ │ Events │ │
│ └───────────┘ └─────────┘ └───────┘ └────────┘ └────────┘ │
│ ▲ ▲ ▲ ▲ │ │
│ │ Pairing/DM │ dmScope │ profile │ sandbox │ │
│ │ Allowlist │ isolation │ allow/deny│ Docker │ │
│ └─── Control UI / WebChat ──── MCP stdio ──┴── Plugins ──┘ │
└────────────────────────────────────────────────────────────────────────┘
▲
│ ~/.openclaw/ (明文凭证 + JSONL 会话)
三、官方已提供的安全管控原语
OpenClaw 把安全做成了"多层闸门"的组合,调研它能在内部做的管控,本质就是看这些原语是否够用、能否被 Hooks/Plugin 扩展。
3.1 Gateway 认证与暴露面
| 维度 | 配置项 | 选项 |
|---|---|---|
| 认证模式 | gateway.auth.mode | token(推荐) / password / 受信代理 |
| 绑定面 | gateway.bind | loopback(默认) / lan / tailnet / custom |
| Tailscale | gateway.tailscale.mode | off(推荐) / Serve / Funnel(公网) |
| mDNS 披露 | discovery.mdns.mode | minimal 去除 cliPath/sshPort |
| Control UI | 设备配对 | loopback 自动放行,LAN/Tailnet 必须 Device Pairing |
3.2 DM 接入策略(对抗 Prompt Injection 的第一道闸)
| 策略 | 说明 |
|---|---|
pairing(默认) | 陌生人需走审批码,1 小时过期;每 channel 最多 3 个待审请求 |
allowlist | 仅放行白名单 |
open | 必须显式写 "*" 才公开 |
disabled | 完全忽略 DM |
CLI:openclaw pairing list <channel> / openclaw pairing approve <channel> <code>。
3.3 会话隔离
session.dmScope:
main(默认)— 所有 DM 共享一个 session(易串号);per-peer— 按发送者隔离;per-channel-peer— 按channel+sender隔离(推荐);per-account-channel-peer— 多账号变体。
3.4 工具策略与执行审批
{
"tools": {
"profile": "messaging", // 预置画像
"deny": [
"group:automation", "group:runtime", "group:fs",
"sessions_spawn", "sessions_send"
],
"fs": { "workspaceOnly": true },
"exec": {
"security": "deny", // full / moderate / deny
"ask": "always", // always / off
"applyPatch": { "workspaceOnly": true },
"strictInlineEval": true, // 内联求值强制再审批
"safeBins": ["ls","cat","rg"]
}
}
}
关键点:
security: full= 受信操作员模型,等于给 Agent 主机 root 等价权限;moderate= 执行前审批,且审批绑定具体请求上下文 + 直接文件操作数,避免被"重放";- 审批粒度足够精细,适合做分级授权。
3.5 沙箱(Docker)
{
"agents": {
"defaults": {
"sandbox": {
"mode": "all", // non-main / all
"scope": "agent",
"workspaceAccess": "ro", // none / ro / rw
"network": "none" // 默认 none
}
}
}
}
硬性禁止的"危险开关"(被 security audit 列为 critical):
dangerouslyAllowContainerNamespaceJoindangerouslyAllowReservedContainerTargetsdangerouslyAllowExternalBindSources- 低强度 seccomp / AppArmor profile
- 相对路径 / 符号链接穿越 / 绑定
/etc/var/run/sys等敏感目录
3.6 浏览器 SSRF 策略
{
"browser": {
"ssrfPolicy": {
"dangerouslyAllowPrivateNetwork": false,
"hostnameAllowlist": ["*.example.com"],
"allowedHostnames": ["localhost"]
}
}
}
官方警告:浏览器内登录态 = 完整账号权限,建议独立 profile。
3.7 插件与供应链
{
"plugins": {
"allowlist": ["@scope/plugin-id@1.2.3"]
}
}
- 安装时自动做 dangerous-code 扫描,
critical默认拒绝; - npm lifecycle script 会执行(安装即代码执行,这是供应链高危点);
- 校验
npm packhash、符号链接逃逸; - Skill 层有 ClawHub + VirusTotal 扫描,但投递门槛仅"一周龄 GitHub 账号"。
3.8 日志与脱敏
{
"logging": {
"redactSensitive": "tools",
"redactPatterns": [
"api_key: [\\w-]+",
"token: \\w{20,}"
]
}
}
默认会脱敏 tool 参数,支持自定义正则;但会话 transcript 是明文 JSONL——磁盘访问即信任边界。
3.9 安全审计命令
openclaw security audit # 基础检查
openclaw security audit --deep # 活探针 + 扩展分析
openclaw security audit --fix # 自动修复:权限 / 日志 / 白名单
openclaw security audit --json # 机读输出(可接 CI)
高优先级检出项:
| Finding | 级别 |
|---|---|
fs.state_dir.perms_world_writable | critical |
gateway.bind_no_auth | critical |
gateway.tailscale_funnel | critical |
security.exposure.open_groups_with_elevated | critical |
tools.exec.security_full_configured | warn / critical |
四、安全能在 OpenClaw 里落地的管控点清单
下表把"能做什么"映射到具体的扩展位置,方便评估哪些靠官方配置即可、哪些需要 Plugin/Hooks 扩展、哪些需要外部系统联动。
| 管控目标 | 落地方式 | 备注 |
|---|---|---|
| 身份 / 暴露面收敛 | bind=loopback + token auth + 关闭 Tailscale Funnel | 纯配置 |
| 入口 Prompt Injection 拦截 | DM pairing + Group requireMention + contextVisibility: allowlist | 纯配置 |
| 跨用户会话串号 | dmScope = per-channel-peer | 纯配置 |
| 危险工具黑名单 | tools.deny + tools.profile = messaging | 纯配置 |
| 命令执行审批 / 录屏 | exec.security = moderate/deny + ask = always + strictInlineEval | 纯配置 |
| 工作区边界(防越权写) | tools.fs.workspaceOnly + applyPatch.workspaceOnly | 纯配置 |
| 沙箱隔离 | Docker sandbox mode=all, workspaceAccess=ro, network=none | 纯配置 |
| 浏览器 SSRF / 账户劫持 | browser.ssrfPolicy.dangerouslyAllowPrivateNetwork=false + 专用 profile | 纯配置 |
| 供应链 / Skill 审核 | plugins.allowlist + 定期 security audit --deep | 纯配置 |
| 敏感数据落盘脱敏 | logging.redactSensitive + redactPatterns | 纯配置 |
| 合规审计 / SIEM 对接 | Hook:command + command:* 全量转发到 syslog/Kafka/SIEM | 需写一个 hook |
| DLP / 出站内容审计 | Hook:message:sent、message:preprocessed 做正则 / LLM 分类器拦截 | 需写 hook,异步或同步阻断 |
| 输入侧恶意样本拦截 | Hook:message:received 接 URL / 文件 VirusTotal 或自有扫描 | 需写 hook |
| 会话冷存证据 | Hook:session:compact:before 在压缩前把原文归档到 WORM 存储 | 解决 JSONL 被压缩后丢证的问题 |
| 命令行拦截 / 强制二次确认 | Hook:command:new 结合自研风控规则 | 比改源码更稳 |
| 外部风控联动(SSO/OTP/审批) | Plugin:注册 Tool + RPC,Hook 在 exec 调用前转发到审批系统 | 与 moderate 审批配合 |
| OpenClaw 自身基线巡检 | openclaw security audit --json 接 CI / 定时任务 | 可与 schedule / cron 结合 |
| 凭证泄漏监控 | 文件系统 Watcher 监控 ~/.openclaw/credentials/**,权限偏移/变更告警 | 系统侧补丁 |
| MCP 侧横向攻击面 | 审 openclaw mcp serve 的 token / 仅走 stdio / 禁止跨主机 | 与 MCP 客户端策略一致 |
4.1 Hooks 作为安全切面的价值
OpenClaw 的 Hook 事件覆盖面非常完整:
- 命令域:
command:new / reset / stop / command - 会话域:
session:compact:before / after,session:patch - 消息域:
message:received / transcribed / preprocessed / sent - 生命周期:
agent:bootstrap,gateway:startup
这意味着无需 fork 源码,就可以通过一个 TypeScript handler.ts 文件实现:
- 输入过滤(message:received)
- 输出 DLP(message:sent)
- 命令行风控(command:new)
- 会话合规归档(session:compact:before)
- 启动基线检查(gateway:startup 上触发
security audit)
这是在不动 Gateway 主干的前提下,安全团队能拿到的最大空间。
4.2 剩余高风险项(Hook 解决不了的)
- 凭证明文:
~/.openclaw/仍是主要取舍点,需要系统层补位(磁盘加密 / keychain 代理 / LUKS)。 - Skill 供应链:ClawHub 门槛低 + npm lifecycle script = 典型"安装即 RCE"场景,
plugins.allowlist是唯一硬闸,强烈建议打开。 - 浏览器登录态:一旦授权,泄漏即等同于账号被盗,Hook 无法追溯,只能用"专用独立 profile + 独立用户态"的物理隔离。
exec.security = full的默认"受信模式":一旦开放到非本地暴露面,Prompt Injection → 主机 RCE 是最短路径。建议在任何非本地部署里强制moderate起步。
五、一份 60 秒安全基线(摘自官方并增补)
{
"gateway": {
"mode": "local",
"bind": "loopback",
"auth": { "mode": "token", "token": "long-random-token" },
"tailscale": { "mode": "off" }
},
"discovery": { "mdns": { "mode": "minimal" } },
"session": { "dmScope": "per-channel-peer" },
"tools": {
"profile": "messaging",
"deny": [
"group:automation", "group:runtime", "group:fs",
"sessions_spawn", "sessions_send"
],
"fs": { "workspaceOnly": true },
"exec": { "security": "deny", "ask": "always",
"applyPatch": { "workspaceOnly": true },
"strictInlineEval": true }
},
"agents": {
"defaults": {
"sandbox": {
"mode": "all", "scope": "agent",
"workspaceAccess": "ro", "network": "none"
}
}
},
"browser": {
"ssrfPolicy": { "dangerouslyAllowPrivateNetwork": false }
},
"plugins": { "allowlist": [/* 明确枚举 */] },
"logging": { "redactSensitive": "tools" },
"channels": {
"whatsapp": {
"dmPolicy": "pairing",
"groups": { "*": { "requireMention": true } }
}
}
}
加上一条定时任务:
openclaw security audit --deep --json > /var/log/openclaw-audit-$(date +%F).json
六、结论
- 技术栈很"朴素":Node.js 单进程 Gateway + Markdown/JSON/JSONL 本地存储 + 50+ Channel 适配 + 插件化 Skill/MCP/Plugin。优点是轻量、可审计、易部署;缺点是凭证明文与供应链敞口。
- 安全能力已经形成纵深:Auth / DM pairing / 会话隔离 / 工具白名单 / 执行审批 / Docker 沙箱 / SSRF / 插件 allowlist / 日志脱敏 / 安全审计一条龙,对"单用户受信模型"而言够用。
- 真正能被安全团队放大的扩展点是 Hook + Plugin:事件面完整、注册方式简单,能把 OpenClaw 当作一个可观测、可拦截的 Agent 运行时对待——日志外发、输入扫描、出站 DLP、命令行风控、外部审批联动都可以在不 fork 源码的前提下落地。
- 高风险仍需系统层补位:凭证明文、ClawHub 供应链、浏览器登录态、
exec.security=full默认,这四项是 OpenClaw 自身配置解决不了的,需要磁盘加密、主机隔离、组织级 allowlist、部署形态约束共同兜底。
七、参考资料
- OpenClaw 官方文档 — Security
- OpenClaw 官方文档 — Hooks
- OpenClaw 官方文档 — MCP CLI
- OpenClaw 2026 架构与部署指南 — Valletta
- GitHub: openclaw/openclaw
- GitHub: freema/openclaw-mcp
- GitHub: AIWerk/openclaw-mcp-bridge
- Snyk Labs — Escaping the Agent: Bypassing OpenClaw's Sandbox
- Nebius — OpenClaw security architecture & hardening
- Auth0 — Securing OpenClaw: A Developer's Guide
- DigitalOcean — What is OpenClaw