3

我需要阅读保存在 user_home 文件夹中的属性文件。

PropsFile = System.getProperty("user.home") + System.getProperty("file.separator")+ "x.properties"; 

Fortify 在这一行中给出了路径操作错误。正确值的数量很大,因此黑名单是唯一可能的方法。所以为了避免它我改变了代码如下。

String propsFile = null;
StringBuffer sb = new StringBuffer();
String xProperties = "x.properties";
String userHome = System.getProperty("user.home");  // *
if(userHome.contains("..\\"))
 userHome = userHome.replace("..\\", "");
if(userHome.contains("../"))
 userHome = userHome.replace("../", "");
if(userHome.contains("./"))
 userHome = userHome.replace("./", "");

String fileSeperator = System.getProperty("file.separator");    // *
  if(fileSeperator.equals("/") || fileSeperator.equals("\\")){
    sb = sb.append(userHome).append(fileSeperator).append(xProperties);
    propsFile = sb.toString();
  }

但仍然 fortify 在 (*) 标记行中给了我相同的错误(尽管验证已完成)。我怎样才能消除错误?

4

1 回答 1

2

我敦促您考虑安全漏洞,而不是尝试删除 Fortify 错误。

问题是 user.home 可以被精心设计,可能使用 -D vm 参数,以允许打开或销毁系统上任何位置的任何名为 x.properties 的文件。例如,将 user.home 设置为 /usr/local 不会被您的黑名单检测到。然后可以读取或覆盖任何名为 /usr/local/x.properties 的文件。

您需要质疑为什么 user.home 的任何值都可以被允许。您需要检查从 user.home 获得的路径是否从某个位置(例如 /home)开始。这称为白名单验证,是一种常见且众所周知的安全漏洞修复方法。一旦您确定提供的路径在已知位置具有根目录,那么您是否将您的目录横向列入黑名单。

我知道这很痛苦,但是仅通过黑名单来解决这个问题的尝试充满了危险,并且永远无法解决问题。这是一个真正的安全问题,而不仅仅是 Fortify 错误。

于 2014-07-28T22:30:43.420 回答