Serilog 和日志注入

Pet*_*äri 6 security logging serilog

搜索了很长时间后,我找不到有关 Serilog 如何处理日志源清理的信息。又名反对“日志注入”或“日志伪造”的战斗(参见https://owasp.org/www-community/attacks/Log_Injection)。所有搜索都指向“依赖注入”,这是一个完全不同的主题:)

我假设通过使用带有字符串参数的 Serilog ( https://github.com/serilog/serilog/wiki/Writing-Log-Events ),可能的危险内容已被清除。但是,他们是吗?

有谁知道这是否已完成,我应该担心吗?

如果有人使用不带字符串参数的 Serilog,而是使用带有字符串连接的 Serilog(违反指令)怎么办?

Nic*_*rdt 1

如果仔细配置,Serilog 可以完全克服这个问题。

\n

然而,这是特定于格式化程序/接收器的,并且依赖于使用 Serilog 作为结构化记录器(写入非结构化输出流肯定会阻止这一点)。

\n

如果您采用 OWASP 文章中的示例:

\n
    var val = request["val"];\n    try {\n        int value = Int32.Parse(val);\n    }\n    catch (Exception ex) {\n        log.Information("Failed to parse val {Val}");\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

然后,生成的 CLEF 格式的 Serilog 事件将如下所示:

\n
    var val = request["val"];\n    try {\n        int value = Int32.Parse(val);\n    }\n    catch (Exception ex) {\n        log.Information("Failed to parse val {Val}");\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

想象一下“坏人”的场景:

\n
\n

如果攻击者提交字符串 \xe2\x80\x9ctwenty-one%0a%0aINFO:+User+logged+out%3dbadguy\xe2\x80\x9d ...

\n
\n

Serilog 将产生一个结构化事件,例如:

\n
{"@t":"...","@mt":"Failed to parse val {Val}","Val":"twenty-one"}\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,注入的“事件”完全在Val字段内,不会被误认为是“真实”事件。

\n

即使注入的事件看起来像 JSON,这一点也成立,因为 Serilog 的 JSON 格式化程序正确转义 JSON 值,因此假事件仍然完全在“Val”字段内。

\n

即使误用 Serilog API 且未正确记录Val为结构化数据,注入的内容仍然只会出现在消息字段或其放入的任何字段中,并且不能伪装成完全独立的事件。

\n

再次强调一下,您需要检查格式化程序和接收器的行为,以确保这一点。我在这里谈论的是Serilog.Formatting.Compact中的格式化程序。

\n