2016-03-04 133 views
2

我正在通过Hp Fortify运行代码并且有一些路径处理发现。我了解它的背景并试图解决。HP Fortify验证规则路径操作

我试图集中它来代替从数据库中查询某个路径值来存储输出文件(日志,导出数据等)的所有地方。因此,我不想让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和其他一些东西,但也有一个“清理”路径列表。

那么,我将如何去应用一个规则,说什么去这个例程是好的,并已明确检查和确定。

回答

1

如果你这样做是正确的,强化的数据流分析仪将沿着您的数据路径追踪,看到一些预期的功能(即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>

+0

而不是通用的清洁规则,我不得不去路径操纵污点。谢谢 – DRapp

0

路径操作是一种特殊类型的“资源操作”。它的攻击面限于目录和文件。要修复PM,除了你输入验证技术,你需要解决的资源分为3个部分,由于环保要求的每个部分是不同的:

(1)DIRECTORY
我们需要防范。 ./../等。我们应该使用java.io.File.getCanoncialPath()要剥离污染部分,请与原始目录进行比较,并仅在匹配时使用它。

(2)FILE_SEPARATOR 使用java.io.File.separator比java.io.File.System.getProperty(“文件分割符”)更安全,因为第二方法中,分离器可以通过向System.setProperty呼叫(String键,字符串值)或命令行参数-Dfile.separator = /覆盖。

(3)FILE_NAME

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

对不起,我没有明确发布C#(只是增加),但如前所述,以抵消../../ ..我通过完整路径资质资格等我的问题是,如何创建验证规则说..我只验证字符串,并返回一个清理/确认好的字符串,允许继续。 – DRapp