如何在C#中修复日志伪造

时间:2017-12-12 11:30:40

标签: c# log4net fortify

我正在使用Log4net登录我的web api应用程序。我使用下面的代码来记录数据库中的警告和错误。

public async Task<int> ExecuteNonQuery(string procedureName,params SqlParameter[] parameters)
{
try
{
  this.logger.DebugFormat("{0} stating call",procedureName);
  ......
  ......
  ......
}

further code

当我运行强化扫描时,它会给我提供日志锻造问题。有什么想法我们可以解决这个问题。我尝试下面的代码,但没有工作

  procedureName = Regex.Replace(procedureName, "[^ A - Za - z0 - 9 $]", string.Empty);

2 个答案:

答案 0 :(得分:2)

Fortify正在防范Log Forging/Log Injection,恶意用户可以通过这种方式将未转义的输入内容写入您的日志文件。我们的想法是添加错误的日志条目,这些日志条目会引发自动或手动入侵检测或入侵调查尝试,以消除恶意用户的气味以及他们真正想要实现的目标。

为了解决这个问题,必须小心控制用户输入的哪些部分最终在日志文件中使用。如何做到这一点取决于你的严格程度。您可以简单地转义日志中的所有用户输入,删除换行符或控制字符等内容。要非常严格,可以从日志记录语句中删除所有用户输入,并使用一组预先开发的事件,这些事件构成可以在系统中记录的事件的“白名单”。

在您的情况下,听起来Fortify不够聪明,不知道procedureName是否来自用户输入,因此它将您的日志记录声明标记为可能包含动态/用户内容。如果你肯定你知道procedureName来自哪里,那么你可以忽略它作为误报。否则,您可以使用我列出的缓解技术之一来使您的日志记录更安全。

答案 1 :(得分:0)

Seafish的答案可能很难剖析。为此,我将尝试回答这个问题。

正如Fortify将解释的那样,日志伪造问题是因为Fortify认为您使用的是直接来自用户的价值/财产。在这种情况下,用户(如果他们是一个坏演员)可能会设置该值来混淆您的日志,从而干扰您执行适当审核的能力。

分辨率通常是以下一项或多项:

  • 在来自用户的所有属性或变量中删除换行符或控制字符,然后再击中您的日志。
  • 从所有用户输入中删除日志,而使用预定义的消息进行输出。
  • 与第一种方法一样,您可以将所有用户定义的值包装在某些标记中,以标识真实的日志条目。

最后一个建议更多是Fortify无法理解的内容,这就是为什么我建议与第一个解决方案结合使用的原因。就像使用双引号来引用某人一样,您可以在日志中的值周围使用一系列方括号,以使其更难伪造,甚至可以加密每行上的日期/时间,并以此来开始行,因此可以确认行的开头是您正确解密的日期/时间与输出消息中的日期/时间相匹配的地方。