1. 先说结论:这个漏洞的杀伤力在"工具链"
"OpenClaw Gateway高危漏洞正在把AI代理变成远程控制后门"——这个话题在我朋友圈里刷屏的时候,不少人的第一反应是:又来了个AI安全警告,离我远着呢。但如果你真的用OpenClaw部署过AI代理,尤其是把它接进微信、飞书、Telegram,又给它配了Shell、浏览器、文件系统这类工具,你大概会跟我一样,后脊梁发凉。
OpenClaw本身是一个能跑在本地或云端的AI代理框架,核心卖点就是"让模型真正动手做事"。它不只是聊天,它能读文件、执行命令、发HTTP请求、操作办公软件,甚至能替你写小说、管日程。而Gateway则是这套体系里最关键的入口组件:外部渠道的消息先进Gateway,Gateway把消息翻译成Agent能理解的指令,再把Agent的回复和工具调用结果送出去。
问题恰恰出在这里:当Gateway这条链路缺少访问控制和指令来源校验时,攻击者根本不需要跟大模型废话,只要直接向Gateway端口投递一段构造好的消息,就能把一个原本只服务于你个人的AI助手,变成完全受他控制的"提线木偶"。木偶的每根线——文件读取、Shell执行、API调用——都还拴在你的机器上,但拉线的人已经换了。
我为什么说这个漏洞不是普通的Web漏洞?因为AI代理和传统服务的本质差别在于:它天然拥有"执行能力"。传统Web漏洞顶多让攻击者读个敏感文件、执行一条SQL;AI代理一旦被接管,攻击者等于继承了一个自带上下文记忆、工具调用能力和对话能力的"数字员工"。他知道你的目录结构、了解你的工作习惯,甚至能帮你把内网资产翻个底朝天。这篇文章我把OpenClaw的架构逻辑、Gateway漏洞的触发链、攻击路径、排查方法和加固方案完整拆一遍,不管你是本地实验还是生产部署,对照补一遍,心里会踏实很多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. OpenClaw Gateway的架构定位:它凭什么能指挥Agent
2.1 一个容易被忽略的"中间层"
要理解这个漏洞,得先搞清楚OpenClaw是怎么转起来的。简单讲,OpenClaw可以拆成三层:接入层、调度层、执行层。
- 接入层:微信、飞书、Telegram适配器,还有Web控制台,负责把用户的话转成结构化请求
- 调度层:Gateway,统一接收请求,做会话管理、指令转换、工具路由
- 执行层:Agent运行时加上各种工具,如Shell、浏览器、文件系统、第三方API
第一次接触OpenClaw的人,注意力基本都放在接入层和执行层:机器人怎么接入微信?本地模型怎么配?Skill怎么写?但恰恰是中间这个不起眼的Gateway,成了整条信任链的咽喉。
Gateway在OpenClaw里的角色,特别像公司前台。所有访客要进公司,都得先经过前台登记。问题是,如果这个前台既不验证证件,也不打电话核实,只要有人从侧门溜进来,说一句"我是客户",就能拿到临时工牌在整个办公区乱转。Gateway就是这个"前台",管得好,Agent只在授权范围内干活;管不好,谁都可能冒充你给Agent下令。
2.2 信任边界:哪些请求算"可信"
OpenClaw Gateway日常要处理两类完全不同的流量:
第一类是来自受信任渠道的会话流,比如你通过Web控制台登录后发起的对话,或者你在微信里叫机器人干活。这类流量可以来自外部,但必须经过身份认证。
第二类是Agent自身产生的工具调用流,例如Agent决定调用Shell执行一条命令,或者调用文件工具读取某个路径。这类流量的信任等级应该远高于外部会话流,因为它代表的是Agent在权限范围内的自主行为,理论上只应该由Agent运行时内部发起,绝对不应该被一条外部消息直接伪造。
这个高危漏洞的根源,就是Gateway在消息转发过程中,把这两类流的边界模糊了。具体来说,实现层在解析消息时只检查了"消息格式是否合法",却没有严格验证"消息发起方是否有权限发起这类指令"。消息格式合法,不代表消息内容可信,这两件事在安全设计里经常被混为一谈。
提示:这是AI Agent类产品最常见的安全设计缺陷——我们花大量精力调优模型能力,却忽略了工具调用的源头校验。大模型本身没有执行权限,执行权限是架构师给你的;架构不设防,大模型只是傀儡,傀偶背后站的是攻击者。这句话值得你贴在工位上。
2.3 默认本地监听不等于安全
很多OpenClaw用户习惯用127.0.0.1跑Gateway,觉得本地监听就安全了。但本地监听的接口依然存在三个实际风险:
第一,浏览器里的恶意网页可以通过WebSocket跨域连接本地端口,如果服务端没校验Origin头,这就相当于打了个洞。
第二,本机其他进程一旦被植入恶意代码,就可以直接访问这个端口,不需要任何额外权限。
第三,Docker部署时端口映射容易误暴露到宿主机外网,这是我在实际操作中见过最多的情况。
我还见过一种更隐蔽的配置:有人为了方便在手机上管理,把Gateway改成了监听0.0.0.0,还在路由器上做了端口映射。这么一搞,等于把OpenClaw的管理入口直接挂到了公网,而且没有认证。这种状态下,被扫描到基本上只是时间问题。
3. 漏洞根因:指令与数据不分家,信任边界被绕过
3.1 逐层看指令流转,问题出在哪一环
先看一条正常请求在OpenClaw内部的完整流转路径:
- 用户在微信里给机器人发消息:"帮我看看今天磁盘还剩多少"
- 微信适配器把请求通过HTTP或WebSocket传给Gateway
- Gateway将消息包装成Agent能理解的对话格式,放入会话上下文
- Agent运行时调用大模型推理,大模型返回一个"工具调用意图",比如执行命令df -h
- Agent运行时执行这个工具调用
- 执行结果返回给Agent,Agent整理成自然语言回答,经Gateway回传给微信
这个链路本身是合理的,漏洞就出在第3步到第5步之间的信任跳转。Gateway负责把外部消息转成Agent上下文,但出问题的版本在实现中允许外部消息携带"工具调用结果"或者"工具调用指令"这类高级字段。
正常来说,这类字段只能由Agent运行时内部生成。可如果Gateway把外部上传的字段也原样塞进上下文而不做过滤,攻击者就可以伪造一个"已经经过认证的工具回包",直接让Agent以为它刚刚调用了一个工具并且拿到了结果,而实际上这个"结果"是攻击者编造的。一旦Agent基于伪造的工具结果继续推理,下一步动作就在攻击者的掌控之中了。
3.2 攻击者最常用的三种利用手法
基于这类漏洞的实际利用案例,攻击者通常会选下面三条路:
**第一种:伪造工具结果,诱导模型执行后续指令。**把恶意文本伪装成某个工具的返回内容。大模型看到"工具执行成功,结果是XXX"这种格式,通常会基于它继续推理。如果攻击者把这句"结果"编得足够像内部输出,模型很容易跟着去做下一步操作,比如访问一个恶意内网地址,或者把文件内容打包传到一个公网服务器。
**第二种:直接注入系统级指令。**如果Gateway对消息里的角色字段校验不严,攻击者会尝试把消息伪装成"system"角色。在主流大模型API里,system角色的优先级高于普通用户消息,能直接影响后续整个对话的行为。这种注入一旦成功,Agent就等于被重新"编程"了,而且在日志里看起来像是一次正常的系统配置变更。
**第三种:利用工具内部的命令拼接漏洞。**OpenClaw里有不少工具会调用本机命令,比如搜索、文件处理、网络请求。当Gateway把攻击者控制的参数直接透传给这些工具,而工具内部又用字符串拼接组装命令时,就会形成命令注入。拿一个典型的搜索工具举例,它本来该执行grep -r "关键词" /data,攻击者把关键词换成带分号和管道符的恶意内容,就可能让目标机器去下载执行攻击者的脚本。
3.3 为什么攻击者愿意在Gateway上花这么大力气
攻击者选Gateway下手,不选别的组件,是因为它的位置太特殊了。Gateway连接外部和Agent,是所有会话和工具调用的必经之路。只要拿下了Gateway,攻击者就不需要再琢磨怎么绕过模型的安全对齐,不需要费劲构造越狱prompt——因为工具的调用权限是Agent自己拥有的,攻击者要做的是"借用"而不是"破解"。
传统挖洞里最费劲的部分,是找到一条能到达执行点的高权限路径。而在AI代理架构里,Gateway本身就是一条现成的高权限路径。所以你会看到,这类漏洞在漏洞收购平台上的报价一直不低,不是因为技术多难,而是因为利用链又短又稳。
4. 攻击链路复盘:从端口探测到Agent持久化后门
4.1 攻击的前置条件
进入攻击复盘之前,先讲清楚利用条件。网络安全里讲究"利用前条件",条件越少越危险。OpenClaw Gateway这类漏洞如果被利用成功,通常意味着存在以下至少一种情形:
- Gateway未设置访问令牌,且监听地址暴露在局域网或公网
- Gateway虽然监听在127.0.0.1,但服务端没有校验WebSocket的Origin头,导致恶意网页可以跨域连接
- 通过Docker端口映射,把Gateway端口误暴露到宿主机外网
- Agent使用的模型API密钥泄露,攻击者直接借API通道投喂构造消息
这些情形里,最常见的是第一种和第三种。尤其是Docker部署,默认端口映射会把容器内端口暴露到宿主机0.0.0.0,如果宿主机本身有公网IP,那就是整个大门敞开。
4.2 攻击者视角的五个阶段
下面我按攻击者的操作路径做个复盘。说明一下:这里只做安全研究的演示,不给完整可利用的payload,重点帮助你理解攻击思路,而不是提供攻击工具。
**第一步:发现目标。**攻击者对互联网地址段做端口扫描,筛选出开放了OpenClaw默认Gateway端口的机器。这类端口有一些特征,比如响应特定路径时返回JSON格式的错误信息,或者HTTP头里带特定Server标识。部署过OpenClaw的机器在公网上并不算稀少,所以这步命中率不低。
**第二步:探测接口行为。**攻击者向Gateway的已知路由发一个正常的测试请求,观察返回内容。如果返回结构里包含会话ID、消息ID、角色字段,攻击者基本就能推断出内部消息协议。只要协议格式拿到了,后续的构造就只是时间问题。
**第三步:构造恶意消息。**攻击者按照协议格式,构造一条包含恶意工具调用操作的消息,并伪装成"工具返回结果"。因为Gateway没做来源校验,这条消息会被当作内部消息进入Agent上下文。最理想的状态下,攻击者不需要任何认证。
**第四步:控制Agent执行敏感操作。**Agent开始处理伪造的工具结果后,攻击者就有机会让它执行任意操作。常见目标包括:读取本机环境变量里的云服务商密钥和数据库密码、扫描内网端口、下载并执行恶意脚本。这一步的执行者是Agent,所以系统审计层面看到的是"正常Agent行为",而不是一个可疑的新进程。
**第五步:建立持久化。**攻击者会让Agent把一段持久化脚本写入启动目录或计划任务。这样一来,即使你修复了Gateway漏洞,攻击者留下的持久化后门依然会在下一次开机时自动运行。这一步完成后,攻击者就实现了"开机会自启、长期可回连"的完整后门闭环。
4.3 我建议你跑一遍的本地检测脚本
下面提供一个简单的本地检测脚本,用来判断你的Gateway是否暴露在不该暴露的位置。脚本只做网络连通性测试,不发送任何恶意payload,可以放心在你的机器上跑:
python复制import socket
def check_port_binding(host, port):
try:
with socket.create_connection((host, port), timeout=3) as conn:
return True
except OSError:
return False
# 根据你的实际部署情况替换端口
targets = [
("127.0.0.1", 1572),
("0.0.0.0", 1572),
]
for host, port in targets:
if check_port_binding(host, port):
print(f"[!] {host}:{port} 可以连接,请确认这是你预期中的暴露")
else:
print(f"[+] {host}:{port} 无法连接,绑定或防火墙生效")
这个脚本逻辑很简单,作用是帮你确认两件事:一是确认Gateway实际监听在哪些地址上;二是确认防火墙规则是否真的把外部访问挡在了外面。我在排查线上服务时,发现不少"自认为安全"的部署,真正跑一遍脚本才发现监听地址是0.0.0.0。
4.4 从攻击链路反推防御优先级
复盘完攻击链路,防御优先级其实就非常清晰了:
| 攻击阶段 | 对应防御手段 | 优先级 |
|---|---|---|
| 发现目标 | 关闭公网端口映射,用防火墙限制来源IP | P0 |
| 探测接口 | 为Gateway启用访问令牌,隐藏内部错误信息 | P0 |
| 构造恶意消息 | 升级到修复版本,Gateway侧增加来源字段校验 | P1 |
| 控制Agent执行 | 最小化Agent权限,使用沙箱隔离运行环境 | P1 |
| 建立持久化 | 监控Agent日志,限制文件系统写入目录 | P2 |
5. 我的一次实测排查:从日志异常到确认Gateway暴露
5.1 第一步:先压住进程,看端口和连接
我有一次接手同事的OpenClaw部署排查,第一眼就是翻日志,结果被海量INFO刷花了眼。后来我养成了一个习惯:先不看日志,先摸端口和连接状态。
bash复制ss -tlnp | grep -E '(1572|9009|57321)'
重点看两件事:监听地址是127.0.0.1还是0.0.0.0;当前有没有来自非本地IP的ESTABLISHED连接。如果监听地址是0.0.0.0,基本可以断定Gateway暴露到了外部网络。这时候不管有没有实际被攻击,都要先把它改回127.0.0.1。这是最快的止血动作。
那次排查里,同事的OpenClaw就监听在0.0.0.0:1572,而且这台机器有公网IP。我用另一台跳板机试着访问,发现竟然能拿到接口的JSON响应,里面字段清清楚楚。那一刻基本可以确认,这台机器已经在公网"裸奔"了。
5.2 第二步:翻日志,定位异常消息特征
OpenClaw的日志里,正常的工具调用记录会带完整的请求上下文。而攻击行为通常会留下几个比较明显的特征:
- 消息里出现多个"system"角色转写,正常对话里很少出现
- 工具调用参数里带有分号、管道符、base64字符串等特殊字符
- Agent回复中出现不应该出现的路径或文件名
- 同一个时间窗口里,Agent主动发起了多个无关联的敏感操作
看到这些特征,不要急着清理日志,先把日志归档拷贝一份。我在处理事故时有个原则:先保全证据,再谈修复。日志一旦被滚动覆盖,事后溯源就无从谈起了。
5.3 第三步:验证是否存在未授权访问
验证这步要特别小心,不要真的去发攻击payload,只做"握手级别"的验证。用curl简单看下Gateway端口的响应头,判断是否存在认证机制:
bash复制curl -i --max-time 5 http://127.0.0.1:1572/api/state 2>/dev/null | head -20
如果返回200且带业务数据,说明接口没鉴权;如果返回401或403,说明至少有一层访问控制。这个方法在本地测试环境是安全的,但如果你要复制到生产环境,请先确认你具备运维授权,别为了做实验把自己搭进去。
那次排查的结果让我印象很深:同事的Gateway不仅没鉴权,甚至没有日志审计。也就是说,就算有人进来过了,我们也无法知道对方做了什么。这种"黑箱子"状态对于安全事故来说是最难处理的。
5.4 第四步:结合时间线做关联定位
如果有多个Agent实例,排查时一定要把时间线对齐。攻击者可能先探测一台,再通过已控制的那台横向访问另一台。比对各实例日志的时间戳,往往能发现从"探测"到"利用"再到"横向移动"的完整链条。再往后,还要检查系统层面对应的计划任务和启动项,看看有没有被动过手脚。
那次事件最终的结论是:没有发现明显的命令执行痕迹,但Agent的会话目录里出现了好几段来自同一IP的异常工具调用请求,时间集中在凌晨两点到四点。虽然没抓到实锤,但我们还是按遭遇攻击的标准做了处置:改密、加防火墙、升级版本、补审计。
6. 加固实操:把OpenClaw的安全基线一次性拉起来
6.1 现在立刻要做的事
不管你是个人实验还是生产环境,下面三件事建议现在就去核实执行。
**第一件:修改Gateway绑定地址并启用鉴权。**在OpenClaw配置里把Gateway的host从0.0.0.0改成127.0.0.1。如果确实需要远程访问,务必走带身份认证的上层代理,比如nginx basic auth或者应用层的令牌机制。同时,打开OpenClaw提供的访问令牌开关,并在客户端连接时校验。绑定地址和鉴权是两道独立的门,只做一道是不够的。
**第二件:做好Agent运行环境的沙箱隔离。**不要用root身份运行Agent服务。我见过不少人在云主机上直接用root起OpenClaw,一旦被攻破,攻击者拿到的就是整台机器的root权限,那场面就失控了。正确做法是创建一个专用低权限用户,只给这个用户访问必要目录的权限。如果跑在Docker里,不要挂载宿主机敏感目录,比如/etc、/root、/home。
**第三件:开启日志审计和会话级监控。**确保Agent的日志记录包含每次工具调用的完整入参和返回值。把日志集中收集,配置关键字告警——比如出现/etc/shadow、aws_access_key_id、id_rsa这些字眼时就触发告警。同时,对Gateway的WebSocket连接做频率限制,防止攻击者短时间内大量探测。
6.2 一个可以抄作业的Docker安全基线
下面是一份简化版Docker部署安全基线,你可以根据实际版本调整参数。我的原则是"默认拒绝,按需放行":
yaml复制version: "3"
services:
openclaw:
image: openclaw/openclaw:latest
ports:
# 注意:只绑定回环地址,杜绝公网直连
- "127.0.0.1:1572:1572"
environment:
- OPENCLAW_GATEWAY_HOST=127.0.0.1
- OPENCLAW_ACCESS_TOKEN=${OPENCLAW_ACCESS_TOKEN}
- OPENCLAW_TOOL_BLACKLIST=rm,shutdown,reboot,mkfs
read_only: true
tmpfs:
- /tmp
security_opt:
- no-new-privileges:true
这里做了几件事:网关端口只绑定回环地址;强制启动时注入访问令牌;把危险工具加入黑名单;容器根文件系统只读;临时目录用内存文件系统。如果你的OpenClaw版本不支持其中某些参数,至少要把前三件落实。
6.3 工具调用分级:这是最容易被忽略的一点
长期来看,我强烈建议你按"分级授权"的思路来规划工具调用,而不是给Agent一把万能钥匙。我把工具分成三个等级:
- 只读类:查天气、查股票、搜索网页,可以直接放给Agent自动执行
- 写操作类:发消息、写文件、改配置,需要跟用户确认后再执行
- 高风险类:执行Shell命令、删除文件、访问内网地址,必须走单独的授权通道
分级的意义在于,即使Gateway被攻破,攻击者能调用的也只是只读类工具,没法直接拿到命令执行权限。很多AI代理框架已经支持在工具定义里加"需要用户确认"的开关,只是大多数用户嫌麻烦没开。但你要想清楚:你图方便省下的那几秒确认时间,可能换来的是整台服务器被入侵的代价。
6.4 模型层的安全配置同样不要省
OpenClaw用的底层大模型,无论是远程API还是本地部署的模型,模型层的安全配置也不能忽略:
- 不要在生产环境开"无限记忆"模式,免得攻击者的历史注入一直留在记忆里,每次对话都会激活
- 定期清理Agent的记忆和会话目录,尤其是涉及敏感操作的会话数据
- 如果框架支持工具调用的"用户确认"开关,务必打开,让Agent执行高风险动作前由你确认
注意:很多AI代理框架最近都上了"自动审批工具调用"的功能,看起来方便,但在安全边界没建好之前,这个功能就是灾难性的。宁可牺牲一点便利,也要先把底线守住。我自己宁愿多点两下确认,也不愿意凌晨两点爬起来处理安全事故。
7. 留在最后的个人体会
翻回去看"OpenClaw Gateway高危漏洞把AI代理变成远程控制后门"这个说法,它真正想提醒我们的是:AI代理的能力越强,对运行环境的安全要求就越严格。它不是普通的Web应用,它是有行动能力的"代理人"。传统Web服务的安全策略——打补丁、封端口——只是基础,更重要的是"最小权限"和"信任边界"这两个原则。
我在实际部署AI代理框架的过程中,最大的体会是:安全配置和功能调试要同步进行,不能分开做。很多人喜欢先把Agent跑起来,看到它能写代码、能调接口、能回微信消息,兴奋劲过去了才想起来看安全配置。这时候如果已经运行了一段时间,日志滚了好几轮,攻击痕迹早就被淹没了。我自己踩过类似的坑,现在不管部署什么Agent框架,第一件事永远是先把访问令牌、IP白名单、日志审计配好,然后再开始调试功能。
最后再分享一个小技巧:AI代理的日志别只留一两天,至少保留30天。别因为日志文件太大就随便截断——那些看似噪音的工具调用记录,往往能还原一次完整的攻击时间线。真出了事,它能帮你省下大量排查时间。另外,给Agent配置一个独立的工作目录,别让它能随手碰到系统盘,这能很大程度降低"一个命令删库跑路"的风险上限。
