CloudLoggerFactory的Sanitized Logger在Veracode Scan中显示CRLF注入漏洞

时间:2019-02-20 11:49:30

标签: s4sdk

我们正在使用S4 SDK的CloudLoggerFactory记录整个应用程序中的异常。对于类“ SampleClass”,我们创建如下记录器:

private static final Logger logger = CloudLoggerFactory.getSanitizedLogger(SampleClass.class, "(END)");

并调用它作为例外e:

    logger.error(e.getMessage(), e);

Veracode扫描显示此日志记录行容易受到CLRF注入的攻击。据我了解,将getSanitizedLogger与“(END)”参数一起应可解决此问题。请问您能对此事提供一些见识吗?

提前谢谢!

2 个答案:

答案 0 :(得分:6)

经过消毒的记录器应该做的是使日志伪造可识别。为此,它执行以下操作:

  • 此记录器具有您提供的类(在您的情况下为SampleClass.class)作为记录器名称。根据记录器实现的配置,该名称将被放置在打印输出中。这是SLF4J的默认行为。

  • 在使用此记录器创建的每条日志消息的末尾添加(END OF LOG ENTRY)(或您提供的令牌)。如果在您的日志消息中遇到此令牌,则会将其替换为(MESSAGE MIGHT BE FORGED!),因为这表明某些输入试图篡改您的日志消息。

这两个属性均允许您标识日志消息是实际有效的还是通过Log Forging创建的。

首先,使用“未经消毒”的记录器查看以下示例:

final Logger logger = CloudLoggerFactory.getLogger(SampleClass.class);

logger.error("Some valid first message");
logger.info("Something still valid\n[main] ERROR very.important.class Major Database Error!");
logger.error("Some valid last message");

在我的机器上,此输出看起来像

[main] ERROR com.sap.sandbox.SampleClass - Some valid first message
[main] INFO com.sap.sandbox.SampleClass - Something still valid
[main] ERROR very.important.class Major Database Error!
[main] ERROR com.sap.sandbox.SampleClass - Some valid last message

因此,没有机会确定这些消息有问题。

因此,如果您使用CloudLoggerFactory.getSanitizedLogger而不是CloudLoggerFactory.getLogger,则会得到以下日志输出:

[main] ERROR com.sap.sandbox.SampleClass - Some valid first message (END OF LOG ENTRY)
[main] INFO com.sap.sandbox.SampleClass - Something still valid
[main] ERROR very.important.class Major Database Error! (END OF LOG ENTRY)
[main] ERROR com.sap.sandbox.SampleClass - Some valid last message (END OF LOG ENTRY)

在这里您可以看到SampleClass中的一条消息(实际上应该以令牌结尾)没有任何一条。因此,您可以推断出日志中存在一些错误,您需要进一步调查此问题。

对于“日志伪造”方面来说,太多了​​,这是经过清理的记录器可识别的实际攻击。

关于CLRF注入问题:此问题在很大程度上取决于创建的日志输出的进一步使用:

  • 如果您将日志消息存储在数据库中,则需要采取某种方法来防止SQL注入。
  • 如果您使用基于Web的日志分析器查看日志文件,则需要采取某种措施来防止XSS。
  • ...

如果我们避开所有这些潜在的用例,实际上会使使用编辑器读取日志文件更加复杂。这是imo最常见的用例。

因此,您需要确定对于您的情况而言,这是实际问题还是误报。

另一点是,对于您的用例,所有其他依赖项也需要转义其日志消息。这意味着一个更简单,更全面的解决方案是在实际的记录器实现上进行配置,例如用于登录:https://logback.qos.ch/manual/layouts.html#replace

答案 1 :(得分:1)

实际上,我们计划在即将发布的主要版本中删除日志清理功能。

我们得出的结论是,它实际上给人一种错误的安全感,应该在记录器实现级别上解决它,而在SDK级别上则不能这样做,因为我们仅依赖于Slf4j抽象。

(免责声明:我是SAP Cloud SDK开发人员之一。)