HP Fortify在路径操纵方面的验证规则

3

我正在使用HP Fortify运行代码,并发现了一些路径操作问题。我理解其上下文并尝试解决。

与其在所有从数据库查询SOME路径值的地方储存输出文件(日志,导出数据等),我尝试将其集中处理。因此,不是使用File.WriteAllText()来写入某些路径和文件名、内容,而是想要封装为FortifyFileWriteAllText()。然后,在这个函数中,我进行路径验证检查,如果有效,则仅允许如下的写操作...

public static bool FortifyFileWriteAllText( string fileToWrite, string content)
{
   if( ! MyPathValidationRoutine( fileToWrite ))
      return false;

   File.WriteAllText( fileToWrite, content );
   return true;
}

因此,我知道这只是实际验证和防止错误写入的缩写,但我调用Path.GetFullPath()来防止任何类似于..\..\..的路径引用。 然后查看最终路径并明确防止像C:、C:\Windows和其他一些根目录,但也有一个“CLEAN”路径列表。

那么,我该如何应用规则,以便任何传递到此例程的内容都是可以的,并且已经明确检查和确定是正确的。

2个回答

1
如果你做得正确,Fortify数据流分析器将跟踪您的数据路径,查看一些预期的函数(例如getCanonicalPath(),pattern.matcher()等),并触发生成TAINFLAG = VALIDATED_PATH_MANIPULATION的汇集规则。然后,数据流分析器会看到这个特定的TAINTFLAG,并且它会静音问题报告。这个过程是有设计的。如果您实现了FortifyFileWriteAllText()函数,但Fortify仍然抱怨,那可能是因为Fortify不喜欢您使用的方法。
如果您认为FortifyFileWriteAllText()函数确实可以防止PM,那么这里是创建VALIDATED_PATH_MANIPULATION污点标志的自定义汇集规则。将其放置在~FORTIFY_HOME/Core/config/rules目录中以使用。

<?xml version="1.0" encoding="UTF-8"?>
<RulePack xmlns="xmlns://www.fortifysoftware.com/schema/rules">
    <RulePackID>YOUR RULE PACK ANME HERE</RulePackID>
    <SKU>SKU-ANY THING HERE</SKU>
    <Name><![CDATA[ANY THING HERE]]></Name>
    <Version>1.0</Version>
    <Description><![CDATA[]]></Description>
    <Rules version="6.31">
        <RuleDefinitions>
            <DataflowSinkRule formatVersion="6.31" language="java">
                <MetaInfo>
                    <Group name="MyCompany">Path Manipulation Remediation</Group>
                    <Group name="Accuracy">4</Group>
                    <Group name="Impact">3</Group>
                    <Group name="RemediationEffort">3</Group>
                    <Group name="Probability">4</Group>
                    <Group name="audience">targeted,medium,broad,dev,fod</Group>
                </MetaInfo>
                <RuleID>put-your-rule-id here-with-prefix-for-future-statistics</RuleID>
                <VulnKingdom>Input Validation and Representation</VulnKingdom>
                <VulnCategory>Path Manipulation</VulnCategory>
                <DefaultSeverity>3.0</DefaultSeverity>
                <Description ref="desc.dataflow.java.path_manipulation">
                    <Explanation append="true"><![CDATA[This issue is being reported by "your rule name here".]]></Explanation>
                </Description>
                <Sink>
                    <InArguments>this</InArguments>
                    <Conditional>
                        <Not>
                            <TaintFlagSet taintFlag="VALIDATED_PATH_MANIPULATION"/>
                        </Not>
                    </Conditional>
                </Sink>
                <FunctionIdentifier>
                    <NamespaceName>
                        <Pattern>com.yourpackage</Pattern>
                    </NamespaceName>
                    <ClassName>
                        <Pattern>yourclass</Pattern>
                    </ClassName>
                    <FunctionName>
                        <Pattern>FortifyFileWriteAllText</Pattern>
                    </FunctionName>
                    <ApplyTo implements="true" overrides="true" extends="true"/>
                </FunctionIdentifier>
            </DataflowSinkRule>
        </RuleDefinitions>
    </Rules>
</RulePack>


不是通用的清理规则,我必须使用路径操作来污染数据。谢谢。 - DRapp

0

路径操作是一种特殊类型的“资源操作”。它的攻击面仅限于目录和文件。为了解决路径操作问题,除了输入验证技术外,您还需要根据每个部分的保护要求将资源分为三个部分:

(1) 目录
我们需要防止使用 ../../ 等方式进行攻击。我们应该使用 java.io.File.getCanoncialPath() 来去除受污染的部分,与原始目录进行比较,并仅在匹配时使用。

(2) 文件分隔符 使用 java.io.File.separator 比使用 java.io.File.System.getProperty("file.separator") 更安全,因为第二种方法中,分隔符可以被调用 System.setProperty(String key, String value) 或命令行参数 -Dfile.separator=/ 覆盖。

(3) 文件名

  • 使用java.io.File.getName()提取文件名。例如"../../tmp/../../%00....xyz.txt"将变成"%00....xyz.txt"
  • 使用白名单允许使用良好的字符(过滤掉文件名中的%00....)。
  • 查看java.util.regex包以获取详细信息。重要的是要使用正确的模式。最好/最清晰的正则表达式课程由Oracle Regular Expression提供。最佳测试网站是RegEx Planet(每次测试都需要刷新页面,否则输出可能不正确)。我安装了RegexpTester plugin并在IntelliJ 15.X IDE中运行良好。
  • OWASP ESAPI文件名模式=“^[a-zA-Z0-9.\-_ ]{0,255}$”

抱歉我没有明确发布C#(刚刚添加),但是通过完整路径限定来进行资格认证,以取消../../..等。我的问题是如何创建验证规则来表明...我只验证内部字符串并返回一个已清理/确认良好的字符串,允许继续。 - DRapp

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