Fortify Path Manipulation错误

时间:2014-01-21 15:58:41

标签: security fortify

Fority Scan在以下代码段中报告了“Path Manipulation”安全问题

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);
}

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

1 个答案:

答案 0 :(得分:1)

首先,SCA是一个静态分析工具,因此无法检查您的自定义验证以确定它是否正常工作,因为这是一个动态工具,如WebInspect旨在做的事情。

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

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

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

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

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