Fortify修复经常误用的身份验证

时间:2016-05-26 11:44:18

标签: java fortify fortify-source

当我使用fortify进行扫描时,我遇到了像#34;经常被误用的漏洞:身份验证"在下面的代码。为此我们有任何解决方法来避免这个问题。 我已经看过相关的帖子,但无法获得解决方案。使用ESAPI我已经为主机名和ipadress提供了正则表达式,但它不起作用。 addr.getHostAddress() java.net.InetAddress.getByName(nameServiceHost); java.net.InetAddress.getLocalHost().getCanonicalHostName() localhost.getHostName()

请建议我解决这个问题。

4 个答案:

答案 0 :(得分:1)

所有其他答案都尝试通过不使用内置API,而是使用命令行或其他方式提供解决方法。但是,他们错过了实际问题,不是问题所在的API,而是DNS可用于身份验证的假设。

攻击者可以spoof,即伪造为有效呼叫者的DNS响应。他们还可以使用IP address spoofing成为有效的呼叫者,而不会攻击DNS。

TL; DR不使用DNS或主叫方IP作为身份验证源。而是将SSL / TLS与进行加密连接,然后可以使用Basic-AuthenticationOauth2甚至更好的client-certificates aka mTLS

答案 1 :(得分:0)

对于我的情况,我已经重写了这样的代码

    public static String getIPAddress(String hostname) {
    Process process;
    String ipAddress = null;
    String localIpAddress = null;
    String[] commandArray;

    if(System.getProperty("os.name").startsWith("Windows")) {
        commandArray = new String[] {"cmd", "/c", "ping "+hostname+ " -4 | findstr Pinging"}; // For Windows
    } else {
        commandArray = new String[] { "bash", "-c", "host "+hostname}; // For Linux and OSX
    }

    try {
        process = Runtime.getRuntime().exec(commandArray);
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String[] output;
         // Reading the output of a command executed.
         while ((localIpAddress = stdInput.readLine()) != null) {
             if(System.getProperty("os.name").startsWith("Windows")) {
                 output = localIpAddress.split(" ");
                 ipAddress = output[2].replace("[", "").replace("]", "").trim();
             } else {                
                 output = localIpAddress.split("has address"); 
                 ipAddress = output[1];
             }
         }
    } catch (IOException e) {
        org.owasp.esapi.reference.Log4JLogFactory.getInstance().getLogger(" com.util.esapi.InetAddressWrapper.getIPAddress() << "+e+" >>");
    }
    return ipAddress;
}   

答案 2 :(得分:0)

尝试使用InetSocketAddress包装器,尤其是Elasticsearch Transport Client:

new InetSocketAddress(hostname, port)

答案 3 :(得分:-1)

您可以验证请求是否来自可信主机

String ip = request.getRemoteAddr(); 
InetAddress addr = InetAddress.getByName(ip); 
if (addr.getCanonicalHostName().endsWith("trustme.com")) { 
 trusted = true; 
}