Windows UNC路径中设备名路径遍历漏洞深度分析

本文详细分析了Node.js在Windows UNC路径处理中存在的设备名路径遍历漏洞,即使已修复CVE-2025-27210,该漏洞仍允许攻击者通过CON、PRN等设备名绕过目录限制,访问网络共享中的敏感文件。

Windows设备名在UNC路径中仍允许路径遍历(CVE-2025-27210修复后)

摘要

我发现Windows设备名(CON、PRN、AUX等)在处理UNC网络路径时仍可用于路径遍历攻击,即使在CVE-2025-27210补丁之后。基本上,该修复仅覆盖了常规路径,但遗漏了使用path.join()时的UNC路径场景。

漏洞描述

在测试最近的CVE-2025-27210修复时,我注意到一些情况。该补丁对常规路径有效——如果我尝试path.normalize('CON:../../secret.txt'),它会正确返回.\CON:..\..\secret.txt。很好,这已修复。

但当我开始测试UNC路径(如\\server\share这样的网络路径)时,发现漏洞仍然存在。问题是当你在UNC路径中使用path.join()和设备名时,设备名会被剥离,路径遍历发生。

具体示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
const path = require('path');

// 已修复(常规路径)
console.log(path.normalize('CON:../../secret.txt'));
// 输出: .\CON:..\..\secret.txt ✓

// 但仍易受攻击(UNC路径)
console.log(path.join('\\\\server\\share\\uploads', 'CON:../../secret.txt'));
// 输出: \\server\share\secret.txt ✗
// 应为: \\server\share\uploads\.\CON:..\..\secret.txt

这是因为path.join()内部的normalize函数处理UNC路径的方式与常规路径不同。

复现步骤

  1. 使用任何Node.js版本,包括最新的v24.4.1(带有CVE-2025-27210修复)
  2. 创建一个简单的测试文件:
1
2
3
4
5
6
7
8
const path = require('path');

function getNetworkFile(userInput) {
  const basePath = '\\\\fileserver\\public\\uploads';
  return path.join(basePath, userInput);
}

console.log(getNetworkFile('CON:../../../private/passwords.txt'));
  1. 运行代码
  2. 预期结果:\\fileserver\public\uploads\.\CON:..\..\..\private\passwords.txt
  3. 实际结果:\\fileserver\public\private\passwords.txt(逃出了uploads目录!)

与CVE-2025-27210的不同之处

我知道你在想——“我们不是刚修复了这个吗?”嗯,算是。CVE-2025-27210通过添加.\前缀来修复常规路径的设备名问题。但该修复仅适用于直接的normalize()调用或常规本地路径。

区别:

  • CVE-2025-27210:修复了本地路径的path.normalize('CON:../')
  • 此漏洞:使用path.join()时,UNC路径如\\server\share + 设备名仍然易受攻击

这本质上是在网络场景中对CVE-2025-27210修复的绕过。

缓解措施

要修复此问题,应在path.join()函数中对UNC路径应用相同的设备名验证逻辑。具体来说,当连接以\\开头的路径时,代码需要检查设备名并添加.\前缀,就像对常规路径所做的那样。

修复可能需要放在normalize函数的UNC路径处理部分,围绕处理以\\开头的路径的地方。

影响

攻击者可以读取Windows网络共享上预期目录之外的文件:

  • 文件共享应用程序(逃到其他用户的文件夹)
  • 使用UNC路径的云存储系统
  • 企业网络共享(访问敏感文档)
  • 任何从网络位置提供文件的Node.js应用程序

此外,这可能导致企业网络中的横向移动——想象从\\webapp\public逃到\\webapp\C$\Windows\System32\config甚至其他服务器如\\adminserver\C$

技术讨论

在后续的讨论中,Node.js团队指出他们的威胁模型假设用户必须在使用path.join()fs.readFileSync()之前对输入进行清理。他们认为这是预期的行为,但可以被视为一个错误——愿意在公共版本中修复它,但根据Node.js政策,这不被视为漏洞。

然而,报告者指出这与CVE-2025-27210的处理不一致,该CVE修复了相同的问题(设备名路径遍历),但仅针对常规路径。这种不一致性造成了安全漏洞,开发者在更新Node.js后认为他们受到设备名攻击的保护,但在使用UNC路径时并未受到保护。

最终,Node.js团队审查了此报告和先前已发布CVE的报告,最终声明是他们忽略了这些CVE;根据他们的威胁模型,这些不应被视为漏洞,而是常规错误。他们更新了威胁模型以明确这一区别。

结论

此漏洞突显了安全修复中的一致性重要性,以及全面测试所有可能攻击场景的必要性。虽然Node.js团队最终认为这不是一个漏洞,但报告揭示了在修复安全问题时可能遗漏的边缘情况。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计