【问题标题】:How to resolve External Control of File Name or Path (CWE ID 73)如何解决文件名或路径的外部控制 (CWE ID 73)
【发布时间】:2018-11-23 13:54:42
【问题描述】:

我正在努力解决我的应用程序中的 Veracode 问题。 Veracode 在以下代码中突出显示了“文件名或路径的外部控制 (CWE ID 73)”缺陷。

Thread.currentThread().getContextClassLoader().getResourceAsStream(lookupName)

如何验证参数?如果我需要使用下面的 ESAPI 验证,那么我应该在 getValidFileName() 方法中传递的确切参数是什么。目前我正在传递如下参数。

ESAPI.validator().getValidFileName(lookupName, lookupName,
          ESAPI.securityConfiguration().getAllowedFileExtensions(), false);

请纠正我是否采用了正确的方法来解决此问题。

【问题讨论】:

    标签: java security esapi veracode


    【解决方案1】:

    有几个建议在:https://community.veracode.com/s/article/how-do-i-fix-cwe-73-external-control-of-file-name-or-path-in-java

    如果这些文件存储在服务器端,您可以使用硬编码值。 (即:在 HashMap 中)。

    另一种解决方案是使用自定义验证器(来自 veracode 页面):

    // GOOD Code
    String extension = request.getParameter("extension");
    File f = new File(buildValidAvatarPath(extension))
    
    @FilePathCleanser
    public String buildValidAvatarPath(extension) {
      String[] allowedExtensions = new String[]{"jpg","gif","png"};
      String extension = "png"; // Default extension
      for (String allowedExtension: allowedExtensions) {
        if (allowedExtension.equals(request.getParameter("extension"))) {
          extension = request.getParameter("extension");
        }
      }
      // See "Note on authorization"
      User user = getCurrentUser();
      if (!userMayAccessFile(user, path)) {
        throw new AuthorizationException("User may not access this file", user);
      }
      File(configPath + "avatar." + extension)
    
      return path;
    }
    

    【讨论】:

      【解决方案2】:

      好的,问题是您允许用户控制该文件路径。想象一下它在一个 UNIX 机器上,然后他们输入:

      ../../../../../../../etc/shadow
      

      授予运行 java Thread 的用户的任何用户权限都可能暴露给相关用户。我不知道您的应用程序中正在进行什么处理,但危险是您需要阻止用户控制该 lookup 变量。

      您进行的调用与ValidatorTest.java 中的单个测试一致,这绝对是代表我们代码覆盖率的缺陷。

      现在,即使您使用此调用,Veracode 仍然很有可能会标记它:ESAPI.properties 中的默认文件列表需要根据您的用例截断,或者您必须创建您的为您的特定用例提供合法文件扩展名的验证器规则。

      这带来了下一点:There's a lot of mischief that can happen in regards to file uploads.

      简而言之,实际上要确保文件上传的安全将需要比 ESAPI 当前提供的更多功能,不幸的是,这只是扩展检查。在您的特定情况下,请确保您尝试了一些目录遍历攻击。并使用该 OWASP 链接来帮助分析您的应用程序。

      鉴于 OP 想要解决 Veracode 中的问题,您可能需要链接几个调用:

      ESAPI.validator().getValidDirectoryPath()ESAPI.Validator.getValidFileName()

      但请确保您已正确截断了validator.properties 中HttpUtilities.ApprovedUploadExtensions 中的扩展名列表,因为默认列表过于宽松,至少在我们发布2.1.0.2 之前是这样。

      我必须强调,即使使用这种特殊组合ESAPI 绝对不会阻止用户将“netcat.exe”重命名为“puppies.xlsx”并绕过您的验证检查 em>,这就是为什么在这个答案的第一部分咆哮。

      ESAPI 的文件验证并不安全,总比没有好。

      正确地执行此操作需要比仅使用 1-2 次 ESAPI 调用更多的工作。

      免责声明:在撰写本文时,我是 ESAPI 的项目联合负责人。

      【讨论】:

      • 问题是如何验证文件路径?你有答案吗?
      • @d.Siva 但我的意思是:ESAPI 根本没有真正验证文件。是保安剧场。您将拥有一个被验证为目录并被验证为位于扩展白名单中的字符串。它仍然从根本上不安全,这就是为什么我最初没有完整回答这个问题。
      猜你喜欢
      • 2020-07-25
      • 2016-03-06
      • 2021-11-05
      • 2020-12-25
      • 2014-09-04
      • 2013-12-22
      • 2016-09-13
      • 2012-03-23
      • 2010-09-20
      相关资源
      最近更新 更多