CVE-2025-61785CVE-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方法中添加与文件打开模式一致的权限检查,确保只有以写权限打开的文件才能修改时间戳。