0%

fortify调优规则记录

fortify调优规则记录

最近在公司负责搞fortify的规则优化,这个东西的默认规则扫出来的误报真的是高,只能一步一步的来。首先最大的问题就是某些类别的漏洞只能基于filter去修复,比如路径穿越,但是fortify不认filter,所以上来先搞这一类别的情况,这里之后看情况要不要再整理成一个系列吧。

基于DataflowCleanseRule

看了下文档和资料,这个规则的意思就是过滤规则,通过你定义一些方法、类、包来对误报进行过滤,这一类最大的用处就是对fortify的大量误报进行处理。以路径穿越为例,在fortify的默认规则扫描中,只要使用了file函数打开就会报出漏洞,而且研发对filename进行过滤处理之后,fortify并不能识别出过滤函数的作用,同时通过模板的Filters不能过滤漏洞,这个时候就需要自己来写过滤规则啦。

注意此类无法针对漏报进行处理,接下来演示下简单操作。

PathManipulation

这里以常见的路径穿越为例,这里从request里取filename然后直接用file打开,为了简单示范就没写回显展示的逻辑,整体漏洞代码如下:

image-20201118141244610

目的

可以看到21行这里有个PathManipulationFilter,其作用就是对传入的文件名做过滤处理,这里我用的是tomcat源码里面的过滤规则加了一点修改,但是这里fortify并不能识别,所以二次扫描还是报告了出来。

再看左下角的调用流程,PathManipulationFilter函数是完完全全的出现在了调用流程里面并且会作为返回值再次参与到下面的流程,那我们需要做的就是告诉fortify这是个过滤函数,在这之后凡是这一类漏洞经过了这个函数就都会认为是安全的。

怎么做

  1. 在PathManipulationFilter函数上右键,选择 Generate Rule For Function,会新弹出一个窗口叫 Custom Rule Wizard

  2. 选择DataflowCleanseRule,这里是针对一些漏洞的validation rule,可以理解为净化规则,可是在这里面并没有找到我们需要的PathManipulation,取而代之的是有个 Generic Validation Rule,根据其对应的描述是可以针对 various security vulnerabilities ,所以我们选择这个然后点击next

  3. 选择对应语言,这里是java

  4. 到这里会提示我们选择包名、类名与函数名,一开始默认的会是当前的包名与类名,但是我想要的肯定不是当前的,所以这里改成了通配符,确定函数名正确即可

    image-20201118142539794

  5. 还记得前面左下角函数流程里面PathManipulationFilter后面的(0:return) 吗?这里0就是传入的参数位置,return即表示我们的值是从PathManipulationFilter里面return的,因此这里选择最上面的return value 即可

image-20201118142847094

  1. 最后一步就是存储我们的规则了,直接选择新建一个文件即可,然后Finish

结果

把我们生成的规则添加到 fortify 安装目录的 Core\config\customrules 下,重新进行扫描即可发现我们的漏洞已经不会再爆出来。

总结

基于DataflowCleanseRule的这一类规则其实就是标记一个过滤函数,这里demo只是简单的写了个传参直接过滤的情况,实际项目利用框架的情况下很多研发都是在框架入口配置的统一过滤器,这种情况下fortify的识别也还有很大的问题,比如在默认规则中,fortify能给识别出 HttpServletRequest request ,同时在配置了filter的Springboot项目中,以下的写法会被识别成2个漏洞,仅仅是因为Controller 和 filter里面都写了 HttpServletRequest request !**

image-20201119154616096

image-20201119155302481

image-20201119155357749

而对于@RequestParam 这种从request对象里面直接取参数的行为是识别不出来的,同时Spring 原生的还有另外几种规则的识别这里没做统一测试,后面再做吧。

image-20201119154710622

Fortify这个产品可能很强大,但是对于实际项目代码,如果没有专人去调优,就只能成为安全和研发部门的累赘,食之无味弃之可惜。