我们正在使用S4 SDK的CloudLoggerFactory记录整个应用程序中的异常。对于类“ SampleClass”,我们创建如下记录器:
private static final Logger logger = CloudLoggerFactory.getSanitizedLogger(SampleClass.class, "(END)");
并调用它作为例外e:
logger.error(e.getMessage(), e);
Veracode扫描显示此日志记录行容易受到CLRF注入的攻击。据我了解,将getSanitizedLogger与“(END)”参数一起应可解决此问题。请问您能对此事提供一些见识吗?
提前谢谢!
答案 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注入问题:此问题在很大程度上取决于创建的日志输出的进一步使用:
如果我们避开所有这些潜在的用例,实际上会使使用编辑器读取日志文件更加复杂。这是imo最常见的用例。
因此,您需要确定对于您的情况而言,这是实际问题还是误报。
另一点是,对于您的用例,所有其他依赖项也需要转义其日志消息。这意味着一个更简单,更全面的解决方案是在实际的记录器实现上进行配置,例如用于登录:https://logback.qos.ch/manual/layouts.html#replace。
答案 1 :(得分:1)
实际上,我们计划在即将发布的主要版本中删除日志清理功能。
我们得出的结论是,它实际上给人一种错误的安全感,应该在记录器实现级别上解决它,而在SDK级别上则不能这样做,因为我们仅依赖于Slf4j抽象。
(免责声明:我是SAP Cloud SDK开发人员之一。)