如何解决 java spring 引导应用程序中的安全审计发现日志注入
How to resolve security audit finding log injection in java spring boot application
我正在尝试通过使用 lombok extern Slf4j 记录异常来获取异常详细信息。但是在 coverity scan 中发现了一个问题,如下所示。
This is a security audit finding. CID 227846 (#1 of 1): Log injection (LOG_INJECTION). A tainted string ex is stored in logs. This may allow for an attacker to forge log messages to confuse automated log parsing tools or humans trying to diagnose an attack or other problem. The value is used unsafely in bytecode, which cannot be displayed.
Log injection vulnerabilities can be addressed by validating that the user-controllable input conforms to expectations.
log.error(Constants.EXCEPTION_OCCURRED_MSG, ex);
我很少找到解决此问题的选项。 ESAPI 或 Apache log4j Audit 是否适合此处。请提出建议。
我不能对 Apache Log4J Audit 说太多,因为我从未看过它(尽管仔细阅读其主页 20 秒似乎表明它更像是 结构化 SIEM 将知道如何解析的日志消息,而不是进行过滤/编码等的任何类型的“安全”日志记录)。至于 ESAPI,虽然 ESAPI 确实在某种程度上处理了“安全日志记录”,但 IIRC(未验证)它确实与 exceptions 没有太大关系。主要是ESAPI的logging信任exception stack,更侧重于error message本身。通常对于安全设计,除非经过验证,否则不应将用户数据放在异常消息中。但是这种验证不是一般的日志框架可以做到的。对于日志框架,它必须能够处理任何 Exception
(或者可能 Throwable
,YMMV)和任何字符串,当它到达日志框架时,特定的上下文是如何处理的应该被验证丢失了。
ESAPI 的“安全日志记录”主要包括将“\r”或“\n”字符作为记录的 'message' 字符串(不是异常)的一部分替换为“_”(以防止日志注入)和可选地对消息进行 HTML 实体输出编码(以防有人打算在浏览器中细读日志消息;目的是防止通过日志消息进行 XSS 攻击)。尽管您可以通过足够的努力扩展它来做其他事情(例如,过滤掉 ESC 序列等)。
最终,要完全防止日志注入攻击,您必须先验证所有不受信任的数据,然后再 记录它。 ESAPI 的 Validator 可以帮助您,但作为开发人员,您仍然需要在适当的时候使用适当的验证标准调用它。
201 年 12 月 29 日添加:至于使用 ESAPI 的 Validator
,我并不是要使用 ESAPI 的 Encoder
进行输出编码。相反,您将创建一个正则表达式来将您的预期数据列入白名单并将其放入您的 validation.properties 中,然后调用 Validator.getValidInput()
方法之一。如果您没有抛出 ValidationException
,根据您的正则表达式,输出应该是“安全的”。 (请注意,您可能需要在多个地方使用许多不同的正则表达式来执行此操作。)OTOH,我不能向您保证这会让您的 Coverity 扫描满意,因为它不可能知道您提供的正则表达式是否是合适与否。 (我也不认为它会做那么深入的数据流分析来考虑使用它 'safe'。)
我想我需要更多关于该错误到底在寻找什么的详细信息。例如,如果担心与 'ex' 相关联的异常消息包含 PII 或其他可能被记录的敏感信息,那么除非您可以控制抛出的异常,否则这将变得更加困难。 OTOH,如果控件正在插入,攻击者可能会插入类似 Log4shell 漏洞利用的东西,攻击不安全的反序列化,(显然)自 2013 年以来没有人意识到这种情况正在发生,这不是可以轻易防御的东西,如果有的话,因为问题在底层日志系统中用于处理类似的事情。
一般来说,解决这个问题的最佳方法是与安全审计员交谈并询问他们具体他们认为对此采取什么补救措施。那是他们期望什么样的清理或验证?此外,您应该了解,在获得管理层批准的情况下,您通常可以在某个地方记录风险,然后决定“接受它”。帮助您的管理层了解大多数“日志注入”漏洞并不像我们最近看到的一系列 Log4J 2 漏洞那样严重。只是在过去一个月左右的时间里,Log4Shell 漏洞让每个人都处于紧张状态。如果您决定接受风险,您可能希望在定期审查的“风险登记册”之类的东西中对其进行跟踪,但您也希望在审计工具中将其标记为“已接受的风险”。
我自己不知道很多更具体的细节,恐怕无法给你更具体的答案。我愿意尝试在其他论坛中提供更多帮助,让我的 ESAPI 同事参与进来。特别是重写 ESAPI 记录器的 Jeremiah Stacey 可能有一些想法,但我不认为他会监控 SO,因此电子邮件可能是一个更好的论坛。
希望对您有所帮助。 -凯文
我正在尝试通过使用 lombok extern Slf4j 记录异常来获取异常详细信息。但是在 coverity scan 中发现了一个问题,如下所示。
This is a security audit finding. CID 227846 (#1 of 1): Log injection (LOG_INJECTION). A tainted string ex is stored in logs. This may allow for an attacker to forge log messages to confuse automated log parsing tools or humans trying to diagnose an attack or other problem. The value is used unsafely in bytecode, which cannot be displayed. Log injection vulnerabilities can be addressed by validating that the user-controllable input conforms to expectations.
log.error(Constants.EXCEPTION_OCCURRED_MSG, ex);
我很少找到解决此问题的选项。 ESAPI 或 Apache log4j Audit 是否适合此处。请提出建议。
我不能对 Apache Log4J Audit 说太多,因为我从未看过它(尽管仔细阅读其主页 20 秒似乎表明它更像是 结构化 SIEM 将知道如何解析的日志消息,而不是进行过滤/编码等的任何类型的“安全”日志记录)。至于 ESAPI,虽然 ESAPI 确实在某种程度上处理了“安全日志记录”,但 IIRC(未验证)它确实与 exceptions 没有太大关系。主要是ESAPI的logging信任exception stack,更侧重于error message本身。通常对于安全设计,除非经过验证,否则不应将用户数据放在异常消息中。但是这种验证不是一般的日志框架可以做到的。对于日志框架,它必须能够处理任何 Exception
(或者可能 Throwable
,YMMV)和任何字符串,当它到达日志框架时,特定的上下文是如何处理的应该被验证丢失了。
ESAPI 的“安全日志记录”主要包括将“\r”或“\n”字符作为记录的 'message' 字符串(不是异常)的一部分替换为“_”(以防止日志注入)和可选地对消息进行 HTML 实体输出编码(以防有人打算在浏览器中细读日志消息;目的是防止通过日志消息进行 XSS 攻击)。尽管您可以通过足够的努力扩展它来做其他事情(例如,过滤掉 ESC 序列等)。
最终,要完全防止日志注入攻击,您必须先验证所有不受信任的数据,然后再 记录它。 ESAPI 的 Validator 可以帮助您,但作为开发人员,您仍然需要在适当的时候使用适当的验证标准调用它。
201 年 12 月 29 日添加:至于使用 ESAPI 的 Validator
,我并不是要使用 ESAPI 的 Encoder
进行输出编码。相反,您将创建一个正则表达式来将您的预期数据列入白名单并将其放入您的 validation.properties 中,然后调用 Validator.getValidInput()
方法之一。如果您没有抛出 ValidationException
,根据您的正则表达式,输出应该是“安全的”。 (请注意,您可能需要在多个地方使用许多不同的正则表达式来执行此操作。)OTOH,我不能向您保证这会让您的 Coverity 扫描满意,因为它不可能知道您提供的正则表达式是否是合适与否。 (我也不认为它会做那么深入的数据流分析来考虑使用它 'safe'。)
我想我需要更多关于该错误到底在寻找什么的详细信息。例如,如果担心与 'ex' 相关联的异常消息包含 PII 或其他可能被记录的敏感信息,那么除非您可以控制抛出的异常,否则这将变得更加困难。 OTOH,如果控件正在插入,攻击者可能会插入类似 Log4shell 漏洞利用的东西,攻击不安全的反序列化,(显然)自 2013 年以来没有人意识到这种情况正在发生,这不是可以轻易防御的东西,如果有的话,因为问题在底层日志系统中用于处理类似的事情。 一般来说,解决这个问题的最佳方法是与安全审计员交谈并询问他们具体他们认为对此采取什么补救措施。那是他们期望什么样的清理或验证?此外,您应该了解,在获得管理层批准的情况下,您通常可以在某个地方记录风险,然后决定“接受它”。帮助您的管理层了解大多数“日志注入”漏洞并不像我们最近看到的一系列 Log4J 2 漏洞那样严重。只是在过去一个月左右的时间里,Log4Shell 漏洞让每个人都处于紧张状态。如果您决定接受风险,您可能希望在定期审查的“风险登记册”之类的东西中对其进行跟踪,但您也希望在审计工具中将其标记为“已接受的风险”。
我自己不知道很多更具体的细节,恐怕无法给你更具体的答案。我愿意尝试在其他论坛中提供更多帮助,让我的 ESAPI 同事参与进来。特别是重写 ESAPI 记录器的 Jeremiah Stacey 可能有一些想法,但我不认为他会监控 SO,因此电子邮件可能是一个更好的论坛。
希望对您有所帮助。 -凯文