CVE-2025-61786CVE-2025-61786是Deno JavaScript/TypeScript/WebAssembly运行时中的一个权限模型绕过漏洞。在2.5.3和2.2.15之前的版本中,`Deno.FsFile.prototype.stat`和`Deno.FsFile.prototype.statSync`方法未受到`--deny-read=./`权限检查的限制。这意味着即使脚本以`--deny-read`权限运行,用户仍然可以通过已打开的文件句柄获取文件的元数据信息(如文件大小、修改时间、权限等),从而绕过Deno的权限安全模型。类似的标准API如`Deno.stat`和`Deno.statSync`需要`allow-read`权限才能执行,但通过先以仅写权限打开文件,再调用stat方法,攻击者可以在不拥有读权限的情况下获取文件敏感信息。该漏洞的CVSS评分为3.3,属于低危级别,但作为权限沙箱绕过漏洞,对依赖Deno权限模型保障安全的应用程序构成潜在威胁。Deno团队已在2.5.3和2.2.15版本中修复了此问题,通过对FsFile的stat方法实施与普通stat API一致的权限检查来修复该漏洞。
Deno运行时设计了一套基于权限的安全沙箱模型,用户可以通过`--allow-read`、`--deny-read`等命令行参数控制脚本对文件系统的访问权限。在正常情况下,调用`Deno.stat()`或`Deno.statSync()`需要`allow-read`权限,否则在权限不足时会抛出PermissionDenied错误。然而,该漏洞的根本原因在于`Deno.FsFile.prototype.stat`和`Deno.FsFile.prototype.statSync`方法的权限检查逻辑存在缺陷:当一个文件以仅写模式(如`write`、`append`、`writeSync`等)打开时,Deno不会检查该文件是否在`--deny-read`范围内,允许通过文件句柄直接调用stat方法获取文件元数据。攻击者利用方式如下:首先使用`Deno.open()`以写权限打开目标文件(不需要读权限),然后调用`file.stat()`或`file.statSync()`方法获取文件的stat信息(包括文件大小、修改时间、inode信息、权限位等),从而绕过权限模型获取敏感元数据。该漏洞属于典型的权限检查不一致问题(Inconsistent Permission Enforcement,CWE-732),利用条件为本地攻击、需要低权限认证且无需用户交互。