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

Fortify thinks there's log forging on a strongly typed object, unless I manually call .toString()

我有一个页面令牌对象,它是 Long 的包装器,其中包含一个静态字符串以具有命名空间。在我的应用程序中,我们使用 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 Strings 的实际日志锻造。

我尝试添加 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 中的错误,还是我遗漏了一些明显的东西?

清理规则中的 FunctionIdentifier 值应引用完全限定包、class 和为这种情况生成标识符的函数的函数名称,而不是您用来在您的 jsp/template 等中获取标识符,

@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>