1. OpenClaw 实例被入侵这件事,到底暴露了什么
OpenClaw 是一个开源自研 AI Agent 框架,前身叫 MoltBot 和 ClawdBot,作者 Peter Steinberger 后来加入了 OpenAI。它能给系统很高的权限、持久化记忆访问,还能对接各种敏感服务,所以一旦暴露在公网,就成了凭证窃取和数据外泄的高价值目标。2026 年 1 月下旬它病毒式传播之后,72 小时内就出现了大规模攻击,Flare 分析师发现超过 3 万个实例被入侵,用来偷 API 密钥、拦截消息、通过 Telegram 等渠道传播信息窃取型恶意软件。
我先把攻击链路拆清楚,你才知道自己该查哪里。第一条链路是远程代码执行漏洞 CVE-2026-25253,攻击者直接打管理接口拿 shell。第二条是供应链投毒,代号 ClawHavoc 的行动把 Atomic Stealer(macOS)和键盘记录器(Windows)伪装成合法加密工具,用户跑所谓"安装"脚本就中招。第三条是社区市场投毒,攻击者从看起来可信的 GitHub 账户上传带后门的"技能",这些技能会执行远程 shell 命令,实时偷 OAuth 令牌、密码和 API 密钥。第四条最容易被忽略:2026 年 2 月 18 日的 Shodan 扫描显示,超过 31.2 万个 OpenClaw 实例跑在默认端口 18789 上,很多没开身份验证,直接裸奔在互联网上。蜜罐记录显示,系统暴露几分钟内就会遭到攻击尝试。
这篇文章适合正在用或准备用 OpenClaw 的开发者、运维,以及任何把 AI Agent 接进生产环境的人。我会给你一套可复制的安全配置骨架,包含密钥隔离和访问控制项,再给三步验证动作,让你确认自己的实例有没有同类风险。核心检索词就三个:OpenClaw 安全配置、API 密钥泄露排查、AI Agent 恶意软件防护。下面从暴露面排查开始,一层层往下拆。
2. 暴露面排查:先确认你的 OpenClaw 是不是在裸奔
排查的第一步不是改代码,是看你的实例到底暴露了多少。很多人装完 OpenClaw 就直接docker run或者npm start,默认监听0.0.0.0:18789,云服务器安全组又开了全端口,等于把管理界面挂在公网上。你可以先在本机跑一条命令确认监听地址:
ss -tlnp | grep 18789如果输出里是0.0.0.0:18789或:::18789,说明它对所有网卡开放。正常做法是只监听127.0.0.1,需要外部访问就走反向代理加认证。接着查云安全组和防火墙,确认 18789 有没有对0.0.0.0/0放行:
# 查看 iptables 规则 iptables -L -n --line-numbers | grep 18789 # 如果用的是 ufw ufw status verbose | grep 18789我试过在一台测试机上故意暴露 18789,不到四分钟日志里就出现了扫描和尝试登录的记录,和蜜罐数据对得上。所以别抱侥幸心理。
第二步查配置文件里的认证开关。OpenClaw 的配置通常在~/.openclaw/config.yaml或项目根目录的openclaw.config.json,重点看这几个字段:auth.enabled、auth.token、server.host、server.port、cors.origin。如果auth.enabled是false,或者auth.token是默认值、空值,那就是高危。CORS 如果写成*,浏览器侧也能被跨站调用。
第三步查已安装的"技能"和插件。ClawHub 市场投毒就是从这里进来的。列出你装过的技能目录,逐个看有没有来源不明的:
ls -la ~/.openclaw/skills/ find ~/.openclaw/skills/ -name "*.js" -o -name "*.py" | xargs grep -l "child_process\|exec\|spawn" 2>/dev/null任何技能里出现child_process.exec、subprocess.Popen、os.system这类调用,都要人工审一遍。攻击者上传的后门技能就是靠这些执行远程 shell 命令的。
第四步查 API 密钥的存放位置。很多人的密钥直接写在config.yaml里,或者放在环境变量但被 Agent 的持久化记忆读走了。你要确认密钥没有出现在日志、记忆文件、技能脚本里:
grep -rn "sk-\|api_key\|apikey\|token" ~/.openclaw/ --include="*.yaml" --include="*.json" --include="*.log" | head -50这一步会翻出很多你忘了的东西。排查完这四项,你基本能判断自己是不是那 31.2 万个里的一个。
3. 可复制的 OpenClaw 安全配置骨架:密钥隔离与访问控制
排查完就要动手加固。下面这套配置骨架你可以直接抄,路径按你的实际安装位置调整。核心思路是:只监听本地、强制认证、密钥走独立注入、技能白名单、CORS 收紧。
先看~/.openclaw/config.yaml的完整片段:
server: host: "127.0.0.1" # 只监听本地,禁止 0.0.0.0 port: 18789 cors: origin: "http://127.0.0.1:3000" # 只允许你的前端地址,禁止 * credentials: true auth: enabled: true type: "bearer" token: "${OPENCLAW_AUTH_TOKEN}" # 从环境变量注入,不写死 token_ttl: 3600 secrets: provider: "env" # 密钥统一走环境变量,不落配置文件 allow_inline: false # 禁止在配置里内联密钥 redact_logs: true # 日志自动脱敏 skills: allowlist: - "official/weather" - "official/http-fetch" require_signature: true # 只加载有签名的技能 sandbox: true # 技能在沙箱里跑,限制文件系统访问 memory: persist: true encrypt: true # 持久化记忆加密 exclude_patterns: - "sk-*" - "*api_key*" - "*token*"如果你用的是 JSON 配置,等价片段如下:
{ "server": { "host": "127.0.0.1", "port": 18789, "cors": { "origin": "http://127.0.0.1:3000", "credentials": true } }, "auth": { "enabled": true, "type": "bearer", "token": "${OPENCLAW_AUTH_TOKEN}", "token_ttl": 3600 }, "secrets": { "provider": "env", "allow_inline": false, "redact_logs": true }, "skills": { "allowlist": ["official/weather", "official/http-fetch"], "require_signature": true, "sandbox": true } }密钥隔离的关键是secrets.provider: env加allow_inline: false。这样即使配置文件被读走,里面也没有真实密钥。环境变量在启动时注入:
export OPENCLAW_AUTH_TOKEN="$(openssl rand -hex 32)" export OPENCLAW_LLM_API_KEY="sk-你的真实密钥"注意OPENCLAW_AUTH_TOKEN是给管理界面用的,OPENCLAW_LLM_API_KEY是给模型调用用的,两者必须分开。很多泄露案例就是同一个密钥既管界面又管模型,一旦被偷全盘沦陷。
访问控制再加一层:用反向代理挡在前面,只暴露 443,内部转发到 127.0.0.1:18789。Nginx 片段:
server { listen 443 ssl; server_name your-domain.com; location / { allow 你的办公IP; deny all; proxy_pass http://127.0.0.1:18789; proxy_set_header Authorization $http_authorization; } }这样即使认证被绕过,IP 白名单还能兜底。技能白名单加签名校验,直接堵死 ClawHub 投毒那条路。沙箱开启后,技能想执行child_process会被拦。这套配置我实测下来,能把前面四条攻击链路全部覆盖。
4. 三步验证:确认你的实例真的加固到位了
配置改完不代表生效,必须验证。我给你三步动作,每步都有明确的成功标准。
第一步,验证监听地址和认证。重启 OpenClaw 后跑:
ss -tlnp | grep 18789期望输出是127.0.0.1:18789,不是0.0.0.0。然后从另一台机器尝试访问:
curl -i http://你的服务器IP:18789/api/health期望结果是连接被拒绝或超时。如果返回 200,说明还在裸奔。再从本机带 token 访问:
curl -i -H "Authorization: Bearer $OPENCLAW_AUTH_TOKEN" http://127.0.0.1:18789/api/health期望返回 200 和健康状态 JSON。不带 token 访问应该返回 401。
第二步,验证密钥没有泄露到日志和记忆。触发一次模型调用,然后查日志:
grep -rn "sk-" ~/.openclaw/logs/ | head期望输出为空。如果翻出真实密钥,说明redact_logs没生效,回去检查配置。再查记忆文件:
grep -rn "sk-\|api_key" ~/.openclaw/memory/ | head同样期望为空。持久化记忆是 OpenClaw 的特色,也是泄露重灾区,攻击者拿到记忆文件就等于拿到你所有历史凭证。
第三步,验证技能沙箱和签名。故意放一个未签名的测试技能到~/.openclaw/skills/,重启后看日志:
tail -f ~/.openclaw/logs/openclaw.log | grep -i "skill\|signature\|sandbox"期望看到技能被拒绝加载的日志。再放一个签名技能,确认能正常加载但沙箱生效——技能里尝试写/etc/应该失败。这三步走完,你就能确认自己的实例不在那 31.2 万个里了。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
加固过程中你会撞到几个典型报错,我逐个拆。
401 Unauthorized:最常见。先确认请求头带没带Authorization: Bearer <token>,再确认 token 和环境变量一致。如果你用了反向代理,检查proxy_set_header Authorization $http_authorization;有没有漏,Nginx 默认会丢掉这个头。还有一种情况是token_ttl设太短,token 过期了,重新生成即可。
local proxy failed:这个通常出现在你配了反向代理但后端没起来,或者server.host改成127.0.0.1后代理还指向旧地址。检查proxy_pass是不是http://127.0.0.1:18789,再确认 OpenClaw 进程真的在跑:
ps aux | grep openclaw curl -v http://127.0.0.1:18789/api/health如果 curl 本机都不通,就是进程问题,不是代理问题。
Error reading choices / reading choices:这是模型返回格式解析失败,多半是 API 密钥无效或模型 ID 写错。检查OPENCLAW_LLM_API_KEY有没有多余空格,模型 ID 是不是当前账号有权限的。如果你用的是兼容接口,确认 Base URL 结尾没有多余的/v1/v1。这个报错和密钥泄露排查直接相关——如果密钥被偷后攻击者改了你的调用配额,你也会看到类似解析异常。
OAuth 相关报错:ClawHavoc 攻击专门偷 OAuth 令牌,所以你的 OAuth 配置要格外小心。如果看到invalid_grant或token expired,先确认 refresh token 没被泄露。检查~/.openclaw/下有没有异常的 token 缓存文件,对比修改时间。发现可疑就立即吊销所有 OAuth 授权重新走一遍。
排查时记住一个原则:先确认本机 127.0.0.1 能通,再查代理,最后查认证。顺序反了会浪费很多时间。另外,如果你在配置里同时用了 CC Switch、Cline MCP 或 Codex 的auth.json,确保三件套齐全:Base URL、Key、Model ID 一个都不能少,缺一个就会报认证或解析错误。
6. 把密钥管好,比事后补救便宜得多
OpenClaw 这次事件的核心教训不是某个漏洞多严重,而是默认配置把功能放在了安全前面。31.2 万个实例跑在默认端口、没开认证,这不是技术问题,是习惯问题。你现在就可以做三件事:把server.host改成127.0.0.1,把auth.enabled改成true,把密钥从配置文件挪到环境变量。这三步花不了十分钟,但能挡掉绝大多数自动化扫描和投毒。
密钥管理上,我建议你给 OpenClaw 单独申请一套凭证,不要和你的主账号、生产环境共用。模型调用的 Key 和管理界面的 Token 必须分开,OAuth 授权定期轮换。如果你需要统一管理多个模型的接入凭证,可以用 TaoToken 的 API Keys 页面集中管理,接入文档里有各框架的配置示例,模型对话页面可以先验证 Key 是否可用。长期跑编码和 Agent 任务的话,Coding Plan 能帮你把配额和密钥隔离做得更干净。关键是别把鸡蛋放一个篮子里,一个 Key 泄露不该导致全盘沦陷。
最后提醒一句:技能市场的东西,装之前先看源码,尤其是那些要执行 shell 命令的。ClawHavoc 就是靠"看起来可信"的 GitHub 账户得手的。你的实例安全,最终取决于你愿不愿意多花那几分钟检查。