打开文件流进行写入 - 加强路径操作

本文关键字:路径 操作 文件 | 更新日期: 2023-09-27 18:36:31

希望解决用于解决打开文件的强化发现(路径操作):

public FileStream OpenFile(string directory, string filename)
{
    FileStream fs = null;
    string pathname = string.Empty;
    pathname = Path.Combine(directory, filename);
    fs = new FileStream(pathname , FileMode.OpenOrCreate);
    return (fs);
}

此代码在 .NET 应用程序中运行,但不写入虚拟目录。

Fortify 帮助/建议指示将有效目录列入白名单,但这无异于对应用程序中的目录进行硬编码。它可能很安全,但不是一个好的编程实践。

提前致谢

打开文件流进行写入 - 加强路径操作

@James Nix提供了Fortify发现漏洞的原因(在评论中):

您之所以获得此结果,是因为此方法接受"用户提供的"路径和文件名。如果攻击者向此方法发送参数directory=C:'Windowsfilename=notepad.exe,如果您的应用程序具有该文件的写入权限,则他们可能会用恶意内容覆盖notepad.exe。– 詹姆斯·尼克斯 1 月 6 日 17:17

如果您有兴趣修复漏洞,则需要:

  1. 如果可能,请将方法签名从公共签名更改为私有签名。
  2. 为提供的文件路径提供固定前缀(如"D:''Temp''"或"files_root"),您可以将其添加到应用程序配置中。
  3. 文件名参数中不允许使用"/"或"''"或".."或":"。或者如果合适,只需限制为 8.3 之类的内容。
  4. 不要在路径参数中允许".."或":"。或者只是限制为可接受的字符范围(例如 a-z)。
  5. 不要返回打开的文件流对象。您将失去对它是否关闭的控制(拒绝服务漏洞)。相反,获取所需的数据并在从方法返回之前关闭 FileStream。

如果需要更有针对性的修正建议,则需要描述应用程序需要使用此方法执行的操作。

在调用 FileStream 之前,您需要添加代码来检查"目录"和"路径名"以确保它们在系统上的存在。 对于 .NET,可以使用 stat() 函数进行检查。