C# HP加强路径操作的验证规则

C# HP加强路径操作的验证规则,c#,validation,rules,fortify,C#,Validation,Rules,Fortify,我正在通过Hp Fortify运行代码,并有一些路径操作发现。我理解它的背景,并试图解决它 我没有遍历从数据库查询某些路径值以存储输出文件(日志、导出数据等)的所有位置,而是尝试将其集中化。因此,我不想让File.WriteAllText()带有路径+文件名和内容,而是想将其包装成 FortifyFileWriteAllText()。然后,在这个函数中,我先进行一次路径验证检查,如果有效,只允许继续写入,例如 public static bool FortifyFileWriteAllText(

我正在通过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和其他一些路径,但也有一个“干净”的路径列表


那么,我该如何应用一个规则,该规则表明任何进入这个例程的操作都是可以的,并且已经明确地检查过了。路径操作是一种特殊类型的“资源操作”。其攻击面仅限于目录和文件。为了补救PM,除了输入验证技术外,您还需要解决3个部分中的资源问题,因为每个部分的保护要求不同:

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

(2)文件分隔符 使用java.io.File.separator比java.io.File.System.getProperty(“File.separator”)更安全,因为第二种方法,即分隔符可以通过调用System.setProperty(字符串键、字符串值)或使用命令行参数-Dfile.separator=/来覆盖

(3)文件名

  • 使用java.io.File.getName()提取文件名。例如,“../../tmp/../../../00….xyz.txt”将变为“%00….xyz.txt”
  • 使用白名单允许使用好的字符(从文件名中筛选出%00…)
  • 查看软件包了解详细信息。重要的是使用正确的模式。最好/最清晰的正则表达式课程是。最好的测试站点是(您需要为每个测试刷新页面,否则输出可能不正确)。我安装了IntelliJ 15.X IDE,并且在其中运行良好
  • OWASP ESAPI文件名模式=“^[a-zA-Z0-9.\-\\{0255}$”

如果操作正确,fortify data flow analyzer将沿着您的数据路径进行跟踪,请参阅一些预期的函数(即getCanonicalPath()、pattern.matcher()等)并触发生成TAINFLAG=VALIDATED_PATH_MANIPULATION的接收规则。然后数据流分析器看到此特定的TAINTFLAG,它将禁用问题报告。此过程是按设计进行的。如果您实现了函数FortifyFileWriteAllText(),而Fortify仍在抱怨,这可能是因为Fortify不喜欢您使用的方法

如果您认为函数FortifyFileWriteAllText()确实阻止了PM,那么下面是一个自定义接收器规则,用于为您创建已验证的\u路径\u操纵污染标志。将其放在~FORTIFY\u HOME/Core/config/rules目录下使用


你的规则包在这里
这里有什么吗
1
路径操作修复
4.
3.
3.
4.
目标、中等、广泛、开发、fod
将您的规则id和前缀放在此处,以便将来进行统计
输入验证和表示
路径操纵
3
这
com.yourpackage
你们班
FortifyFileWriteAllText

很抱歉,我没有明确发布C#(刚刚添加),但我通过完整路径限定进行限定,如注释所述,以取消../../…等。我的问题是如何创建验证规则,即..我只是验证in字符串并返回一个已清理/已确认的良好字符串,允许继续。我必须转到路径操纵污点,而不是通用清理规则。谢谢