0

我用过System.getenv("envVariableName"),它给我带来了 Log Forging 问题。我什至尝试使用 ESAPI 编码器对返回的字符串进行编码,但没有帮助。

我的代码片段:

String envValue = encode(System.getenv("envVariableName"));

String encode(String message) {
        if (message != null) {
            String clean = message.replace('\n', '_').replace('\r', '_');
            if (ESAPI.securityConfiguration().getLogEncodingRequired()) {
                clean = ESAPI.encoder().encodeForHTML(message);
                if (!message.equals(clean)) {
                    clean += " (Encoded)";
                }
            }
            return clean;
        }
        return message;
    }

关于我所缺少的任何建议将不胜感激。

4

3 回答 3

1

Fortify(至少使用过)将 ESAPI 的编码器识别为删除“网络”污点标志,但我认为这只是在 Fortify 的 XSS 规则的上下文中。我认为他们没有在 Log Forging 的上下文中做到这一点,尽管我很确定他们承认 ESAPI 的日志记录提供了“安全日志记录”。

如果我在这里理解您的愿望,您不只是希望将此特定实例标记为“不是问题”并禁止它,而是希望它首先不将此模式识别为 Log Forging 实例。不幸的是,您不能真正修改 HP(现在的 Microfocus)Fortify 规则。(他们的规则包甚至是加密的,所以没有在调试器下运行 AWB,您甚至无法查看他们的规则。)如果您确定“环境变量”是“受信任的”,我想您可以设置并应用 AWB过滤器集将忽略接收器上唯一污点标志是“环境变量”的实例。(或者仅将其应用于此 Log Forging 类别。)

但总的来说,您要么必须忍受噪音(Fortify 会产生大量误报),要么必须手动审查每个实例并将误报抑制为“不是问题”。这是通常的工作方式,尽管有时该功能仅限于 AppSec 专家。

希望有帮助。

于 2019-05-05T01:29:28.383 回答
0

Fortify 指定的行真的是 String envValue = encode(System.getenv("envVariableName"));?

当您将一些信息从不受信任的来源写入日志时,通常会发生日志伪造问题:https ://vulncat.fortify.com/en/detail?id=desc.dataflow.java.log_forging#C%23%2FVB.NET %2FASP.NET

于 2019-04-26T12:41:38.453 回答
0

问题:如果您已经在使用 ESAPI,那么为什么不直接使用 ESAPI 的日志记录,因为它提供“安全日志记录”来防止 Log Forging 攻击?

于 2019-04-29T02:36:22.423 回答