簡體   English   中英

有關路徑操作的HP Fortify驗證規則

[英]HP Fortify Validation Rules on Path Manipulation

我通過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和其他一些東西,但也有一個“CLEAN”路徑列表。

那么,我將如何應用一個規則,說明進入此例程的任何事情都是好的並且已經明確檢查並且可以。

如果你做得對,強化數據流分析器將跟蹤你的數據路徑,看到一些預期的函數(iegetCanonicalPath(),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> 

Path Manipulation是一種特殊類型的“資源操作”。 它的攻擊面僅限於目錄和文件。 為了修復PM,除了輸入驗證技術之外,由於每個部分的保護要求不同,您需要在3個部分中處理資源:

(1)目錄
我們需要防止../../等。我們應該使用java.io.File.getCanoncialPath()來條紋化污染部分,與原始目錄進行比較,並僅在它們匹配時使用它。

(2)FILE_SEPARATOR使用java.io.File.separator比java.io.File.System.getProperty(“file.separator”)更安全,因為第二種方法,可以通過調用System.setProperty(String)來覆蓋分隔符key,String value)或命令行參數-Dfile.separator = /。

(3)FILE_NAME

  • 使用java.io.File.getName()來提取文件名。 例如“../../tmp/../../%00....xyz.txt”將變為“%00 .... xyz.txt”
  • 使用白名單允許使用好的字符(從文件名中過濾掉%00 ....)。
  • 檢查java.util.regex包以獲取詳細信息。 重要的是使用正確的模式。 最佳/最清晰的RegEx課程是Oracle正則表達式 最好的測試站點是RegEx Planet (您需要為每個測試刷新頁面,否則輸出可能不正確)。 我安裝了RegexpTester插件 ,在IntelliJ 15.X IDE中運行良好。
  • OWASP ESAPI FileName Pattern =“^ [a-zA-Z0-9。\\ -_] {0,255} $”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM