日志伪造 加固 修复

12

我正在使用Fortify SCA查找我的应用程序中的安全问题(作为大学作业)。我遇到了一些“日志锻造”问题,但我无法摆脱。

基本上,我记录了一些来自Web界面的用户输入值:

logger.warn("current id not valid - " + bean.getRecordId()));

Fortify报告这是一个日志伪造问题,因为getRecordId()返回了用户输入。

我遵循了这篇文章的方法,将换行符替换为空格,但问题仍然存在。

logger.warn("current id not valid - " + Util.replaceNewLine(bean.getRecordId()));

有没有人能建议一种解决这个问题的方法?


1
在我看来,这一切都与内容有关,:) 作为一个好的实践,您必须对用户输入进行消毒处理,并且应将其视为警告,在某些情况下,例如异构软件架构(从JAVA调用C应用程序)未经消毒的用户输入可能是危险的(替换换行符远非适当的消毒方法;)),此外,格式攻击可能会构成威胁,如果记录ID是数字(Long、Integer、Double),则可以跳过它:), 如果是字符串,您也可以跳过它,但请记住它:)。 - damiankolasa
4个回答

9

我知道这个问题已经有答案了,但我认为举一个例子会更好理解 :)

<?xml version="1.0" encoding="UTF-8"?>
<RulePack xmlns="xmlns://www.fortifysoftware.com/schema/rules">
  <RulePackID>D82118B1-BBAE-4047-9066-5FC821E16456</RulePackID>
  <SKU>SKU-Validated-Log-Forging</SKU>
  <Name><![CDATA[Validated-Log-Forging]]></Name>
  <Version>1.0</Version>
  <Description><![CDATA[Validated-Log-Forging]]></Description>
  <Rules version="3.14">
    <RuleDefinitions>
      <DataflowCleanseRule formatVersion="3.14" language="java">
        <RuleID>DDAB5D73-8CF6-45E0-888C-EEEFBEFF2CD5</RuleID>
        <TaintFlags>+VALIDATED_LOG_FORGING</TaintFlags>
        <FunctionIdentifier>
          <NamespaceName>
            <Pattern/>
          </NamespaceName>
          <ClassName>
            <Pattern>Util</Pattern>
          </ClassName>
          <FunctionName>
            <Pattern>replaceNewLine</Pattern>
          </FunctionName>
          <ApplyTo implements="true" overrides="true" extends="true"/>
        </FunctionIdentifier>
        <OutArguments>return</OutArguments>
      </DataflowCleanseRule>
    </RuleDefinitions>
  </Rules>
</RulePack>

8

Alina,我实际上是你用来解决日志注入问题的文章的作者。希望它对你有所帮助。

Vitaly在Fortify方面是正确的。您需要构建Fortify所称的“自定义规则”。

这很可能是一个数据流清理规则。可以在此处找到基本示例:http://www.cigital.com/newsletter/2009-11-tips.php。如果您拥有Fortify,则产品文档中应该有一个自定义规则编写指南。

我不知道您将使用哪个污点标记,但它看起来像“-LOG_FORGING”。您将基本上编写一个规则,在通过您的实用程序方法传递数据时删除日志伪造“污点”。 Fortify将假定通过那里传递的任何数据现在都是安全的,可以写入日志,并且不会导致日志伪造。


谢谢John!遵循您的建议和文档,我成功地编写了所需的自定义规则。您的文章也非常有用。 - Alina Danila
4
该链接不再存在:http://www.cigital.com/newsletter/2009-11-tips.php - Coder17

3

如果我没记错的话,你需要在Fortify中将你的replaceNewLine标记为sanitiser,这样就不会再报告这个问题了。


关于将方法标记为“sanitiser”的更多详细信息还有吗?我正在使用Fortify Audit Workbench,但找不到该选项。 - Alina Danila
我发现有一种叫做“Fortify Java Annotations”的东西,希望能找到更多相关信息。 - Alina Danila
抱歉,我已经有一段时间没有涉及这方面的事情了。与Fortify支持团队沟通是您最好的选择 - 这是一个昂贵的产品,上次我使用时支持还不错。 - Vitaly Osipov

0

你实际上可以从特定的方法创建一个新规则。

在扫描完成后,导航到审计工作台右侧的函数。找到您的清理方法并右键单击。

您可以从中生成一个规则。您想要的是一个通用的DataflowCleanseRule。

我刚刚根据某人发布的xml文件做到了这一点。您可以将规则保存为.xml文件。更新扫描时,您可以传递-rule参数并指向.xml文件。


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