无法解决 Log Forging Fortify 问题

Can't resolve Log Forging Fortify issue

我在修复 Fortify 中的 Log Forging 问题时遇到问题。 getLongFromTimestamp() 方法中的两个日志记录调用都引发了问题 "writes unvalidated user input to the log"。

public long getLongFromTimestamp(final String value) {
    LOGGER.info("getLongFromTimestamp(" + cleanLogString(value) + ")");

    long longVal = 0;
    Date tempDate = null;
    try {            
        tempDate = new SimpleDateFormat(FORMAT_YYYYMMDDHHMMSS, Locale.US).parse(value);
    } catch (ParseException e) {
        LOGGER.warn("Failed to convert to Date: " + cleanLogString(value) + " Exception: " + cleanLogString(e.getMessage()));
        throw new Exception(e);
    }

    if (tempDate != null) {
        longVal = tempDate.getTime();
    }
    return longVal;
}

private cleanLogString(String logString) {
    String clean = logString.replaceAll("[^A-Za-z0-9]", "");

    if(!logString.equals(clean)) {
        clean += " (CLEANED)";
    }

    return clean;
}

cleanLogString() 方法修复了我项目中的其他 Log Forging Fortify 问题,但它对上述 2 个问题没有影响。

如有任何帮助,我们将不胜感激!

我知道我遇到过 运行 我的应用程序的复杂性会阻止任何恶意输入按预期工作的情况; Fortify 认为这不安全。我敢打赌,您 运行 正在做同样的事情。

您正在从日志消息中删除任何真正有用的字符,但如果您在写入日志之前对输出进行一些编码,看看会发生什么。

http://www.jtmelton.com/2010/09/21/preventing-log-forging-in-java/

// ensure no CRLF injection into logs for forging records
String clean = message.replace( '\n', '_' ).replace( '\r', '_' );
if ( ESAPI.securityConfiguration().getLogEncodingRequired() ) {
    clean = ESAPI.encoder().encodeForHTML(message);
    if (!message.equals(clean)) {
        clean += " (Encoded)";
    }
}

可以使用 fortify Java 注释告诉 Fortify 从清理函数返回的数据现在是安全的。

在查看我的日志伪造问题时,我的字符串通过网络 API 进入,因此我的字符串上有标志 XSSWEB。我试图找到只会删除这些标志的注释,但找不到任何方法来删除 WEB 标志。我找到的唯一文档是 Samples/advanced/javaAnnotation 目录。

由于我的清理方法确实清理了字符串,所以我选择删除所有标志。但这可能是个问题,因为它可能隐藏侵犯隐私的行为。

@FortifyValidate("return")
private String sanitizeString(String taintedString) {
    return doSomethingWithTheString(taintedString);
}

最初写这个问题时我们的团队使用的是 log4j v1.2.8,但是我们注意到升级到 log4j v2.6.2 后所有日志伪造问题都消失了。

升级 log4j 版本后,Fortify 日志伪造问题应该会消失。形成上述问题的 cleanLogString() 方法也是不必要的。例如:

LOGGER.info("getLongFromTimestamp(" + value + ")");

使用 reflecttry-catch。 很容易作弊fortify。