搜索了很长时间后,我找不到有关 Serilog 如何处理日志源清理的信息。又名与“日志注入”或“日志伪造”的斗争(参见https://owasp.org/www-community/attacks/Log_Injection)。所有搜索都指向“依赖注入”,这是一个完全不同的主题:)
我假设通过使用带有字符串参数的 Serilog (https://github.com/serilog/serilog/wiki/Writing-Log-Events),可能的危险内容已被清除。但是,他们是吗?
有谁知道这是否已完成以及我应该担心吗?
如果有人使用不带字符串参数的 Serilog,而是使用带字符串连接的 Serilog(违反指令)怎么办?
如果配置得当,Serilog 可以完全克服这个问题。
但是,这是特定于格式化程序/接收器的,并且依赖于使用 Serilog 作为结构化记录器(写入非结构化输出流肯定会阻止这一点)。
如果您采用 OWASP 文章中的示例:
var val = request["val"];
try {
int value = Int32.Parse(val);
}
catch (Exception ex) {
log.Information("Failed to parse val {Val}");
}
然后生成的 CLEF 格式的 Serilog 事件将如下所示:
{"@t":"...","@mt":"Failed to parse val {Val}","Val":"twenty-one"}
想象一下“坏人”的场景:
如果攻击者提交字符串“twenty-one%0a%0aINFO:+User+logged+out%3dbadguy”...
Serilog 将产生一个结构化事件,例如:
{"@t":"...","@mt":"Failed to parse val {Val}","Val":"twenty-one\n\nINFO: User logged out=badguy"}
请注意,注入的“事件”完全在
Val
字段内,不能被误认为是“真实”事件。
即使注入的事件看起来像 JSON,这也成立,因为 Serilog 的 JSON 格式化程序正确转义 JSON 值,因此假事件仍然完全在“Val”字段内。
即使误用 Serilog API 且未正确将
Val
记录为结构化数据,注入的内容仍然只会出现在消息字段或其放入的任何字段中,并且不能伪装成完全独立的事件。
再次强调一下,您需要检查格式化程序和接收器的行为,以确保这一点。我在这里谈论的是Serilog.Formatting.Compact中的格式化程序。