CVE-2025-58747CVE-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://等安全协议。