【问题标题】:Veracode directory traversal Issue c#Veracode目录遍历问题c#
【发布时间】:2015-11-19 05:16:33
【问题描述】:

我有这个将文件存储到服务器的代码:

function void StoreFile(string inputFileName) {
   ...

   var extension = Path.GetExtension(inputFileName);
   if(extension == ".csv") {
       var fileName = string.Format("{0}_{1}{2}", Session.SessionID, new Guid(), extension);

       var dataFileServerPath = _documentService.getPath(fileName, UserProfile.UserName, UserProfile.SourceID);

       if(!string.IsNullOrEmpty(dataFileServerPath)) {
           try {
              using(FileStream dataFile = new FileStream(dataFileServerPath, FileMode.Create))  { .... }
           }
           cathc(Exception e) { ... }    
       }
    }    
    else {
        throw new NotSupportedFormatError();
    }
}

在 Veracode 分析之后,我在FileStream dataFile = new FileStream(dataFileServerPath, FileMode.Create) 线上遇到了 Directory Traverse Issue

为什么会出现这个问题,我检查了文件扩展名是否对我的案例有效,并在 fileName.xml 中传递了该值。这是安全问题吗?如何解决?

_documentService.getPath 只是附加 web.config 中的路径和特定用户的文件名,它与用户输入无关。

【问题讨论】:

    标签: c# asp.net security veracode


    【解决方案1】:

    根据您在此处发布的代码,这看起来像是误报。

    Veracode 显然正在跟踪 inputFileName 变量(我假设它包含未经验证的用户输入),并指出它会影响 extension 变量。由于您后来将extension 直接嵌入到文件名中,并读取了指向的文件,Veracode 发现恶意用户可能会在 inputFileName 中嵌入部分路径,然后更改目标文件的目录...

    在这种情况下,Veracode 缺少您已经执行输入验证(extension == ".csv" 检查)的事实,并且绝对将输入的相关部分限制在严格的白名单中。

    假设您的问题没有遗漏其他相关代码,这可以安全地标记为误报。

    【讨论】:

    • 感谢您的回答。附言。在其他情况下如何验证用户输入(例如 inputFileName)而不收到 Veracode 问题?
    • 好吧,既然在插入点您已经知道要插入的值是“.csv”,为什么不直接插入呢? :-)
    • 另外,对于一般情况,这似乎是 Veracode 中的错误,具体取决于规则的定义方式。其他产品允许您微调验证规则,不确定 Veracode 的当前解决方案。一般来说,你的方法应该是验证你是否正确地完成了验证,而不用担心验证它的工具。
    【解决方案2】:

    静态分析器没有真正的方法来可靠地验证您是否确实没有使用用户输入。他们往往会因过于谨慎而犯错,从而产生误报。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多