-->

如何解决“路径操作漏洞”,在一些Java代码?(How to fix “Path Manipulat

2019-09-23 08:03发布

下面简单的Java代码变得Fortify的路径操作错误。 请帮我解决这个问题。 我从很长一段时间挣扎。

public class Test {
    public static void main(String[] args) {
        File file=new File(args[0]);
    }

}

Answer 1:

看着为OWASP页面路径操作 ,它说

攻击者可以指定在一个操作中使用在文件系统中的路径

您正在打开一个文件由用户给定的输入定义。 您的代码几乎是漏洞的一个很好的例子! 或

  1. 不要使用上面的代码(不要让用户指定输入文件作为参数)
  2. 让用户从您提供的(文件数组与整数选择)的文件列表中选择
  3. 不要让用户提供的文件名都,除去可配置
  4. 接受漏洞,但防止它通过检查文件名(虽然这是最糟糕的事情 - 可能有人会轮得到也无妨)。

或重新考虑你的应用程序的设计。



Answer 2:

尝试使用它之前正常化网址

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



Answer 3:

只允许alnum并输入一个时期。 这意味着你过滤掉控制字符,“”,‘/’,‘\’,这将让你的文档脆弱。 例如,一个人不应该能够进入/path/password.txt。

一旦完成,重新扫描,然后运行Fortify的AWB。



Answer 4:

我有一个解决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 '%';
    }
}


Answer 5:

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



Answer 6:

假设你正在你将有可能获得标记为“不是一个问题” Fortify的漏洞分流期间运行Fortify的针对Web应用程序。 推理是:a)显然,这是测试代码和B),除非你有多重人格障碍你不打算做一个路操纵利用对你自己,当你运行测试程序。

如果很普遍地看到承诺产生假阳性的这种风格的仓库小测试工具。

至于你的编译错误,通常归结到类路径的问题。



Answer 7:

使用正则表达式来验证该文件的路径和文件名

fileName = args[0];
final String regularExpression = "([\\w\\:\\\\w ./-]+\\w+(\\.)?\\w+)";
Pattern pattern = Pattern.compile(regularExpression);
boolean isMatched = pattern.matcher(fileName).matches();


文章来源: How to fix “Path Manipulation Vulnerability” in some Java Code?