当用户或其他不可信源提供的路径未经检查而与父路径组合时,路径遍历漏洞就可能发生。问题在于路径的“路径遍历”组件允许导航出父文件夹。
例如,如果您要组合以下两个路径(绝对路径和相对路径):
Base/absolute path: C:\WebData
Relative/user path: ..\windows\system32\
那么这将产生:
C:\windows\system32\
正如你可以想象的那样,让某人读取或写入这个目录,这不是预期的WebData
目录,可能是一个巨大的问题,因为它可能导致某人了解有关您的系统的信息或放置危害系统的漏洞,从而将系统控制权交给恶意行为者。
You can 阅读有关此漏洞的更多信息.
要正确处理此漏洞,需要确保与父路径结合的相对路径是安全的。以下是一些确保这一点的方法:
- 相对路径来自已知的可信来源,例如经过审查的内部列表。
- 相对路径之前已被检查并以确保可以将其与不可信路径区分开的方式存储/维护,并且同时不能被用户或不可信代理修改。例如,将路径保存在字符串中是bad主意。相反,你会做一些类似创建一个
TrustedPath
实际上,代码只能通过运行检查路径是否安全的代码来获取该类的实例。
- 组合后检查生成的路径以确保其位于正确的位置。
您可以像这样执行最后一项(以下所有内容):
- (作为避免不必要的异常的良好做法),使用
Path. GetInvalidFileNameChars()
检查(不受信任的)相对路径中是否存在无效字符。
- Perform
Path.Combine()
正如你所做的那样。
- 确保生成的路径仍在原始父路径内。这可以通过简单地确保生成的路径以父路径开头来完成,但这可能存在问题。所以考虑像这样的答案或其他确保结果路径的代码truly所需文件夹的后代。
完成所有这些操作后,如果仍然显示“路径遍历”警告,您可以使用代码质量/安全检查工具中的菜单选项将此路径遍历实例注释为安全。您可能还想添加注释,解释为什么将其标记为安全,其中可能包含指向此 SO 问题或其答案之一的链接。
Note 1
重用已证明可以与特定绝对路径组合的相对路径时要小心。考虑以下:
Base/absolute path: C:\WebData\FormElements\SuperForm\windows\
Relative/user path: ..\windows\
这两个路径可以安全地组合,但这并没有证明相对路径始终可以安全地使用any绝对路径。
Note 2
小心你如何处理这件事。假设相对路径遍历总是以..\
是一个错误。以下是有效的相对路径:folder\..\..\wheeeWeGotOut
.
Note 3
另一个答案提出,可以通过简单地删除无效字符并禁止包含以下内容的路径来保证安全性:..
or :
。由于多种原因,这是有问题的:
-
许多非 Windows 文件系统(例如 HFS 或 Linux)中的文件可以合法地具有这些字符。例如,a:filename
and another..filename
完全没问题(我刚刚测试过它们)。限制这些字符会限制用户可以执行的操作。
-
尝试改进过滤以允许合法用例通过并不是一个好主意。你怎么知道你已经正确编写了这段代码并且没有错过边缘情况?
-
But 最重要的是:如果用户允许的路径中有一个意外的符号链接指向文件系统中其他位置的文件怎么办?如果用户能够编写可用作符号链接的文件,或者有其他漏洞导致写入或复制此类文件,该怎么办?路径利用可能不是孤立的。它通常是小型漏洞利用的组合,导致大型漏洞利用(下一个漏洞与前一个漏洞交叉或升级)。这only确保文件或目录位于正确位置的安全技术是,在完成所有其他过滤、传递和组合之后,检查结果是否仍在预期位置内或者是直接后代(注意符号链接) 。
-
至于硬链接——那是另一回事了。祝一切顺利。不要建立硬链接。很难判断硬链接是否存在,因为它是低级修改。如果您有兴趣,请阅读它。