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);
}
我应该忽略扫描报告或者对此有什么正确的解决方法吗?
答案 0 :(得分:1)
首先,SCA是一个静态分析工具,因此无法检查您的自定义验证以确定它是否正常工作,因为这是一个动态工具,如WebInspect旨在做的事情。
其次,黑名单是保护任何东西的一种不好的方式,白名单是更安全的方法,而且你提到对stdout进行黑名单验证的事实会诱使攻击者。这是因为您必须考虑每种可能的攻击方式,包括尚未发现的方式,因此在软件发布之前很容易变得过时。
第三,这绝对不足以阻止路径操作,因为您只考虑寻找相对路径的人,更具体地说是当前目录上方的相对路径
你无法检测某人是否指定了完整路径,或者是否有人进入了一个完全独立目录的符号链接的目录,以及其他一些可能的替代攻击。
理想情况下,您应该遵循SCA提供的建议,并且具有非常具体的允许路径&amp;文件名。如果无法做到这一点,请使用白名单技术指定允许的唯一字符,然后验证以指定它不是例如SMB共享或指定的完整路径。如果它没有根据用户应指定的规范进行验证,则拒绝它。
执行此操作将解决问题本身,但SCA可能仍会在结果中显示问题(同样由于静态与动态分析之间的差异)。这可以通过审核它或为验证问题的函数创建自定义清理规则来解决。