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>
我有一个页面令牌对象,它是 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>