OpenClaw 正迎来它的高光时刻。这款自主 AI 智能体——你可能认识它的名字 Clawdbot 或 Moltbot,取决于你最初接触它的时间——在过去几周内迅速攀升 GitHub 排行榜,人们在各处纷纷部署实例。就在上周,它也迎来了第一个真正的安全时刻:CVE-2026-25253 披露了,这是一个一键 RCE,补丁仅在数天后发布。如果你在运行这些实例,或者你负责的网络中可能有人在运行,现在正是查明它们位置的时候。
快速背景
OpenClaw 将 LLM(Claude、GPT-4、Google 的模型)连接到你的机器和真实浏览器,让智能体代表你完成工作——在 Telegram/Slack 上聊天、执行网页任务、运行命令。这个模板关注的组件是网关服务,它通过端口 5353/UDP 的多播 DNS(mDNS)向本地宣告自身以供发现。
关于命名有一点需要说明,因为匹配器依赖于此:项目现在叫 OpenClaw,但它以 Clawdbot 发布,更早之前叫 Moltbot——同一套代码库,mDNS 服务名称仍然沿用旧品牌(_clawdbot-gw、_openclaw-gw)。模板同时匹配两者,确保改名不会导致检测盲区。
模板
id: openclaw-exposure
info:
name: Openclaw (formerly Clawdbot / Moltbot) - Detect
author: rxerium
severity: info
description: |
Clawdbot Gateway service was detected exposing configuration information via mDNS including DNS settings, gateway details, and service configuration.
classification:
cwe-id: CWE-200
metadata:
verified: true
max-request: 1
shodan-query: product:openclaw
fofa-query: body="ClawdBot"
tags: network,openclaw,gateway,exposure,udp,mdns,js,discovery
javascript:
- pre-condition: |
isUDPPortOpen(Host,Port);
code: |
let c = require("nuclei/net");
let conn = c.Open('udp', `${Host}:${Port}`);
// mDNS query for _clawdbot-gw._tcp.local PTR record
let packet = "000000000001000000000000095f7365727669636573075f646e732d7364045f756470056c6f63616c00000c0001"
conn.SendHex(packet);
let resp = conn.RecvString(2048);
resp;
args:
Host: "{{Host}}"
Port: 5353
matchers:
- type: dsl
dsl:
- "contains(response, '_openclaw-gw') && success == true"
- "contains(response, 'clawdbot') && success == true"
condition: or
extractors:
- type: regex
part: response
name: server
group: 1
regex:
- 'displayName=([a-zA-Z0-9._-]+)'
工作原理
这是 JavaScript 协议模板,而非 HTTP。 大多数暴露模板发送 GET 请求并匹配响应体。这个模板使用 Nuclei 的 nuclei/net 库打开原始套接字,直接使用二进制协议通信——这是必要的,因为 mDNS 无法用 HTTP 匹配器来表达。
前置条件控制整个流程。 isUDPPortOpen(Host, Port) 在发送任何数据包之前检查 5353/UDP 是否确实在监听。如果端口关闭,模板直接短路,不消耗请求——当你将其指向大范围目标时,大多数主机不会运行网关,这样可以保持扫描的低成本。
代码发送原始 mDNS 查询并读取响应。 它打开到 Host:5353 的 UDP 连接,用 SendHex 发送十六进制编码的 DNS 数据包,并读取最多 2048 字节的回复。解码后的载荷是 DNS-SD 服务枚举查询——针对 _services._dns-sd._udp.local 的 PTR 查询,即标准的"列出你所有宣告服务"元查询。运行网关的主机会用其宣告的服务列表回应,OpenClaw/Clawdbot 服务名称就会出现在响应中。
匹配器确认这是一个网关。 两个 DSL 检查以 or 组合:contains(response, '_openclaw-gw') 或 contains(response, 'clawdbot'),每个都附带 success == true 条件,确保半开套接字或空读取不会产生误报。mDNS 响应中出现任一字符串,就能确认这是一个 OpenClaw 网关,无论它使用哪个品牌名称。
提取器获取设备的显示名称。 正则表达式从宣告中提取 displayName=...,并在输出中以 server 形式呈现。因此,命中结果不仅仅是"存在一个网关"——你还能获得运营者给它的人类可读名称,这对清单和分流来说极具价值。
严重性为 info,CWE-200。 这是诚实的分类:模板检测的是信息暴露(CWE-200,信息暴露)——网关在不应该的地方宣告其配置——而非主动利用。mDNS 泄漏到可达接口是发现的问题;攻击者接下来做什么是另一个问题。
verified: true 意味着模板已经在真实实例上得到验证,而非仅仅按规格编写——因此命中是可信的。
为什么 mDNS 检测值得拥有
HTTP 指纹识别是找到这些实例的显而易见的方式,并且有效。但 mDNS 捕获了不同的切面。即使 HTTP 端被防火墙保护、位于代理后面、或在 HTTP 扫描未覆盖的非标准端口上,网关仍然可能向攻击者可达的网段泄漏服务发现信息。这对内部评估和平坦网络尤其相关——在这类网络中,多播轻松穿越不应该穿越的网段,而网关实际上在向线路上的一切宣告"我在这里,这是我的名字"。将其与 HTTP 指纹一起运行,你就能获得两者单独都无法覆盖的范围。
大规模运行
先从自己的网络和边界开始——授权最清晰,mDNS 发现在你控制的网络内最具可操作性。
nuclei -t openclaw-exposure.yaml -l targets.txt -o openclaw-hits.txt
模板已经在 args 中固定了端口 5353,isUDPPortOpen 前置条件意味着你可以向它投入宽泛的主机列表而不会轰炸任何东西——关闭的端口在发送数据包之前就会被跳过。
对大范围使用 UDP 扫描预先过滤。 UDP 扫描比 TCP 慢,因此对于大范围目标,值得先找到活跃的 5353 监听者,再将其传给 Nuclei:
# naabu doesn't do UDP; use nmap for the 5353/udp sweep
nmap -sU -p 5353 --open -iL ranges.txt -oG - | awk '/Up$/{print $2}' > mdns-hosts.txt
nuclei -t openclaw-exposure.yaml -l mdns-hosts.txt -o openclaw-hits.txt
互联网规模上,依托扫描数据。 不要主动向互联网上大量发送 UDP——噪声大、速度慢、法律风险高。使用模板内置的 metadata 查询(Shodan 的 product:openclaw,FOFA 的 body="ClawdBot")枚举暴露的实例,然后只对你授权范围内的候选目标运行模板。
持续运行,而非一次性。OpenClaw 的安装量目前每天都在增长,这意味着新网关不断出现——一次性扫描很快就会过时。并且每次命中后配合两个动作:将网关从任何可达接口移除,并轮换它所持有的凭证。
为什么这很重要
mDNS 泄漏是模板产生的发现,但现在关注的原因是暴露网关背后所承载的内容。
时机就是故事所在。CVE-2026-25253 于 1 月 26 日披露,并在上周末发布的 OpenClaw 2026.1.29 中打补丁。这是一个一键远程代码执行:Control UI 接受 URL 查询字符串中的 gatewayUrl,并在没有确认的情况下自动向其打开 WebSocket,将实例的认证令牌泄露给控制该 URL 的任何人。窃取令牌,劫持 WebSocket,执行命令。不需要任何事先认证,评级为 CVSS 8.8(CWE-669,球体间不正确的资源传输),而且——令人不安的是——它即使对仅在 localhost 上运行的实例也有效,因为攻击通过受害者自己的浏览器进行横向移动。研究人员称之为"一键 RCE 击杀链"。概念验证代码已经公开,广泛的媒体报道正好在我撰写本文时开始出现。
这是急性问题,但持续性问题是暴露本身。OpenClaw 存储其驱动的云模型——Claude、OpenAI、Google AI——的凭证,以及你接入的任何消息和工具集成的令牌。暴露的网关就是没有密码的开放 SSH,只不过"密码"是一堆付费 AI 凭证和宿主机上的立足点。由于智能体是具有访问权限的身份,接管它的人就继承了它的令牌和 OAuth 授权,并且可以向它发出它会毫不质疑地执行的指令。凭证是即时的战利品;在特权智能体内部的持久立足点才是持久的收获。通过 mDNS 广播自身 displayName 的网关只是在让自己更容易被找到。这就是这个模板要填补的缺口。
缓解措施
如果你在运行 OpenClaw,本周的待办事项:
- 立即打补丁。 更新到 2026.1.29 或更新版本——它修复了 CVE-2026-25253。打补丁不能撤销之前的暴露,所以将其视为第一步,而非全部工作。
- 轮换网关令牌和每个已存储的凭证。 新的
authToken,Claude/OpenAI/Google AI 的新 API 密钥,并检查使用日志。如果它曾经可达,假设它已被入侵。 - 将其从任何可达接口移除。 绑定到回环接口,或将其置于 VPN、堡垒机或 ZTNA 后面,并在网段边界封锁 5353/UDP,使 mDNS 停止越过它不应该越过的网络。回环是底线,不是上限——RCE 通过浏览器进行横向移动,因此仅限 localhost 并不免责。
- 以最小权限运行智能体。 不要"上帝模式"。缩小其系统、文件和密钥访问范围,并像监控任何具有持久 API 和 OAuth 授权的账户一样监控它。
- 监控利用模式。 标记浏览器到外部域的意外 WebSocket 连接,并对网关配置更改发出警报。
检测本身并不复杂——一个前置条件、一个原始 mDNS 查询、两个字符串匹配器。价值在于时机:它能在 HTTP 端被锁定的情况下捕获在网络上宣告自身的网关,恰恰是在一个公开的一键 RCE 使找到它们变得紧迫的时候。尽早运行、频繁运行,每次命中都轮换密钥。智能体运行时是拥有密钥的身份;快速找到暴露的实例就是这场游戏的全部。