【问题标题】:Security flaw relating to special characters in Windows file paths与 Windows 文件路径中的特殊字符相关的安全漏洞
【发布时间】:2014-07-01 01:53:23
【问题描述】:

我可能在我的 Windows 应用程序中发现了一个安全漏洞。它从用户那里接收一个字符串并应用以下逻辑:

string fileName = userInput + ".notSecret";
return new FileStream(fileName, FileMode.Open, FileAccess.Read);

用户是否可以通过提前终止文件名来输入任何允许他们输入新文件扩展名的字符?

例如:

"secret_file.Secret\0"

【问题讨论】:

  • 在您提出这个问题后的 50 分钟内,您可以在代码中设置断点,按 F5 并自己尝试。只是说。
  • @Tim- 我尝试了大约 20 个不同的特殊字符,包括这个字符,并在谷歌上进行了广泛的搜索。谈到安全性,我宁愿安全也不愿后悔,所以我问了这个 SO 问题,以防我错过了可能的漏洞利用。

标签: c# windows special-characters filenames


【解决方案1】:

您指出的情况很可能不是安全漏洞。首先,.NET 字符串不会被 null 截断,并且可能包含 null 字符。而且,如果你尝试在StreamWriter构造函数中创建一个带有控制字符的文件,包括\0,你会发现它会抛出一个异常:

Unhandled Exception: System.ArgumentException: Illegal characters in path.
   at System.IO.Path.CheckInvalidPathChars(String path, Boolean checkAdditional)
   at System.IO.Path.GetFileName(String path)
   at System.IO.StreamWriter.CreateFile(String path, Boolean append, Boolean checkHost)
   at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize, Boolean checkHost)
   at System.IO.StreamWriter..ctor(String path)

请注意,如果 .NET IO 框架支持备用数据流,存在安全漏洞;用户可以写入“userInput.secret:.notSecret”,强制写入“userInput.secret”的备用数据流。由于 System.IO 类不支持备用数据流,因此会抛出 NotSupportedException 并且不会写入流氓文件。

使用文件扩展名作为安全控制存在潜在的文件系统影响。例如,如果用户将扩展名为 .notSecret 的文件映射为 hard link 到扩展名为 .secret 的文件,则写入其中一个文件也会写入另一个文件(因为在硬链接中,单个文件可以有多个具有不同扩展名的路径)。

假设userInput 是用户提供的原始代码,代码无法清理用户输入。处理来自不受信任来源的输入时,代码应假定为all user input is evil until proven otherwise。如果预期用户的输入是某个值(例如,没有特殊字符),则处理输入的代码应确保它匹配,如果不匹配,则对其进行清理(或抛出异常)。只允许已知好的输入比只禁止已知不好的输入要安全得多。

【讨论】:

  • 感谢您的意见。我一定会消毒的。
猜你喜欢
  • 1970-01-01
  • 2014-11-22
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 2014-02-04
  • 2016-10-10
  • 2016-06-20
相关资源
最近更新 更多