Fortify代码扫描工具

一、Fortify介绍     

 Fortify是一款强大的静态代码扫描分析工具,其发现代码漏洞缺陷的能力十分强悍,主要是将代码经过编译,依托于其强大的内置规则库来发现漏洞的。其次fortify SCA团队在开发此商业工具时,也提供了自定义规则的接口,只要经过正版授权后,便可以在此基础上自定义规则,来增强Fortify SCA的漏洞识别能力,同时经过自定义规则,也可以降低误报,使静态分析的准确度和高效性。

     默认情况下,Fortify SCA使用安装的安全编码规则包来检查源代码,并定义一系列可能出现的问题,如可被攻击者李勇的安全漏洞和不良的编码缺陷。

    安全编码规则中的规则分析受支持语言的核心和扩展的API包中的函数,并将分析结果记录在Fortify SCA中。每一个问题的解释包含了对问题的描述和建议的解决方案,一边更好的解决程序中的漏洞和缺陷。也可以通过创建自定义规则包来准确地分析特定的应用程序,验证专门的安全规则以及细化Fortify SCA所报告的问题。

二、编写自定义规则原理

要编写有效的自定义规则,就必须熟悉一直的安全漏洞类别和通常与他们相关的函数类型。深入理解各类经常出现在特定类型漏洞的函数,有利于在编写自定义规则过程中能够准确地找到与安全相关的函数。任何一门语言,都有其庞大的开源框架和lib库。所以自定义规则,既要精通安全漏洞原理,又要熟练掌握一门或几门开发语言,一般自定义规则用的比较多的语言有java、C/C++、PHP等。其次必须识别与安全相关的函数,并熟悉这些函数的特性以此来确定能够体现各个函数具体行为和与之相关的漏洞类别的正确规则形式。一旦确定好了这种联系,使用自定义规则编辑器来创建规则就相对简单了。

三、自定义规则

1). 在fortify SCA安装的bin目录下找到打开自定义规则编辑器,CustomRulesEditor.cmd,如下图所示:

2). 打开编辑器后,选择File ——>Generate Rule,弹出规则向导框。

3). 自定义规则模板可以按照漏洞类型(Category)和规则类型(Rule Type)进行分类,不管是何种方式分类,这些模板大体上分为,数据污染源tainted规则,数据控制流规则,数据传递规则,以及漏洞缺陷爆发的sink规则。只要理解了这些规则模板,和开发语言的函数特征,建立规则就简单了。

如下是fortify自定义规则向导中的规则选项:

1) Access Control: Database  Validation Rule
定义验证对数据库中所存储的信息的访问权限的函数 (授权函数)。这个规则可以发现与未经授权的访问相关的漏洞Alias Rule
在安全编码规则包或自定义规则的范围内定义核心和扩展API 所发现的能够模拟其他函数行为的函数。
2) Allocation Rule
定义内存分配的函数。这个规则有助于跟踪缓冲区大小并检测 buffer overflow 漏洞
3) Buffer Overflow Detection Rules for 'scanf' Family of Functions
定义像 scanf() 家族函数一样运行的函数。这些规则有助于跟踪缓冲区大小并检测 buffer overflow 漏洞
4) Buffer Overflow Detection Rules for 'sprintf' Family of Functions
定义像 sprintf() 家族函数一样运行的函数。这个函数可以在格式化字符串中并置多个起始缓冲区,并将格式化字符串的多个内存单位复制到目标缓冲区。这个规则有助于跟踪缓冲区大小并检测 buffer overflow 漏洞

5) Buffer Overflow Detection Rules for 'strcat' Family of Functions
定义像 strcat() 家族函数一样运行的函数。它在目标缓冲区的末端并置了多个起始缓冲区的内存单位。这些规则有助于跟踪缓冲区大小并检测 buffer overflow 漏洞
6) Buffer Overflow Detection Rules for 'strcpy' Family of Functions
定义像 strcpy() 家族函数一样运行的函数。它可以将多个内存单位从起始缓冲区复制到目标缓冲区。这些规则有助于
跟踪缓冲区大小并检测 buffer overflow 漏洞
7) Cross-Site Scripting Sink Rule
定义在输入参数没有进行适当验证的情况下有可能在浏览器中执行恶意代码的函数
8) Cross-Site Scripting Source Rule
定义充当输入源的函数,如果这样的函数没有经过适当的验证,会导致浏览器执行恶意代码。
9) Cross-Site Scripting Validation Rule
定义发送到网页前需要进行适当的数据验证的函数
10) Generic Pass-Through Rule
定义一个其输入参数会和输出参数交互数据的函数。
11) Generic Semantic Rule
定义可能出现的 dangerous function
12) Generic Sink Rule
定义在输入参数没有进行适当验证的情况下有可能带来多种安全漏洞风险的函数
13) Generic Source Rule
定义充当输入源的函数,如果这样的函数没有经过适当的验证,会导致多种安全漏洞。
14) Generic Validation Rule
定义能够针对多种安全漏洞而进行适当验证的函数
15) HTTP Response Splitting Sink Rule
定义在输入参数没有进行适当验证的情况下有可能破坏 HTTP 响应头文件的函数
16) HTTP Response Splitting Validation Rule
定义加入 HTTP 响应头文件之前已进行适当的数据验证的函数
17) Integer Overflow Sink Rule
定义易于发生 integer overflow 漏洞的函数,这种漏洞会在输入参数验证不当的情况下导致逻辑错误和 buffer overflow。
18) Log Forging Sink Rule
定义在输入参数没有进行适当验证的情况下有可能向日志文件写入恶意或伪造条目的函数
19) Pass-Through Rule that Indicates that Outgoing Value does not End with a Newline Character
定义未在输出参数中附加换行符的参数
20) Pass-Through Rule that Indicates that Outgoing Value does not End with a Null Character
定义没有适当地以 "\0" 结束输出缓冲区的函数
21) Pass-Through Rule that Indicates that Outgoing Value Ends with a Newline Character
定义在输出参数中附加换行符的参数
22) Pass-Through Rule that Indicates that Outgoing Value Ends with a Null Character
定义适当地以 "\0" 结束输出缓冲区的函数

23) Pass-Through Rule that Indicates  that Outgoing Value is  Deobfuscated
定义充当去模糊化例程的函数
24) Pass-Through Rule that Indicates  that Outgoing Value is not  Numeric
定义处理输入参数的函数,以使其输出参数不为数字。
25) Pass-Through Rule that Indicates that Outgoing Value is Numeric
定义处理输入参数的函数,以使其输出参数为数字。
26) Pass-Through Rule that Indicates  that Outgoing Value is Poorly  Encrypted
定义对输入参数所执行的加密方式较差的函数,如基于 64位的编码。
27) Pass-Through Rule that Indicates  that Outgoing Value Represents  the Length of the String
定义输出参数可以表示字符串长度的函数
28) Password Management Sink Rule
定义采用永远不会被破译或去模糊化的明文密码作为参数的函数
29) Password Management: Weak Cryptography Sink Rule
定义采用加密方式较差的密码作为参数的函数
30) PCI Violation Sink Rule
定义有可能将信用卡数据显示给攻击者的函数
31) PCI Violation Source Rule
定义将信用卡数据引入应用程序的函数
32) PCI Violation Validation Rule
定义信用卡数据显示给攻击者前可以对这些数据进行适当验证的函数
33) Privacy Violation Sink Rule
定义在输入参数处理不当的情况下由于向攻击者显示私人信 息而导致可能危及用户隐私的函数
34) Privacy Violation Source Rule
定义作为私人数据源的函数,如果处理不当,会危害用户隐私。
35) Privacy Violation Validation Rule
定义能适当处理私人数据且不会危及用户隐私的函数。
36) SQL Injection Sink Rule
定义在输入参数没有进行适当验证的情况下有可能执行恶意SQL 或对数据库所存储的数据提供未经授权的访问权限的函数
37) SQL Injection Source Rule
定义充当输入源的函数,如果这样的函数没有经过适当的验证,会导致 SQL 被注入到数据库查询中。
38) SQL Injection Validation Rule
定义在利用数据进行 SQL 查询之前能够对这些数据进行适当验证的函数
39) String Length Rule
定义能够计算字符串长度的函数。这个规则有助于跟踪字符串的长度,以便检测 buffer overflow 漏洞。
40) String Termination Error Sink Rule
定义在输入参数没有适当地以 "\0" 结尾的情况下可能会容易导致 buffer overflow 漏洞
41) String Termination Error Source Rule
定义由于输入数据源没有适当地以 "\0" 结尾而容易导致buffer overflow 漏洞。

42) String Termination Error Validation Rule
定义适当地以 "\0" 结束缓冲区的函数。
43) System Information Leak Sink Rule
定义在输入参数处理不当的情况下可能向攻击者显示有用的系统信息的函数
44) System Information Leak Source Rule
定义作为系统信息数据源的函数,如果处理不当,会向攻击者泄漏有用的数据。
45) System Information Leak Validation Rule
定义能够适当处理系统数据的函数

4) .选择规则包语言,点击next,然后填写报名,类名,函数名

5). 点击next,设置sink点

四. 运行自定义规则

需要将编写好的自定义规则包放在Fortify SCA指定的文件夹下方可生效。默认一般是在${FortifyInstall}/Core/config/customrules/目录下。你可以在${FortifyInstall}/Core/config/fortify-sca.properties进行配置自定义路径

五、Fortify代码扫描使用教程

1、进入Fortify安装目录,再进入bin目录,双击auditworkbench.cmd启动程序

2、打开扫描窗口,点击Scan Java Project

3、选择要扫描的项目目录,点击确定按钮

4、弹出java代码版本选择窗口,选择版本后,点击OK

5、弹出审计向导窗口,点击Scan按钮开始扫描

6、扫描开始,等待扫描结束,等待时间根据项目大小而定,可能时间会很长

7、扫描结束后,显示扫描结果。到此使用Fortify 17.10进行源代码漏扫的方法就介绍完了。

初始fortify,还存在很多认知的不足,欢迎路过的伙伴们留言指正。。。望不吝赐教!!!

猜你喜欢

转载自blog.csdn.net/duan196_118/article/details/111191151