繁体   English   中英

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

[英]Open Filestream For Writing - fortify Path Manipulation

寻找解决打开文件的强化发现(路径操作):

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\\”或 Application("files_root"))提供一个固定前缀,您可以将其添加到您的应用程序配置中。
  3. 不允许在文件名参数中使用“/”或“\\”或“..”或“:”。 或者在适当的情况下限制为 8.3 之类的内容。
  4. 不允许在路径参数中使用“..”或“:”。 或者只是限制在可接受的字符范围内(例如 az)。
  5. 不要返回打开的 FileStream 对象。 您无法控制它是否曾经关闭(拒绝服务漏洞)。 相反,在从方法返回之前获取您需要的数据并关闭 FileStream。

如果您想要更有针对性的补救建议,您需要描述您的应用程序需要使用此方法做什么。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM