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(违反指令)怎么办?
如果仔细配置,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 }\nRun 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 }\nRun Code Online (Sandbox Code Playgroud)\n想象一下“坏人”的场景:
\n\n\n如果攻击者提交字符串 \xe2\x80\x9ctwenty-one%0a%0aINFO:+User+logged+out%3dbadguy\xe2\x80\x9d ...
\n
Serilog 将产生一个结构化事件,例如:
\n{"@t":"...","@mt":"Failed to parse val {Val}","Val":"twenty-one"}\nRun Code Online (Sandbox Code Playgroud)\n请注意,注入的“事件”完全在Val字段内,不会被误认为是“真实”事件。
即使注入的事件看起来像 JSON,这一点也成立,因为 Serilog 的 JSON 格式化程序正确转义 JSON 值,因此假事件仍然完全在“Val”字段内。
\n即使误用 Serilog API 且未正确记录Val为结构化数据,注入的内容仍然只会出现在消息字段或其放入的任何字段中,并且不能伪装成完全独立的事件。
再次强调一下,您需要检查格式化程序和接收器的行为,以确保这一点。我在这里谈论的是Serilog.Formatting.Compact中的格式化程序。
\n