有关路径操作的HP Fortifyvalidation规则

我通过Hp Fortify运行代码,并有一些路径操作的发现。 我了解它的背景并试图解决。

我没有遍历从数据库查询某些路径值以存储输出文件(日志,导出数据等)的所有地方,而是试图集中它。 所以,而不是让File.WriteAllText()具有一些路径+文件名,内容,我想包装

FortifyFileWriteAllText()。 然后,在这个函数中我先做一次路径validation检查,如果有效,只允许写继续如…

public static bool FortifyFileWriteAllText( string fileToWrite, string content) { if( ! MyPathValidationRoutine( fileToWrite )) return false; File.WriteAllText( fileToWrite, content ); return true; } 

所以,我知道这是实际validation和防止写入错误的缩写,但我调用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目录中使用。

   YOUR RULE PACK ANME HERE SKU-ANY THING HERE  1.0      Path Manipulation Remediation 4 3 3 4 targeted,medium,broad,dev,fod  put-your-rule-id here-with-prefix-for-future-statistics Input Validation and Representation Path Manipulation 3.0     this         com.yourpackage   yourclass   FortifyFileWriteAllText        

Path Manipulation是一种特殊类型的“资源操纵”。 它的攻击面仅限于目录和文件。 为了修复PM,除了输入validation技术之外,由于每个部分的保护要求不同,因此需要将资源分为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} $”