5

Fority Scan 在以下代码段中报告了“路径操作”安全问题

String filePath = getFilePath(fileLocation, fileName);
final File file = new File(filePath);
LOGGER.info("Saving report at : " + filePath);
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(file));
fileWriter.write(fileContent);

所以我正在检查 fileLocation 中的黑名单字符并抛出异常,但 Fortify 仍在抛出异常。

try {
    String filePath = getFilePath(fileLocation, fileName);
    if (isSecurePath(filePath)) {
      final File file = new File(filePath);
      LOGGER.info("Saving report at : " + filePath);
      BufferedWriter  fileWriter = new BufferedWriter(new FileWriter(file));
      fileWriter.write(fileContent);
    } else {
      throw new Exception("Security Issue. File Path has blacklisted characters");
    }

} catch (final Exception e) {
    LOGGER.error("Unable to prepare mail attachment : ", e);
    message = "Mail cannot be send, Unable to prepare mail attachment";
}


private boolean isSecurePath(String filePath) {
    String[] blackListChars = {".."};
    return (StringUtils.indexOfAny(filePath, blackListChars)< 0);
}

我应该忽略扫描报告还是对此有什么正确的解决方法?

4

1 回答 1

1

首先,SCA 是一个静态分析工具,因此无法检查您的自定义验证以确定它是否正常工作,因为这是设计为 WebInspect 等动态工具的目的。

其次,黑名单是保护任何东西的糟糕方法,白名单是更安全的方法,而且您提到对标准输出进行黑名单验证的事实会诱使攻击者。这是因为您必须考虑每一种可能的攻击方式,包括可能尚未发现的方式,因此在软件发布之前很容易过时。

第三,这绝对不足以阻止路径操作,因为您只考虑寻找相对路径的人,更具体地说是当前目录上方的相对路径

您无法检测是否有人指定了完整路径,或者是否有人进入了一个完全指向单独目录的符号链接的目录,以及其他一些可能的替代攻击。

理想情况下,您应该遵循 SCA 显示的建议,并拥有非常具体的允许路径和文件名。如果无法做到这一点,请使用白名单技术来指定允许的唯一字符,然后验证以指定它不是例如 SMB 共享或指定的完整路径。如果它没有根据用户应该指定的规范进行验证,则拒绝它。

这样做会消除问题本身,但 SCA 可能仍会在结果中显示问题(同样由于静态与动态分析之间的差异)。这可以通过对其进行审计或为验证问题的函数创建自定义清理规则来解决。

于 2014-01-22T16:23:40.030 回答