文章前言
Fortify静态代码分析器提供了一组用于检测源代码中的潜在安全漏洞的分析器,当对项目进行分析时Fortify静态代码分析器需要无错误完成对所有相关源代码的翻译工作,Fortify静态代码分析器之后便可以使用Fortify安全编码规则包和客户特定的安全规则(自定义规则)来识别漏洞
基本介绍
Fortify静态代码分析器使用规则库来建模所分析程序的重要属性,这些规则为相关数据值提供了意义并实施了适用于代码库的安全编码标准,安全编码规则包描述了流行语言和公共API的通用安全编码习惯用法,您可以为ABAP、ASP.NET、C、C 、Java、.NET、PL/SQL、T-SQL和VB.NET编写自定义规则,自定义规则可以提高Fortify静态代码分析器分析的完整性和准确性,这可以通过对安全相关库的行为进行建模、描述专有业务和输入验证以及实施组织和行业特定的编码标准来实现
Foritify自定义规则要求编写人员必须熟悉已知的安全漏洞类别及其通常相关的代码结构,了解特定类型的漏洞中经常出现的功能类型将有助于将安全相关功能作为自定义规则编写的目标,由于确定功能的安全相关性的任务可能具有挑战性,因此花时间了解功能类型和漏洞类别之间的关系可能会很有用,故而必须通过查看源代码或借助API文档来检查每个安全相关函数的单独行为以确定表示与每个函数相关的特定行为和漏洞类别的正确规则类型,然后您可以开发简易测试用例以举例说明您希望规则识别的不良行为,相反设计用于反映不应标记的正确行为的测试用例也可以帮助您从创建的规则中消除误报,在你对你的规则感到满意之后即可在受控环境中正确执行,下一步是使用它们对广泛的项目进行分析以验证它们的行为是否符合预期的保真度
规则元素
RulePack Element
Fortify静态代码分析器包括多个分析器,它们执行不同类型的分析并在代码中发现不同类型的问题,每个分析器支持一种或多种不同的规则类型,安全编码规则包以XML表示且其中会包含一个或多个任意类型的规则,以下示例显示了<RulePack>元素,Rulepack的根元素是<Rulepack>,其中包含描述RulePack的标头信息
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RulePack>
<RulePackID>06A6CC97-8C3F-4E73-9093-3E74C64A2AAF</RulePackID>
<Name><![CDATA[Sample Custom Fortify Rulepack]]></Name>
<Version>0000.0.0.0000</Version>
<Language>java</Language>
<Description><![CDATA[Custom Rules for Java]]></Description>
<Rules version="22.1">
...
</Rules>
</RulePack>
RulePack子元素说明如下:
- RulePackID:规则包的唯一标识符,Fortify使用全局唯一标识符(GUID)生成器来定义规则包和规则标识符以确保标识符是唯一的
- Name:规则包的名称
- SKU:全局唯一标识符
- Language:适用于规则包中所有规则的编程语言,Fortify静态代码分析器仅在处理指定语言的源文件时加载规则包,如果不包含<Language>元素,Fortify静态代码分析器将始终加载Rulepack(可选)
- Version:用于关联同一Rulepack(具有相同Rulepack标识符的Rulepack)的多个版本的任意数字版本(可选)
- Description:规则包说明
- Locale:Rulepack的区域设置,有效值为en、es、ja、ko、pt_BR、zh_CN和zh_TW(可选)
- Rules:包含一个<RuleDefinitions>元素
Rules Element
<Rules>元素包含所有规则定义
代码语言:javascript复制<Rules version="22.1">
<RuleDefinitions>
<!--... rules go here ...-->
<xyzRule>...</xyzRule>
...
<xyzRule>...</xyzRule>
</RuleDefinitions>
</Rules>
Rules相关元素说明如下:
- RuleDefinitions:包含一个或多个顶级规则
- xyzRule:每个规则都有一个唯一的规则元素:<xyzRule>,其中xyz是有效的规则类型,有效规则元素的示例有<StructuralRule>、<DataflowRule>、<ControlflowRule>等
- formatVersion:规则兼容的Fortify静态代码分析器的版本,指定已安装的Fortify静态代码分析器版本号以利用所有当前功能,要确定Fortify静态代码分析器的版本可以在命令行中键入"sourceanalyzer -v"查看版本号,版本号格式为<major>.<minor>.<patch>.<buildnumber>(例如:22.1.0.0140),只需要版本的主要部分和次要部分
- language:规则适用的编程语言,语言有效值为abap、cpp、dotnet、java和sql,语言属性可以应用于多种编程语言,下表描述了如何将语言属性值应用于编程语言
Common Rule Elements
规则类型不同的顶级规则元素包含不同的元素,Fortify静态代码分析器规则共享一些常见元素,所有规则都有一个<RuleID>元素
代码语言:javascript复制<xyzRule formatVersion="22.1">
<RuleID>...</RuleID>
<MetaInfo>
<Group name="Accuracy">4.0</Group>
<Group name="Impact">5.0</Group>
<Group name="Probability">4.0</Group>
</MetaInfo>
<Notes>...</Notes>
...
</xyzRule>
下面描述了顶级规则元素的公共子元素:
- RuleID:规则所需的唯一标识符,可以是任意字符串,Fortify使用全局唯一标识符(GUID)生成器生成唯一规则标识符
- MetaInfo:提供有关分析结果优先级排序规则的其他信息,其子元素是<Group>,使用<Group>元素的name属性指定漏洞的准确性、影响和概率,有效值为0.1到5.0
- Notes:您自己对规则的内部评论(可选)
以下顶级规则元素仅适用于直接导致相应分析器报告问题的规则:
代码语言:javascript复制<xyzRule formatVersion="22.1">
<RuleID>C9ECD6EC-DAA1-41BE-9715-033F74CE664F</RuleID>
<VulnCategory>Poor Error Handling</VulnCategory>
<DefaultSeverity>2.0</DefaultSeverity>
<Description>...</Description>
</xyzRule>
下面描述了漏洞生成规则常见的规则元素:
- VulnKingdom:分配给规则揭示问题的漏洞王国
- VulnCategory:分配给规则揭示问题的漏洞类别
- VulnSubcategory:分配给规则揭示问题的漏洞子类别(可选)
- Description:规则标识的漏洞描述,<Description>元素可以包含<Abstract>、<Explain>、<Recommendations>、<References>和<Tips>
- DefaultSeverity:不再使用此元素,但向后兼容需要此元素,为此元素指定值2.0
- FunctionIdentifier:指定引用函数或方法调用的规则
Custom Descriptions
部分组织希望将自定义描述添加到Fortify规则或将Fortify描述添加到自定义规则,自定义描述使您能够将特定于组织的内容添加到Fortify安全编码规则包生成的问题中,自定义描述内容可以包括组织特定的安全编码指南、最佳实践、内部文档参考等,将Fortify描述添加到自定义规则中可以利用Fortify在自定义规则中创建的描述来识别安全编码规则包已报告的漏洞类别
A、Fortify Descriptions
您可以使用Fortify描述来描述自定义规则发现的问题,首先我们需要确定要使用的描述的标识符,描述标识符位于https://vulncat.fortify.com,找到要使用的描述的标识符后将自定义规则的ref属性设置为Fortify描述的标识符,例如:以下规则生成的SQL注入结果的描述与Fortify规则For Java的SQL注入的结果相同
代码语言:javascript复制<DataflowSinkRule formatVersion="22.1" language="java">
...
<Description ref="desc.dataflow.java.sql_injection"/>
...
</DataflowSinkRule>
B、Custom Descriptions
您可以使用<CustomDescriptionRule>元素添加自定义描述,每个自定义描述规则定义新的描述内容并指定一组Fortify规则以确定如何应用它,默认情况下Fortify静态代码分析器工具在Fortify描述之前显示自定义描述,以下自定义描述规则示例为SQL注入和访问控制添加了自定义的<Abstract>和<Explanation>
代码语言:javascript复制<CustomDescriptionRule formatVersion="22.1">
<RuleID>D40B319C-F9D6-424F-9D62-BB1FA3B3C644</RuleID>
<RuleMatch>
<Category>
<Value>SQL Injection</Value>
</Category>
</RuleMatch>
<RuleMatch>
<Category>
<Value>Access Control</Value>
</Category>
<Subcategory>
<Value>Database</Value>
</Subcategory>
</RuleMatch>
<Description>
<Abstract>[custom abstract text]</Abstract>
<Explanation>[custom explanation text]</Explanation>
</Description>
<Header>[string to replace Custom]</Header>
</CustomDescriptionRule>
如果要向Fortify规则添加自定义描述,需要执行以下操作:
- 定义自定义描述内容:使用自定义描述规则的<description>和<Header>元素定义自定义描述属性
- 识别要修改的规则:使用<RuleMatch>元素来识别Fortify静态代码分析器添加自定义描述内容的规则
下面描述了<CustomDescriptionRule>子元素:
- RuleID:规则所需的唯一标识符
- RuleMatch:指定用于标识Fortify静态代码分析器添加自定义描述内容的规则的条件
- Description:自定义描述可以指定<description>子元素的全部或子集
- Header:指定在Fortify静态代码分析器和应用程序显示规则描述时替换单词"自定义"的文本(可选)
自定义描述可以包含多个规则匹配项,每个规则匹配都基于类别、子类别、规则标识符和描述标识符的任意组合指定规则,只有当规则匹配规则匹配中指定的所有条件时Fortify静态代码分析器才会对规则生成的问题应用自定义描述
- Category:漏洞类型
- Subcategory:漏洞子类型
- RuleID:规则ID
- DescriptionID:要使用的描述的标识符(例如:desc.dataflow.java.sql_injection)
文末小结
本篇文章对Foritify规则进行了简单的介绍,同时对Foritify规则的各个构成元素部分进行了简单介绍~