2016-03-04 131 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