下面简单的Java代码变得Fortify的路径操作错误。 请帮我解决这个问题。 我从很长一段时间挣扎。
public class Test {
public static void main(String[] args) {
File file=new File(args[0]);
}
}
下面简单的Java代码变得Fortify的路径操作错误。 请帮我解决这个问题。 我从很长一段时间挣扎。
public class Test {
public static void main(String[] args) {
File file=new File(args[0]);
}
}
看着为OWASP页面路径操作 ,它说
攻击者可以指定在一个操作中使用在文件系统中的路径
您正在打开一个文件由用户给定的输入定义。 您的代码几乎是漏洞的一个很好的例子! 或
或重新考虑你的应用程序的设计。
尝试使用它之前正常化网址
https://docs.oracle.com/javase/7/docs/api/java/net/URI.html#normalize()
Path path = Paths.get("/foo/../bar/../baz").normalize();
或者从org.apache.commons.io.FilenameUtils正常化使用
https://commons.apache.org/proper/commons-io/javadocs/api-1.4/org/apache/commons/io/FilenameUtils.html#normalize(java.lang.String)
Stirng path = FilenameUtils.normalize("/foo/../bar/../baz");
对于这两种结果将是\baz
只允许alnum并输入一个时期。 这意味着你过滤掉控制字符,“”,‘/’,‘\’,这将让你的文档脆弱。 例如,一个人不应该能够进入/path/password.txt。
一旦完成,重新扫描,然后运行Fortify的AWB。
我有一个解决Fortify的路径操作的问题。
它是什么抱怨是,如果你从外部源获取数据,然后攻击者可以使用该源来操纵你的路径。 因此,使攻击者也删除文件或以其他方式危害您的系统。
该建议的补救办法解决这个问题是使用受信任的目录,输入有效的白名单; 并且,拒绝一切。
该解决方案并不总是在生产环境中是可行的。 所以,我建议的替代解决方案。 解析为可接受的字符的白名单的输入。 从输入拒绝,任何字符,你不希望在的路径。 它可以被移除或替换。
下面是一个例子。 这不通过Fortify的审查。 重要的是要记住这里返回字面,而不是被检查的字符是非常重要的。 Fortify的跟踪,从原始输入进来的零件。 如果你使用的任何原始输入的,你可能仍然得到错误。
public class CleanPath {
public static String cleanString(String aString) {
if (aString == null) return null;
String cleanString = "";
for (int i = 0; i < aString.length(); ++i) {
cleanString += cleanChar(aString.charAt(i));
}
return cleanString;
}
private static char cleanChar(char aChar) {
// 0 - 9
for (int i = 48; i < 58; ++i) {
if (aChar == i) return (char) i;
}
// 'A' - 'Z'
for (int i = 65; i < 91; ++i) {
if (aChar == i) return (char) i;
}
// 'a' - 'z'
for (int i = 97; i < 123; ++i) {
if (aChar == i) return (char) i;
}
// other valid characters
switch (aChar) {
case '/':
return '/';
case '.':
return '.';
case '-':
return '-';
case '_':
return '_';
case ' ':
return ' ';
}
return '%';
}
}
Fortify的意志标志即使路径/文件并非来自像一个属性文件中用户输入的代码。 处理这些最好的办法是先规范化的路径, 然后验证它与允许路径的白名单。
坏:
public class Test {
public static void main(String[] args) {
File file=new File(args[0]);
}
}
好:
public class Test {
public static void main(String[] args) {
File file=new File(args[0]);
if (!isInSecureDir(file)) {
throw new IllegalArgumentException();
}
String canonicalPath = file.getCanonicalPath();
if (!canonicalPath.equals("/img/java/file1.txt") &&
!canonicalPath.equals("/img/java/file2.txt")) {
// Invalid file; handle error
}
FileInputStream fis = new FileInputStream(f);
}
来源: https://www.securecoding.cert.org/confluence/display/java/FIO16-J.+Canonicalize+path+names+before+validating+them
假设你正在你将有可能获得标记为“不是一个问题” Fortify的漏洞分流期间运行Fortify的针对Web应用程序。 推理是:a)显然,这是测试代码和B),除非你有多重人格障碍你不打算做一个路操纵利用对你自己,当你运行测试程序。
如果很普遍地看到承诺产生假阳性的这种风格的仓库小测试工具。
至于你的编译错误,通常归结到类路径的问题。
使用正则表达式来验证该文件的路径和文件名
fileName = args[0];
final String regularExpression = "([\\w\\:\\\\w ./-]+\\w+(\\.)?\\w+)";
Pattern pattern = Pattern.compile(regularExpression);
boolean isMatched = pattern.matcher(fileName).matches();