Serilog 和日志注入

问题描述 投票:0回答:1

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

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

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

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

security logging serilog
1个回答
0
投票

如果配置得当,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中的格式化程序。

© www.soinside.com 2019 - 2024. All rights reserved.