news 2026/9/30 19:21:04

OpenClaw 实例遭黑客组织入侵:API 密钥泄露链路与恶意软件部署复盘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenClaw 实例遭黑客组织入侵:API 密钥泄露链路与恶意软件部署复盘

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 账户得手的。你的实例安全,最终取决于你愿不愿意多花那几分钟检查。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 19:18:36

Java+Vue智慧蜂箱实战:从天敌入侵识别到多源风险融合与越冬保温决策全链路 从单帧识别到多源证据,从低温判断到可执行保温策略

JavaVue智慧蜂箱实战&#xff1a;从天敌入侵识别到多源风险融合与越冬保温决策全链路从单帧识别到多源证据&#xff0c;从低温判断到可执行保温策略读完本文&#xff0c;你将得到一条可落地的完整链路&#xff1a;蜂箱多源感知 → 数据质量治理 → 视觉目标事件化 → 振动/声音…

作者头像 李华
网站建设 2026/9/30 19:09:45

UltraEdit 最新安装教程:用 TaoToken 统一 Key 打通 AI 辅助编辑配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 19:09:42

Cursor 运行 Python 程序:解释器配置与 TaoToken 接入实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 19:08:39

隧道CO浓度超标怎么办?动环监控自动排风全解析

一、隧道内CO从哪里来&#xff0c;超标有哪些风险隧道为半封闭空间&#xff0c;车辆行驶尾气会持续释放一氧化碳&#xff08;CO&#xff09;&#xff0c;空气流通不畅极易造成气体积聚&#xff0c;存在极大安全隐患&#xff1a;安全危害&#xff1a;CO为有毒无色气体&#xff0…

作者头像 李华