安全漏洞 - veracode报告 - crlf注入

2022-09-04 01:22:13

我得到了我的javaEE应用程序的veracode报告。它在任何日志记录(使用log4j)上都有一个缺陷,所以我将添加到所有这些中,但是veracode不断将它们报告为安全漏洞。StringEscapeUtils.escapeJava(log)

这是一个正确的解决方案吗?我还能做些什么?

这是报告信息:标题:日志的输出中和不正确

说明:函数调用可能导致日志伪造攻击。将未经清理的用户提供的数据写入日志文件后,攻击者可以伪造日志条目或将恶意内容注入日志文件。损坏的日志文件可用于覆盖攻击者的踪迹,或用作对日志查看或处理实用程序的攻击的传递机制。例如,如果 Web 管理员使用基于浏览器的实用程序来查看日志,则可能会受到跨站点脚本攻击。

建议:尽可能避免在日志文件中直接嵌入用户输入。使用安全日志记录机制(如 OWASP ESAPI 记录器)清理用户提供的数据,用于构造日志条目,该机制将自动删除意外的回车符和换行符,并且可以配置为对非字母数字数据使用 HTML 实体编码。仅在绝对必要时编写自定义黑名单代码。始终验证用户提供的输入,以确保其符合预期的格式,并在可能的情况下使用集中式数据验证例程。

他们建议使用ESAPI,但这是一个非常大的项目,所以我需要最简单的解决方案,这就是为什么我尝试使用String.escape 'StringEscapeUtils.escapeJava(log)'

先进!


答案 1

我领导Veracode应用程序安全咨询小组,可以详细回答您的问题。对话的最佳场所是通过 Support@veracode.com,因为讨论可能涉及有关您的调查结果的具体细节,我们可能希望避免公开。

简短的答案是StringEscapeUtils.escapeJava()在消除典型的CRLF风险方面是有效的,但它不是我们的系统自动识别的机制之一,因为在某些情况下它可能是不够的。

Veracode系统具有一种机制,可以适当地标记这些发现,因此它们不会引起混淆。

请联系Veracode支持(support@veracode.com),我们将能够详细交谈。

最好的问候,吉姆。


答案 2

本报告将两个问题混为一谈。

首先,有日志注入 - 使用换行符溢出到单独的日志行中。 生成具有行分隔符和转义的非 ASCII 字符的输出,这原则上可确保解决此问题。不过,Veracode并不知道这一点 - 作为一个自动扫描程序,它对该方法的作用知之甚少,无法确定,因此它必须报告那里可能仍然存在漏洞。当然,Veracode无法知道第三方库代码中的每个转义函数。StringEscapeUtils.escapeJava

当您在日志行内使用自己的分隔符时,也可能发生日志注入,例如 。在这种情况下,如果攻击者在其中一个参数中具有字符串,您将无法准确重新创建哪个数据位于哪个参数中。这里的答案是用不出现在转义函数输出中的分隔符将参数括起来 - 例如,在每个值两边放置双引号,并用于转义值中的任何双引号字符。Bad thing happened with parameters {0} and {1}" and "escapeJava

第二次攻击发生在应用程序外部,此时正在使用某些工具查看日志。如果该工具存在注入漏洞,则日志数据中的元字符可能会变为活动状态。典型的示例是在 Web 界面中查看日志,该界面将其直接复制到页面中而不转义,从而导致 HTML 注入,从而导致日志查看应用程序中的跨站点脚本编写。

如果您可以确定您只是在没有遭受此类愚蠢错误的工具中查看日志,则无需担心。

否则,请尝试从您认为可能受影响的语言中排除任何元字符。通常和 HTML。如果您不想对所有非 HTML 日志数据进行 HTML 转义,则可以使用另一种方法将这些字符替换为转义等效项,如 的输出中所示。<&\u003EescapeJava

同样,Veracode将无法自动确定您正在做的事情在那里必然是安全的,因此一旦您满意,就必须将这些报告标记为忽略/处理。