Serilog和日志注入

6

在长时间的搜索后,我无法找到有关Serilog如何处理日志提要的信息。也就是所谓的“日志注入”或“日志伪造”(请参见https://owasp.org/www-community/attacks/Log_Injection)。所有的搜索都指向了“依赖注入”,这是一个完全不同的主题 :)

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

有人知道是否已经完成了这项工作,我应该担心吗?

如果有人没有使用字符串参数,而是使用字符串连接,是否会出现问题?


你找到答案了吗?也许可以在他们的 GitHub 存储库上提问? - Douglas Gaskell
创建GH讨论串:https://github.com/serilog/serilog/issues/1940 - Douglas Gaskell
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"}

请注意,注入的 "event" 完全位于 Val 字段内,不会被误认为是一个 "真实" 事件。

即使注入的事件被制造成 JSON 的样式,由于 Serilog 的 JSON 格式化程序正确地转义 JSON 值,因此虚假事件仍将完全位于 "Val" 字段内。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接