代码审计之Foritify规则自定义
字数 2392 2025-08-22 12:23:30
Fortify规则自定义教学文档
1. 基本介绍
Fortify静态代码分析器使用规则库来建模所分析程序的重要属性,这些规则为相关数据值提供了意义并实施了适用于代码库的安全编码标准。安全编码规则包描述了流行语言和公共API的通用安全编码习惯用法。
1.1 支持的语言
- ABAP
- ASP.NET
- C
- C++
- Java
- .NET
- PL/SQL
- T-SQL
- VB.NET
1.2 自定义规则的作用
- 对安全相关库的行为进行建模
- 描述专有业务和输入验证
- 实施组织和行业特定的编码标准
- 提高分析的完整性和准确性
2. 产品组成
2.1 主要组件
- 源代码分析引擎:采用数据流、语义、结构、控制流、配置分析和X-Tier跟踪器
- 安全代码规则集:国际公认的安全漏洞规则
- 安全审计工作台:分析扫描结果
- 安全规则构建器:自定义安全代码规则
- IDE集成开发插件:Eclipse、WSAD、Visual Studio插件
3. 规则元素
3.1 RulePack元素
Rulepack的根元素是<RulePack>,包含描述RulePack的标头信息。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RulePack>
<RulePackID>06A6CC97-8C3F-4E73-9093-3E74C64A2AAF</RulePackID>
<Name><![CDATA[ Sample Custom Fortify Rulepack ]]></Name>
<SKU>SKU-D:\Environment\FortifySCA\Core\config\customrules\custom-rule</SKU>
<Version>0000.0.0.0000</Version>
<Language>java</Language>
<Description><![CDATA[ Custom Rules for Java ]]></Description>
<Rules version="22.1">...</Rules>
</RulePack>
3.2 子元素说明
- RulePackID:规则包的唯一标识符
- Name:规则包的名称
- SKU:全局唯一标识符
- Version:数字版本
- Language:适用的编程语言
- Description:规则包说明
- Rules:包含一个
<RuleDefinitions>元素
4. 规则类型
Fortify支持多种规则类型:
4.1 主要规则类型
AliasRuleCharacterizationRule(for Dataflow Analyzer)ConfigurationRuleContentRuleControlflowRuleCustomDescriptionRuleDataflowCleanseRuleDataflowEntrypointRuleDataflowPassthroughRuleDataflowSinkRuleDataflowSourceRuleRegexRuleResultFilterRuleStructuralRuleSuppressionRule
5. 公共规则元素
所有规则共享一些常见元素:
5.1 基本元素
- RuleID:规则所需的唯一标识符
- MetaInfo:提供有关分析结果优先级排序规则的信息
- Notes:内部评论(可选)
5.2 漏洞相关元素
- VulnKingdom:漏洞王国
- VulnCategory:漏洞类别
- VulnSubcategory:漏洞子类别(可选)
- Description:漏洞描述
- DefaultSeverity:严重程度(向后兼容)
6. FunctionIdentifier元素
引用函数或方法调用的规则可以使用<FunctionIdentifier>元素。
6.1 子元素
- FunctionName:方法或函数的名称
- ClassName:类名(可选)
- NamespaceName:包或命名空间的名称(可选)
- ApplyTo:控制规则如何与扩展指定类或实现指定接口的类相匹配
- ReturnType:限制与具有指定返回类型的函数匹配
- MatchExpression:匹配函数的表达式
- Parameters:根据函数的类型签名限制规则
- Modifiers:将规则匹配的方法限制为用指定修饰符声明的方法
- Except:指定不应匹配的嵌套
<FunctionIdentifier>元素
7. 自定义规则创建流程
7.1 示例场景:硬编码密码检测
- 启动规则编辑器:进入Fortify的bin目录运行CustomRulesEditor
- 选择规则模板:选择"Structural Rule for Password Management"
- 选择语言:Java
- 配置正则表达式:用于匹配密码
- 保存规则:保存到自定义规则目录
7.2 规则测试
- 将自定义规则保存到
FortifySCA\Core\config\customrules - 启动Fortify代码扫描工具并配置加载自定义规则
- 执行静态代码扫描
- 验证RuleID是否与自定义规则一致
8. 规则优化
8.1 规则名称修改
更改规则中的"Name"标签属性:
<Name><![CDATA[ Custom Hardcoded Password Rule ]]></Name>
8.2 漏洞描述
有两种方式添加漏洞描述:
方式A:引用Fortify官方描述
- 在https://vulncat.fortify.com找到描述标识符
- 将自定义规则的ref属性设置为Fortify描述的标识符
<Description ref="desc.dataflow.java.hardcoded_password"/>
方式B:用户自定义描述
使用自定义规则编辑器添加描述:
<Description>
<Abstract>Hardcoded password detected</Abstract>
<Explanation>...</Explanation>
<Recommendations>...</Recommendations>
</Description>
9. 函数调用规则示例
9.1 场景描述
检测特定函数的调用位置
9.2 规则创建步骤
- 新建扫描规则
- 选择语言
- 配置函数匹配规则
9.3 示例规则
<RuleDefinitions>
<StructuralRule formatVersion="3.2" language="java">
<RuleID>FUNCTION_CALL_RULE</RuleID>
<VulnKingdom>Input Validation and Representation</VulnKingdom>
<VulnCategory>API Abuse</VulnCategory>
<Description>Detected call to sensitive function</Description>
<FunctionIdentifier>
<FunctionName>
<Pattern>sensitiveFunction</Pattern>
</FunctionName>
</FunctionIdentifier>
</StructuralRule>
</RuleDefinitions>
10. 规则存储与加载
10.1 存储路径
默认路径:FortifySCA\Core\config\customrules
10.2 自定义路径配置
在fortify-sca.properties中配置自定义路径:
customrules.directory=/path/to/custom/rules
11. 最佳实践
- 规则分类:根据漏洞类型和规则类型合理分类
- 规则测试:创建规则后务必进行测试验证
- 描述完善:提供详细的漏洞描述和修复建议
- 版本控制:对自定义规则进行版本管理
- 性能考虑:避免过于复杂的正则表达式影响扫描性能
12. 常见问题
- 规则未生效:检查RuleID是否唯一,路径配置是否正确
- 误报率高:优化正则表达式和匹配条件
- 漏报问题:确保规则覆盖所有可能的变体
- 性能问题:简化复杂规则,分批扫描大型项目
通过以上步骤和注意事项,您可以有效地创建、测试和优化Fortify自定义规则,提高静态代码分析的准确性和覆盖率。