Fortify认为强类型对象上存在日志伪造,除非我手动调用.toString()

时间:2018-07-20 19:59:15

标签: java fortify

我有一个页面令牌对象,该对象是Long的包装,其中有一个静态String来包含名称空间。在我的应用程序中,我们使用Spring @PathVariable让Jackson生成这些对象,然后在失败时记录页面令牌。 Fortify认为这是潜在的日志伪造,但是实际上没有任何机会,因为我们的toString()方法只是:return PREFIX + StringUtils.leftPad(Long.toString(value), 7, '0')

我尝试了两种方法使Fortify对此感到满意,但都不适合。 我可以添加一个SuppressionRule:

    <SuppressionRule formatVersion="17.20">
        <RuleID>94236098-4C10-41F0-9C2A-27A3919830000</RuleID>
    </SuppressionRule>

但是,这也将使其无法从@PathVariable字符串中找到实际的日志伪造。

我尝试添加DataflowCleanseRule:

<?xml version="1.0" encoding="UTF-8"?>
<RulePack xmlns="xmlns://www.fortifysoftware.com/schema/rules">
    <RulePackID>55290199-F943-4BF1-9DCE-A3E28DD1342A</RulePackID>
    <SKU>SKU-cleanse</SKU>
    <Name><![CDATA[cleanse]]></Name>
    <Version>1.0</Version>
    <Description><![CDATA[Tell Fortify that Page Identifiers can't cause log forging.]]></Description>
    <Rules version="17.20">
        <RuleDefinitions>
            <DataflowCleanseRule formatVersion="17.20" language="java">
                <RuleID>DDAB5D73-8CF6-45E0-888C-EEEFBEFF2CD5</RuleID>
                <TaintFlags>+VALIDATED_LOG_FORGING</TaintFlags>
                <FunctionIdentifier>
                    <NamespaceName>
                        <Pattern>page\.id\.</Pattern>
                    </NamespaceName>
                    <ClassName>
                        <Pattern>Id</Pattern>
                    </ClassName>
                    <FunctionName>
                        <Pattern>toString</Pattern>
                    </FunctionName>
                    <ApplyTo implements="true" overrides="true" extends="true"/>
                </FunctionIdentifier>
                <OutArguments>return</OutArguments>
            </DataflowCleanseRule>
        </RuleDefinitions>
    </Rules>
</RulePack>

但是它并没有停止伪造日志的警告。这些ID是类似page.id.v1.NewsId的类。

此外,如果我将newsId.toString()放在包中的任何位置,它会意识到所有这些都是安全的,并且我的警告也都消失了。这是Fortify中的错误,还是我缺少明显的东西?

2 个答案:

答案 0 :(得分:0)

清理规则中的FunctionIdentifier值应引用生成这种情况下的标识符的函数的标准包,类和函数名,而不是用于在jsp中获取标识符的字符串。 / template等,

答案 1 :(得分:0)

@andersonshatch使我走上了正确的道路,意识到我需要说服Fortify,无论何时发现这些对象之一,它都是安全的。最终对我有用的文件是:

<?xml version="1.0" encoding="UTF-8"?>
<RulePack xmlns="xmlns://www.fortifysoftware.com/schema/rules">
    <RulePackID>55290199-F943-4BF1-9DCE-A3E28DD1342A</RulePackID>
    <SKU>SKU-cleanse</SKU>
    <Name><![CDATA[cleanse]]></Name>
    <Version>1.0</Version>
    <Description><![CDATA[Tell Fortify that Page Identifiers can't cause XSS or log forging.]]></Description>
    <Rules version="17.20">
        <RuleDefinitions>
            <CharacterizationRule formatVersion="17.20" language="java">
                <RuleID>34711D7A-C2BC-40B3-B1DE-B5C48EF65646</RuleID>
                <StructuralMatch><![CDATA[VariableAccess va: va.type.name matches "page.id.*"]]>
                </StructuralMatch>
                <Definition><![CDATA[TaintCleanse(va)]]></Definition>
            </CharacterizationRule>
        </RuleDefinitions>
    </Rules>
</RulePack>