audit workbench...fortify 是 fortify software, inc. 的注册商标。...

124
Audit Workbench 用户指南 版本 5.1 2007 12

Upload: others

Post on 09-Feb-2020

38 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

Audit Workbench用户指南

版本 5.12007 年 12 月

Page 2: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

版权所有 © 2003-2007 Fortify Software, Inc.RB_3 19, 2008 5:19 下午保留所有权利。美国印刷。

Fortify Software, Inc.2215 Bridgepointe PkwySuite 400San Mateo, CA 94404 Fortify Software, Inc.(以下简称 "Fortify")和他的授权者保留对此文档(以下简称“文档”)的一切所有权。本文档的使用需遵守相关的版权法。 Fortify 保留在不预先通知的情况下随时修改本文档的权利。 本文档在没有任何承诺的情况下按“此版本”提供。对于本文档中发现的任何错误所引起的特殊的、巧合的或间接的损害,包括对其业务、利益、使用或数据等以及其他的任何方面造成的任何损失和意外中断,Fortify均不对此承担责任。Fortify 保留有在不预先通知的情况下对本文档中所介绍的 终产品的任何功能或组件进行修改和删除的权利。 Fortify 是 Fortify Software, Inc. 的注册商标。本文档中的品牌和产品名称是其各自所有者的商标。

Audit Workbench 用户指南

Page 3: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

目录

前言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1第 1 章:Audit Workbench 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Audit Workbench 概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3Source Code Analysis 阶段概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3安全编码规则包概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Audit Workbench 界面概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3开始页面概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3审计界面概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5利用自定义规则编辑器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

第 2 章:入门 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

扫描项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19启动新项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19重新扫描项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23打开项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

迁移审计信息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23第 3 章:配置/设置项目参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

理解项目配置和过滤器组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

保存项目配置参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

管理文件夹 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27新建文件夹 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28添加文件夹 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28重命名文件夹 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29删除文件夹 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

配置审计的自定义标签 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29创建自定义标签 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30删除自定义标签 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

新建过滤器组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

配置过滤器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32从 “Issue (问题)”面板创建过滤器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32在 “Filters (过滤器)”选项卡上新建过滤器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33将过滤器复制到另一过滤器组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

使用过滤器组模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34导出模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34导入模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

Audit Workbench 用户指南 iii

Page 4: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

第 4 章:审计分析结果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

使用 Eclipse 导航和编辑特性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

自定义问题视图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

合并多个审计员的审计结果. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

创建自定义清除规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

从新的分析结果文件中更新. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

导航并查看分析结果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

问题分组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

使用搜索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39关于搜索修正器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39关于搜索字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40搜索查询示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

创建问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

废除问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41第 5 章:使用高级功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

管理规则包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43升级安全编码规则包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

第 6 章:生成报告 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

打开报告模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

运行报告 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

使用报告模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45关于 Fortify 报告模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46选择报告小节 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46编辑报告的子小节 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

保存报告模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

保存对报告模板的更改 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

编辑报告模板 XML 文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49添加报告小节 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49添加报告子小节 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

第 7 章:编写自定义规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

Fortify SCA 规则概述. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53编写有效的自定义规则. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

使用自定义规则包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53新建自定义规则包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54打开 “Custom Rulepack (自定义规则包)”. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54配置规则包的细节 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54安装自定义规则包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

iv Audit Workbench 用户指南

Page 5: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

使用自定义规则向导 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

编辑和删除规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58编辑规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58删除规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

在 XML 视图中编写规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59插入 XML 模板. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59创建自定义规则模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

配置自定义规则元素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60定义规则信息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60定义自定义规则描述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60定义领域、类别和严重性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61定义函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63定义参数属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66定义规则定义信息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

举例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85语义规则举例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85数据流的源规则举例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86数据流传递规则举例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86数据流侵入规则举例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87配置规则举例 (属性文件). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87配置规则举例 (XML 文件) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88控制流规则举例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88结构规则举例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

编写无返回规则以识别无返回函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

编写结构规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93Null 解析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93关系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93结果报告 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94调用图的可到达性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95属性引用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

编写 ColdFusion 规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101标准特征 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102标签 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103数据库访问 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104未被处理的异常 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104其他示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

Audit Workbench 用户指南 v

Page 6: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

自定义规则示例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108在第三方代码中给简单的数据流属性建模 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108把所有包含一个通用名称元素的函数都当作传递 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109排除扫描分析结果中的已验证的数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109使用 #ifblock Directive 匹配条件分支. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110Structural 规则举例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

验证自定义规则. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111验证自定义规则包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112自定义规则包的疑难解答 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

第 8 章:故障排除与支持 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

故障排除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115利用日志文件进行故障排除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115org.eclipse.swt.SWTError 错误消息. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115内存不足错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115重置默认视图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

报告错误和请求增强功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

vi Audit Workbench 用户指南

Page 7: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

前言本指南介绍了如何使用 Audit Workbench。

如果您对本指南的任何内容存有疑问或建议,请与 Fortify Software 联系:

Fortify 技术支持

650.358.5679

[email protected]

企业总部

2215 Bridgepointe Pkwy

Suite 400

San Mateo, CA 94404

650.358.5600

[email protected]

网站

http://www.fortify.com

Audit Workbench 用户指南 1

Page 8: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

2 Audit Workbench 用户指南

Page 9: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

第 1 章:Audit Workbench 简介本章简要介绍了 Audit Workbench 的特性与功能,并且介绍了 Audit Workbench 的主要组成部分。

其中包含以下主题:

• Source Code Analysis 阶段概述

• 安全编码规则包概述

Audit Workbench 概述

Audit Workbench 为 Fortify SCA 增加了一个图形用户界面,使得开发组织与安全审计小组能够迅速

地对分析结果进行组织、调查和划分优先级,从而在短时间内修复安全漏洞。

Source Code Analysis 阶段概述

Audit Workbench 会启动 Fortify SCA “Scanning (扫描)”向导来扫描和分析源代码。该向导整合

了以下几个分析阶段:

• 转换:使用源代码创建中间文件,源代码与一个 Build ID 相关联, Build ID 通常就是项目名称。

• 扫描与分析:扫描中间文件,分析代码,并将结果写入一个 Fortify Project Results (FPR) 文件。

• 校验:确保所有源文件均包含在扫描过程中,使用的是正确的规则包,且没有报告重大错误。

安全编码规则包概述安全编码规则包是 Fortify Software 安全研究小组多年软件安全经验的体现,并且经过其不断努力改

进而成。这些规则是通过对编码理论和常用编码实践的研究,而取得的软件安全知识的巨大积累,

并且在 Fortify Software 安全研究小组的努力下不断扩展和改进。每个安全编码规则包均包含大量的

规则,每个规则定义了一个被 source code analysis 检测出的特定异常行为。

一旦检测出安全问题,安全编码规则包会提供有关问题的信息,让开发人员能够有时间计划并实施

修复工作,这样比研究问题的安全细节更为有效。这些信息包括关于问题类别的具体信息、该问题

会如何被攻击者利用,以及开发人员如何确保代码不受此漏洞的威胁。

安全编码规则包支持多种编程语言,也支持各种经过扩展的第三方库和配置文件。

有关当前安全编码规则包的信息,请参见 《安全编码规则包参考》。

Audit Workbench 界面概述

本小节包含以下主题:

• 审计界面概述

• 利用自定义规则编辑器

开始页面概述开始页面包含以下几个区域:

• Start New Project (启动新项目):启动源代码扫描向导。

• Custom Rules Editor (自定义规则编辑器):启动用于创建和检查安全规则或编码实践规则的

工具,这些规则可针对您的源代码进行自定义。

• Open Project (打开项目):单击某一项目名称可打开 近的项目;或使用 “Open Project(打开项目)”链接可定位到某一项目。

Audit Workbench 用户指南 3

Page 10: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

图 1:Audit Workbench 开始页面

4 Audit Workbench 用户指南

Page 11: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

审计界面概述下图显示了 “Auditing (审计)”界面中的 Webgoat FPR 文件示例。

图 2:Audit Workbench 界面

Audit Workbench 界面由以下几个面板组成:

• “Issues (问题)”面板

• “Analysis Trace (分析跟踪)”面板

• “Project Summary (项目摘要)”面板

• “Source Code Viewer (源代码查看器)”面板

• “Function (函数)”面板

• “Issue Auditing (问题审计)”面板

“Issues (问题)”面板

使用 Issues (问题)面板,您可以对希望审计的问题进行分组和选择。该面板由下列元素组成:

• “Filter Set (过滤器组)”下拉列表

• “Folders (文件夹)”选项卡

• Group by (分组方式)

• “Search (搜索)”框

Audit Workbench 用户指南 5

Page 12: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

图 3:问题面板

“Filter Set (过滤器组)”下拉列表

过滤器组控制着“Issue (问题)”面板的设置和显示属性。过滤器组是项目配置的一部分。您可以

为每个项目自定义不同的过滤器组。每个项目均可具有唯一的过滤器组。

“Filter Set (过滤器组)”部分包含以下设置:

• 文件夹的名称和颜色。要进行配置,请选择 Tools (工具) - Project Configuration (项目配

置) - Folder Settings (文件夹设置)。

• 问题列出的位置,以及是否列出。要进行配置,请选择 Options (选项) - Show View (显示

视图) - Filters (过滤器)。

注意:“Audit Guide Visibility Filters (审计指南可见性过滤器)”配置适用于整个项目。

Fortify Software 提供了默认过滤器组:Broad (广泛)、 Medium (普通)、 Targeted (特定)和 Developer (开发人员)。“Filter Sets (过滤器组)”将问题按严重性归类于 “Hot (严重)”、

“Warning (警告)”和“Info (信息)”文件夹中。 所有过滤器组都具有相同的文件夹过滤器。

不同“Filter Sets (过滤器组)”中会显示和隐藏不同的问题:

• Broad (广泛):使用 全面的规则组显示问题。应使用该过滤器组来发现要审计的一组广泛的

安全问题。

• Medium (普通):显示了在产生结果 (详述潜在问题)和产生预期可能的漏洞组之间打破平衡

的问题。

• Targeted (特定):显示在多种行业内及各种环境下经证实的具有高优先级的问题类别。应使用

这些过滤器组来发现一组有限的众所周知的关键安全问题。

• Developer (开发人员):显示开发人员尤为关注的问题,如高准确性 bug。

过滤器组

文件夹选项卡

分组方式

问题列表

搜索框

6 Audit Workbench 用户指南

Page 13: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

“Folders (文件夹)”选项卡

“Issues (问题)”面板上的选项卡称为“文件夹”。使用“Project Configuration (项目配置)”,

您可以自定义文件夹及其设置。因此,不同过滤器组和项目之间的文件夹数目、名称、颜色和问题

列表各不相同。

文件夹过滤器将问题归类于各种文件夹中。如果某个问题与任何文件夹过滤器都不匹配,该问题将

被列在默认文件夹中。可见性过滤器决定了某个问题是否显示在列表中。

注意:选择 Option (选项) - Show Suppressed (显示已废除项)、 Show Hidden (显示隐藏

项)(显示与可见性过滤器匹配的项目),以及 Show Removed (显示删除项)可显示所有项目。

Group by (分组方式)

“Group by (分组方式)”选项用于将问题列表归类到各个子文件夹中。选定的选项会应用于所有可

见文件夹。使用 <none(无) > 选项,可列出文件夹中的所有项目而不进行任何分组。

使用 Audit Workbench,通过更改对分组进行归类所依据的属性、添加或删除属性以创建子分组,以

及添加您自己的分组选项,您可以对现有分组进行自定义。

“Group by (分组方式)”设置适用于 Audit Workbench 实例。您可以将分组方式选项应用于任何利

用 Audit Workbench 实例打开的项目。

“Search (搜索)”框

使用 Search (搜索)字段,您可以限制文件夹中显示的问题和搜索特定的问题。有关搜索功能的信

息,请参见第 39 页中的 “使用搜索”。

“Analysis Trace (分析跟踪)”面板

当您选择某个问题后, Analysis Trace (分析跟踪)面板会显示相关的 trace output。通常情况下,

这是一系列进程点,显示了分析器是如何找到该问题的。对于数据流和控制流问题,这一系列点会

以执行顺序显示。

例如,如果您选择某个与可能被感染数据流相关的问题, Analysis Trace (分析跟踪)面板会显示这

段源代码中数据流的移动方向。

图 4:分析跟踪面板

Audit Workbench 用户指南 7

Page 14: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

“Analysis Trace (分析跟踪)”面板使用以下图标来显示本段源代码中数据流的移动方式:

“Project Summary (项目摘要)”面板

“Project Summary (项目摘要)”面板提供了关于扫描的详细信息。

• “Summary (摘要)”选项卡

• “Certification (认证)”选项卡

• “Build Information (Build 信息)”选项卡

• “Analysis Information (分析信息)”选项卡

表 1:分析跟踪图标

图标 描述

数据被分配到一个字段或变量

信息读取自某个代码的外部数据源(如 HTML 格式和 URL 等)

数据被分配到一个全局字段或变量

已执行比较

函数调用收到被感染的数据

函数调用返回被感染的数据

Pass-through,被感染的数据在函数调用中从一个参数传递到另一个参数

为某个内存位置创建一个别名

从一个变量读取数据

从一个全局变量读取数据

从一个函数返回被感染的数据

创建一个指针

取消一个指针

变量范围终止

执行跳跃

在代码执行中引入分支

代码执行中未引入分支

常规

8 Audit Workbench 用户指南

Page 15: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

图 5:项目摘要面板

“Summary (摘要)”选项卡

“Summary (摘要)”选项卡显示了关于本项目的高级信息。

“Certification (认证)”选项卡

“Certification (认证)”选项卡显示了结果认证状态。结果认证用于检查 FPR 文件是否与 Fortify SCA 所生成的文件一致。

“Build Information (Build 信息)”选项卡

“Build Information (Build 信息)”选项卡显示了以下 Fortify SCA 扫描信息:

• Build 详细信息,如 Build ID、扫描的文件数、扫描日期,可能会与文件的转换日期不相同

• 扫描的文件列表,包括文件大小和时间戳

• Java 类路径

“Analysis Information (分析信息)”选项卡

“Analysis Information (分析信息)”选项卡显示了 Fortify SCA 的版本、计算机详细信息以及执行

扫描的用户。

“Analysis Information (分析信息)”子选项卡包含以下信息:

• 规则包:列出了用于扫描源代码的规则包,包括每个规则包的名称、 ID 和版本号。

• 属性:显示 Fortify SCA 属性文件的设置

• 命令行参数:显示用来分析项目的命令行选项

• 警告:列出了分析期间发生的所有错误和警告

Audit Workbench 用户指南 9

Page 16: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

“Source Code Viewer (源代码查看器)”面板

“Source Code Viewer (源代码查看器)”面板显示了与在“Issues (问题)”面板中选择的问题相

关联的代码段。如果“Analysis Trace (分析跟踪)”面板中的多个节点代表一个问题,则“Source Code Viewer (源代码查看器)”面板会显示与所选节点相关联的代码。

在“Source Code Viewer (源代码查看器)”面板中,您可以使用代码辅助功能创建自定义规则和

新问题,如下所示:

• 要为某个函数创建规则,请将光标放在该函数中,单击鼠标右键,然后选择 Write Rule for This Function (为此函数编写规则)。

• 要创建新问题,请将光标放在该函数中,单击鼠标右键,然后选择 Create New Issue (创建新

问题)。

“Function (函数)”面板

Function (函数)面板显示了项目中的函数/方法列表。使用“Function (函数)”面板可找出该函

数在源代码中的位置,了解函数是否应用和匹配某个规则,以及编写和验证自定义规则。

“Function (函数)”面板具有以下选项:

• Show (显示):确定显示在该列表中的函数。

• Group by (分组方式):将函数归类到各个包和类中,显示层次结构或直接显示所有函数而不

进行分组。

• Include unused functions (包括未使用的函数):显示源代码中的每个函数。

默认情况下,列表中不会包含未使用的函数。

• Legend (图例):显示一个用于解释各个列表图标的窗口。函数旁边的图标颜色指明该函数是

否应用了规则,如下所示:

• 红色:未应用任何规则

• 蓝色:可以应用规则,但没有匹配的规则

• 绿色:可以应用规则,并且有匹配的规则

• Search (搜索):仅限于显示那些包含您输入的字符串的函数。

该字段不区分大小写,如果该字段为空,将显示所选组中的所有函数。

10 Audit Workbench 用户指南

Page 17: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

图 6:函数面板

右键单击某个函数可显示以下选项:

• Open Declaration (打开声明):显示该函数在源代码中声明的位置。

• Find Usages (查找用法):创建函数所应用于的文件位置的列表。会在“Audit (审计)”面

板中会打开 “Search (搜索)”选项卡,其中显示它所在的文件名称。

• Generate Rule for Function (为此函数生成规则):启动“Custom Rules (自定义规则)”

向导来编写将应用于该函数的规则。

• Show Matched Rule (显示匹配的规则):列出了与该函数相匹配的所有规则所属规则包的规

则 ID 和文件名。

“Issue Auditing (问题审计)”面板

“Issue Auditing (问题审计)”面板在以下一组选项卡中提供了有关各问题的详细信息:

• Summary (摘要)

• Details (详细信息)

• Recommendations (建议)

• History (历史记录)

• Diagram (图示)

• Filter (过滤器)

注意:使用 Options (选项) - Show View (显示视图)菜单可显示或隐藏“Issue Auditing (问

题审计)”面板中的选项卡。

Audit Workbench 用户指南 11

Page 18: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

Summary (摘要)

Summary (摘要)选项卡显示了关于当前所选问题的以下信息:

图 7:问题审计面板中的摘要选项卡

下表描述了“Summary (摘要)”面板中的各个选项:

表 2:摘要选项

元素 描述

问题 显示问题的位置,包括文件名和行号。

Custom Tags(自定义标签)区域

显示审计员可以作为问题属性添加的值的下拉列表。例如,默认情况下,“Analysis (分析)”标签提供了以下值:- Not an issue (不是问题) - Reliability issue (可靠性问题)

- Unknown (未知)- Suspicious (可疑)

注意:自定义标签即项目设置,可选择“Tools (工具) - Project Configuration (项目配置)”来更改标签值。

Suppress Issue(废除问题)

更改严重级别以废除和删除导航树中的问题。

File Bug (报告 bug) 提供访问 bug 跟踪系统(如 Bugzilla)的途径。

Comments (注释) 向注释字段中追加有关问题的其他信息。

规则信息 显示用于描述问题的信息,如所属类别和领域。

更多信息 打开 Details (详细信息)选项卡。

Recommendations(建议)

打开 Recommendations (建议)选项卡。

问题 ID

自定义标签

名称

领域

废除

报告 Bug

类别

规则信息

概要

审计员注释

12 Audit Workbench 用户指南

Page 19: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

Details (详细信息)

Details (详细信息)选项卡提供了有关所选问题的详细说明,并提供了用于解决该问题的指导方

针。每项说明均包括下表中所述的部分或全部栏目。

Recommendations (建议)

“Recommendations (建议)”选项卡包含有关如何避免引发该漏洞或修改该漏洞方法的建议与

示例。

History (历史记录)

显示完整的审计操作列表,其中包括以下详细信息:日期和时间、执行审计的计算机以及修正该问

题的用户名称。

Diagram (图示)

“Diagram (图示)”选项卡形象地说明了在“Issues (问题)”面板上所选问题的节点执行顺序、

调用深度以及表达式类型。

表 3:详细信息面板

元素 描述

Abstract (概要) 对问题的概要描述

Explanation (解释) 关于会在哪些情况下发生此类问题的描述,同时还包括该漏洞的讨论、通常与该漏洞相关联的代码结构、该漏洞的利用方式,以及潜在的衍生攻击类型

实例 ID 问题的唯一识别符

规则 ID 标识用于发现问题的主要规则

SCA Confidence(SCA 可信度)

一个由 Fortify SCA 生成的衡量指标

+ 大化选项卡

表 4:

元素 描述

Recommendations(建议)

关于如何解决问题的信息

Tips (提示) 提供普通或者难以审计的情况的示例,给出了有关如何识别特定问题的提示

References(参考信息)

参考相关信息

+ 大化选项卡

Audit Workbench 用户指南 13

Page 20: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

图 8:SQL Injection 问题数据流图示示例

“Diagram (图示)”选项卡显示了与规则类型相关的信息,如下所示:

• 数据流规则:纵轴显示执行顺序。跟踪会从顶部第一个调用感染源的函数开始,然后追踪对该 source (蓝色节点)的调用情况,并在 sink (红色节点)处结束跟踪。在图示中,也会标记 source (src) 和 sink 结点。纵轴上的红 X 表示这个被调用的函数已结束执行。

横轴显示调用深度。用一条线显示控制权的传递方向。如果控制权传递时携带有被感染数据的变量,该线条是为红色;如果没有被感染数据,则该线条为黑色。

• 对于其他所有规则:纵轴显示执行顺序。

每个节点的表达式类型用以下图标之一表示:

表 5:图示图标

图标 描述

数据被分配到一个字段或变量

信息读取自某个代码的外部数据源(如 HTML 格式和 URL 等)

数据被分配到一个全局字段或变量

已执行比较

函数调用收到被感染的数据

函数调用返回被感染的数据

Pass-through,被感染的数据在函数调用中从一个参数传递到另一个参数

为某个内存位置创建一个别名

从一个变量读取数据

从一个全局变量读取数据

从一个函数返回被感染的数据

14 Audit Workbench 用户指南

Page 21: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

Filter (过滤器)

“Filter (过滤器)”选项卡显示了所选过滤器组中的所有过滤器。

利用自定义规则编辑器本节介绍了自定义规则编辑器的各个窗口和功能:

• 菜单概述

• 关于表格视图

• 关于 XML 视图

创建一个指针

取消一个指针

变量范围终止

执行跳跃

在代码执行中引入分支

代码执行中未引入分支

常规

表 6:过滤器选项卡中的选项

选项 描述

Filter 显示所选过滤器组中所配置的可见性过滤器和文件夹过滤器的列表。 右键单击某个过滤器可显示与该过滤器匹配的问题,也可启用或禁用该过滤器。

If 显示过滤器条件。 第一个下拉列表显示了问题属性的列表,第二个下拉列表指定了属性的匹配方式,而第三个列表是过滤器所匹配的值。

Then 指示过滤器的类型,其中,"hide" 表示可见性过滤器,"folder" 表示

文件夹过滤器。

表 5:图示图标

图标 描述

Audit Workbench 用户指南 15

Page 22: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

菜单概述

File (文件)菜单提供了如下所示的选项:

表 7:文件菜单选项

选项 描述

New Rulepack(新规则包)

新建一个自定义规则包。

New Rule (新规则) 打开规则向导以新建一个自定义规则。

Open Rulepack(打开规则包)

打开某个现有规则包。

Close Rulepack(关闭规则包)

关闭当前的规则包。

Close All Rulepacks(关闭所有规则包)

关闭所有打开的规则包。

Save Rulepack(保存规则包)

保存对所选规则包做出的更改。

Save Rulepack As(另存规则包)

将所选规则包另存到一个新的文件中。

Open Audit Window(打开审计窗口)

大化 “Auditing (审计)”窗口,打开 Audit Workbench 开始页面。

Convert Line Delimiters to(转换行分隔符)

将所选规则包的行分隔符转换为 MAC、 UNIX 或 Windows。

Exit (退出) 将所有打开的规则包写入现有文件中,关闭所有打开的规则包,保存对打开的 FPR 项目所做的更改,然后退出 Audit Workbench。

16 Audit Workbench 用户指南

Page 23: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

Edit (编辑)菜单提供了一些用于编辑某个打开的规则包的选项,例如从当前规则包面板中复制、

粘贴和删除规则。

关于表格视图

以表格格式显示打开的规则包或规则文件中的所有规则。

表格工具栏选项

该工具栏选项可通过以下图标和字段来访问:

• 利用 Find (查找)字段,您可以输入一个字符串,用来过滤表格中显示的信息。该字符串可以

与任意栏中的任意文本相匹配。搜索操作不区分大小写,且不支持正则表达式。

• 编辑工具:

• Details (详细信息)可在 Rules Details Editor (规则详细信息编辑器)中打开所选规则

• Delete (删除)可删除所选规则

• Cut (剪切)可从表格中删除所选规则并将其保存到缓冲区中

• Copy (复制)可在缓冲区中创建一个新规则,该规则实为所选规则的副本

• Paste (粘贴)可将缓冲区中的某个规则添加到表格

每个规则在表格中均表示为单独的一行。各栏提供了与特定规则相关的信息。

添加或删除栏:

1. 选择 Table View (表格视图)选项卡。

2. 右键单击表格中的某一行,然后选择 Select Table Columns (选择表格栏)。

屏幕将显示 Select Table Columns (选择表格栏)对话框。

3. 选择您要添加的栏的名称,并清除勾选您要删除的栏旁边的复选框。

4. 单击 OK (确定)。

屏幕将显示所选栏。

5. (可选操作)选择所需栏并将其拖到一个新的位置。

表 8:编辑菜单选项

选项

描述

Table View (表格视图) XML View (XML 视图)

Cut (剪切) 删除表格内所选行中的规则,并将这些规则放在缓冲区中。规则 ID 将保持不变。

删除所选文本,并将其放在缓冲区中。如果选择了某个规则,则其规则 ID 保持不变。

Copy(复制)

复制所选行中的规则。为每个规则生成一个新的规则 ID。

复制所选文本。如果选择了某个规则,则将为其生成新的规则 ID。

Paste(粘贴)

将规则添加到所选规则包中。 将缓冲区中的文本粘贴到光标插入的位置。如果选择了某个规则,将该规则放至元素树中的有效位置。

Select All(全选)

选择规则包中的所有规则。 选择规则包文件中的所有元素。

Audit Workbench 用户指南 17

Page 24: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

关于 XML 视图

“XML View(XML 视图)”选项卡显示了规则包信息及该规则包内的所有规则。“XML View(XML 视图)”选项卡具有以下功能:

使用自动填写功能

规则模板会插入必要的、 常用的规则元素。该模板可能会提供元素的子集。有关所有可能采用的元

素和构造规则的详尽列表,请参见《Fortify Software 安全编码分析引擎规则方案》。

要显示元素或值的列表,请将光标置于您要插入元素的那个树的级别,然后按 Ctrl+空格键。

自动填写功能利用 rules-schema.xsd 来提供许可元素或值的列表。如果该方案没有限定值,则自动填

写功能将基于安全编码规则包中其他同类规则及已安装的自定义规则所使用的值来提供一个值列表。

表 9:XML 视图选项

选项 描述

Code-assist and code completion(代码辅助和代码填写)

插入光标并按 Ctl+空格键,以显示元素、值或属性列表。

Rule validation (规则验证) 依据自定义规则方案来验证规则和值,以及规则包结构。无效的结构和值由错误图标及红色下划线来表示。

Insert Rule Templates (插入规则模板)

插入带有子元素和某些基本值的选定规则类型。

18 Audit Workbench 用户指南

Page 25: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

第 2 章:入门本章简要介绍了 Audit Workbench 的特性与功能,并且介绍了 Audit Workbench 的主要组成部分。

本章包含以下主题:

• 扫描项目

• 打开项目

• 迁移审计信息

扫描项目本章介绍了如何扫描源代码以及如何创建 FPR 文件,包含以下主题:

• 启动新项目

• 重新扫描项目

启动新项目本节介绍了如何为 Audit Workbench 中的新项目创建 FPR 文件。

• 扫描 Java 项目

• 扫描其他项目

扫描 Java 项目

“Scan Java Project (扫描 Java 项目)”向导将转换阶段和分析阶段合并为一个简单的步骤。使用

此功能可以扫描源那些代码位于单个目录中的小型 Java 项目。

扫描新的 Java 项目:

1. 打开 Audit Workbench。

系统会显示开始页面。

2. 在 “New Projects (新项目)”中,单击 Scan Java Project (扫描 Java 项目)。

系统会显示 Browse for Folder (浏览文件夹)对话框。

3. 选择包含所有需要分析的源代码的文件夹,然后单击 OK (确定)。

注意:Fortify SCA 将 Build ID 设为文件夹名称。

系统会显示 AuditGuide Wizard (AuditGuide 向导)。

4. 为需要审计的问题类型选择相关设置,然后单击 Run Scan (运行扫描)。

如果 Fortify SCA 在扫描源代码时遇到任何问题,即会显示 Warning (警告)对话框。

5. 单击 OK (确定) 继续。

Fortify SCA 会分析源代码。完成该过程之后, Audit Workbench 会显示 FPR 文件。

扫描其他项目

您可以使用 “Advanced Scan (高级扫描)”向导转换和分析 Java、 JavaScript、 PHP、 ASP、.NET 和 SQL 项目。对于源代码位于多个目录中、具有特殊转换或构建条件,或包含需要从项目中

排除的文件的 Java 项目,应使用“Advanced Scan (高级扫描)”向导。

Audit Workbench 用户指南 19

Page 26: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

扫描新项目:

1. 打开 Audit Workbench。

系统会显示开始页面。

2. 在“New Projects (新项目)”中,单击 Advanced Scan (高级扫描)。

系统会显示 Browse for Folder (浏览文件夹)对话框。

3. 选择项目所在的根目录,然后单击 OK (确定)。

会显示 Commandline Builder (命令行构建器)对话框。该向导会自动包含所有在扫描中支持的

文件。

4. 另外,还可以添加其他目录中的文件:

a. 单击 Add Directory (添加目录)。

系统会显示 Browse to Folder (浏览至文件夹)对话框。

b. 选择包含希望添加进行扫描的文件所在的文件夹。

c. 单击 OK (确定)。

导航面板中将会显示该目录,并会自动添加所有受支持的文件以进行扫描。要删除该目录,右键单击相应的文件夹,然后选择 Remove Root (删除根)。

5. 另外,可排除文件或目录,例如测试源代码:

a. 选择所需文件或目录。

b. 右键单击并选择 Exclude (排除)。

该文件夹会变成灰色。

20 Audit Workbench 用户指南

Page 27: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

6. 对于 Java 项目,设置以下内容:

a. 选择包含类文件的文件夹,然后单击 Classpath Directory (类路径目录)。

在 Fortify SCA 转换阶段,该文件夹会变成蓝色,且文件会添加到类路径中。

b. 选择项目的 Java 版本。

7. 输入 Build ID。默认情况下, Build ID 为根目录。

8. 输入 Fortify SCA 在分析阶段生成的 FPR 的路径和文件名。

9. 单击 Next (下一步)。

系统会显示 “Commandline Builder (命令行构建器)”对话框。

要跳过某一阶段,请取消勾选 Enable Clean (启用清除)、 Enable Translation (启用转换)

或 Enable Scan (启用扫描)复选框。

根据需要,修改每个 Fortify SCA 阶段的命令行选项:

• Enable Clean(启用清除):删除所有 Fortify SCA 与您在“Select Source(选择源)”对

话框中设置的 Build ID 相关联的中间文件和内部版本记录。要更改 Build ID,请单击两次 Back (返回)。

• Enable Translation (启用转换):创建 Fortify SCA 中间文件并为项目指定 Build ID。

• Enable Scan (启用扫描):分析源代码并创建可以在其中添加审计信息的 FPR 文件。

另外,还可以单击 Manage Rulepacks (管理规则包)以使用自定义规则包分析源代码,或者

禁用某个安全编码规则包。

Audit Workbench 用户指南 21

Page 28: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

系统会显示 AuditGuide Wizard (审计指南向导)。

图 9:审计指南向导

10. 为希望进行审计的问题类型选择相关参数,然后单击 Next (下一步)。

11. 单击 Run Scan (运行扫描)。

如果 Fortify SCA 在扫描源代码时遇到任何问题,会显示 Warning (警告) 对话框。

12. 单击 OK (确定)继续。

Audit Workbench 会显示 FPR 文件。

22 Audit Workbench 用户指南

Page 29: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

重新扫描项目

本节将介绍如何重新分析一个项目。使用该功能扫描利用新规则或更新的规则执行转换后的项目。

Audit Workbench 会自动加载 FPR 项目设置(例如源代码的 Build ID 和路径),并允许您更改命令

行扫描选项。

重新扫描项目:

1. 打开 FPR 文件。

2. 单击 Scan (扫描)。

系统会显示 Rescan BuildID (重新扫描 Build ID)对话框。

3. (可选)单击 Update Project Translation (更新项目转换)以重新转换该项目。

4. (可选)修改 Fortify SCA 扫描阶段的命令行选项。

5. (可选)单击 Manage Rulepacks (管理规则包)可以更改用来分析该项目的规则包:

• 通过选中或清除复选框来添加或删除规则包。

• 要使用未列出的自定义规则包,单击 Add Custom Rulepack (添加自定义规则包),浏览

到规则包文件并选中,然后单击 OK (确定)。

6. 单击 Run Scan (运行扫描)。

扫描完成后,将显示 FPR。

7. 将新结果与之前 FPR 中的问题进行比较,如下所示:

• 要显示所有新问题,单击 All (全部)文件夹选项卡,然后选择 Group by New Issue(按新问题分组)选项。

• 要显示已删除的问题,单击 All (全部)文件夹选项卡,然后选择 Options (选项) - Show Removed Items (显示删除项)。

• 要检查本 FPR 中存在的、先前扫描所找到的项目,单击 All (全部)文件夹选项卡,然后

展开 “Existing Issues (现有问题)”组。

打开项目打开 FPR 文件:

1. 打开 Audit Workbench。

2. 选择 File (文件) - Open Project (打开项目)。

3. 系统会显示 Choose Project (选择项目)窗口。

4. 浏览到 FPR 文件并选中,然后单击 Open (打开)。

如果 FPR 格式为 Fortify SCA 版本 4.5.1 或更早的版本,则会自动显示“Migration(迁移)”向导。

否则, FPR 会显示在 “Audit (审计)”透视图中。按照《Fortify SCA 迁移指南》中的说明,先迁

移问题 ID,然后再迁移审计数据。

迁移审计信息Audit Workbench 版本 5.0 改进了审计数据的管理方式。现在,已在用户界面中为每个项目基础自定

义并配置了审计数据。打开项目时,会自动显示审计数据。若具有自定义的 “Audit Labels (审计

标签)”,您无需使用自定义审计标签信息修改 Audit Workbench 和 Fortify Manager 配置文件。每

个项目都可具有一组唯一的标签。

Audit Workbench 用户指南 23

Page 30: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

在先前的版本中,审计员只能将预配置的信息添加到问题中。对于 Audit Workbench 实例而言,审

计标签和值都是静态的、本地使用的。自定义“Audit Labels (审计标签)”时,需要用户手动编辑 Audit Workbench 的配置文件。此外,还必须使用相同的自定义审计标签和值来手动重新配置 Audit Workbench 和 Fortify Manager 的每个实例。

打开版本 4.5.1 或更早版本的 FPR 文件时,会自动启动 “Migration (迁移)”向导。您必须将旧的

审计数据映射到新的“Custom Tags (自定义标签)”特性。 Fortify Software 建议先创建版本 5.0 的“Custom Tags (自定义标签)”和 “Filter Sets (过滤器组)”,然后再将旧的审计数据映射到

新格式。

迁移审计信息:

1. 按照上一节的说明,打开 FPR 格式版本 4.5.1 或更早版本。

将自动保存旧的 FPR 备份。系统会显示 “Migration (迁移)”向导。

2. 另外,也可以选择一个迁移模板文件。

3. 单击 Next (下一步)。

4. 会显示“Migrate Analysis Values (迁移分析值)”窗口。

5. 将旧的分析值映射到新值。

6. 另外,也可以选择 Filter Template (过滤器模板)。

注意:只会导入分析标签的值。要使用过滤器、文件夹及其他设置,请在迁移审计信息之后重新导入模板。

7. 单击 Next (下一步)。

24 Audit Workbench 用户指南

Page 31: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

系统会显示 Migration Summary (迁移摘要)窗口。

8. 单击 Finish (完成)。

Audit Workbench 用户指南 25

Page 32: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

26 Audit Workbench 用户指南

Page 33: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

第 3 章:配置/设置项目参数本节将说明如何管理项目配置的参数,其中包含以下主题:

• 理解项目配置和过滤器组

• 保存项目配置参数

• 管理文件夹

• 配置审计的自定义标签

• 配置过滤器

• 使用过滤器组模板

理解项目配置和过滤器组Fortify SCA 使用安全编码规则包和自定义规则包来分析源代码,确定其中是否包含任何安全漏洞或

不安全的编程方式。Fortify SCA 会识别每个潜在的漏洞,并将其视为一个问题。然后 Fortify SCA 会创建一个 FPR 文件,其中包含关于该项目中存在的全部问题的详细信息,包括源代码片段和位置的

详情 (如文件名、包和类)。一个 FPR 文件可能包含许多问题。

过滤器组可以控制 Audit Workbench 如何显示这些问题,而且允许用户自定义以下项目设置:

• Folders (文件夹),即 “Issues (问题)”面板上的选项卡:

• 显示的文件夹 (选项卡)数量

• 每个文件夹的名称和属性

• Custom Tags (自定义标签),即“Issue Summary (问题摘要)”选项卡上的审计标签:

• 可用审计字段的数量

• 每个字段的名称和值

• 每个过滤器组的过滤器:

• Visibility Filters (可见性过滤器),可隐藏问题

• Folder Filters (文件夹过滤器),可将问题分类整理到 “Issues (问题)”面板上的各个

文件夹中

注意:版本 4.5 及更低版本中的“Analysis and status (分析和状态)”等审计标签已经替换为

“Custom Tags (自定义标签)”。

保存项目配置参数要保存项目配置参数,请选择 Fortify Software - Save Audit Project (保存审计项目)。

管理文件夹“Issues (问题)”面板上的选项卡称为“文件夹”。您可以为每个项目自定义文件夹。文件夹在该

项目内有效,可以供该项目中每个过滤器组使用。在一个项目中,不同的过滤器组之间的文件夹属

性可能会有所不同。

本小节包含以下主题:

• 新建文件夹

• 添加文件夹

• 重命名文件夹

• 删除文件夹

Audit Workbench 用户指南 27

Page 34: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

新建文件夹本小节会说明如何将某个文件夹添加到“Filter Sets (过滤器组)”。文件夹必须具有唯一的名称。

新建文件夹:

1. 选择 Fortify Software - Project Configuration (项目配置)。

屏幕中将显示 Project Configuration (项目配置)对话框。

2. 单击 Folder (文件夹)选项卡。

3. 从 Folders for Filter Set (过滤器组的文件夹)中,选择下列选项之一:

• All Folders (所有文件夹),创建可以在每个过滤器组中显示的文件夹。

• 一个过滤器组,创建的文件夹只能所选过滤器组中显示。

4. 添加文件夹:

a. 单击 Folders (文件夹)旁边的 + (加号)。

屏幕上将显示 Create a New Folder (新建文件夹)对话框。

b. 为新文件夹输入一个名称,然后单击 OK (确定)。

该文件夹将显示在文件夹列表的底部。

5. (可选操作)向上或向下拖动该文件夹,以改变该选项卡在 “Issue (问题)”面板上的位置,

在面板中会按照从左到右的顺序排列。

6. (可选操作)选择 Default (默认)将所有与文件夹过滤器不符的问题放到此文件夹中。

7. 单击 OK (确定)。

该文件夹会在“Issue (问题)”面板上显示为一个选项卡。如果您选择了“Default (默认)”,则

会显示所有与文件夹过滤器不符的问题。

注意:要将问题导入此文件夹,请添加一个以新文件夹作为目标的文件夹过滤器。

添加文件夹本节将说明如何添加另一过滤器组中的文件夹。按照第 28 页中的“新建文件夹”中的说明,新建一个

只能在选定过滤器组中显示的文件夹。要在此文件夹中显示问题,请对此文件夹设置文件夹过滤器。

添加文件夹:

1. 选择 Fortify Software - Project Configuration (项目配置)。

屏幕中将显示 Project Configuration (项目配置)对话框。

2. 单击 Folder (文件夹)选项卡。

3. 从 Folders for Filter Set (过滤器组的文件夹)中,选择您要添加该过滤器的过滤器组。

注意:选择 All Folders (所有文件夹)选项,创建的文件夹可以在每个过滤器组中显示。

4. 单击 Folders (文件夹)旁边的 + (加号)。

如果此过滤器组中有尚未显示的文件夹,则屏幕上将显示 Add a new Folder to the Filter Set(向过滤器组中添加新文件夹)窗口。

5. 选择您要添加的文件夹,然后单击 Select (选择)。

该文件夹会显示在文件夹列表中。

6. 单击 OK (确定)。

该文件夹会显示在“Issue (问题)”面板中,而且会选中修改过的过滤器组。

28 Audit Workbench 用户指南

Page 35: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

重命名文件夹本小节将说明如何重命名文件夹。修改文件夹名称属于一个全局性变更。

重命名文件夹:

1. 选择 Fortify Software - Project Configuration (项目配置)。

屏幕中将显示 Project Configuration (项目配置)对话框。

2. 单击 Folder (文件夹)选项卡。

3. 在列表中选择该文件夹。

屏幕上将显示该文件夹的属性。

4. 为该文件夹输入一个新名称。

在列表中,该文件夹的名称会随着您的键入而改变。

5. 单击 OK (确定)。

在 “Issue (问题)”面板的选项卡上,该文件夹的名称也会随之改变。

删除文件夹本小节将说明如何将文件夹从所有过滤器组删除,或从某个过滤器组中删除而在其他过滤器组中

保留。

删除文件夹:

1. 选择 Fortify Software - Project Configuration (项目配置)。

屏幕中将显示 Project Configuration (项目配置)对话框。

2. 单击 Folder (文件夹)选项卡。

3. 从 Folders for Filter Set (过滤器组的文件夹)中,选择下列选项之一:

• All Folders (所有文件夹),将文件夹从所有过滤器组中删除。

如果此文件夹是某个文件夹过滤器的目标,则该删除文件夹的选项会处于隐藏状态。 • 一个过滤器组,仅将该文件夹从所选过滤器组删除。

文件夹列表会显示所选过滤器组中的文件夹。

4. 选择该文件夹,然后单击 Folders (文件夹)旁边的 - (减号)。

如果该文件夹是某个文件夹过滤器的目标,则屏幕上将显示 Conflicts Occurred Removing a Folder (删除文件夹时出现冲突)窗口。

5. 根据需要重新设置文件夹过滤器的目标或删除该文件夹过滤器。

该文件夹便会从文件夹列表中消失。

6. 单击 OK (确定)。

该文件夹将不再在 “Issue (问题)”面板上显示为选项卡。

配置审计的自定义标签自定义标签会显示在 “Auditing (审计)”面板的 “SCA Issue Summary (SCA 问题摘要)”选项

卡上。自定义标签可以让审计员设置描述该问题的其他属性。您可以使用自定义标签值来过滤及查

找问题。在默认情况下,已经配置了自定义标签 Analysis,而且当 Analysis 标签应用到某个问题

时,在问题列表中会显示图标来指示分析状态。

Audit Workbench 用户指南 29

Page 36: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

设定可见性过滤器和文件夹过滤器的条件,以与自定义标签值相符。例如,可见性过滤器 "Analysis:matches not an issue hide issue",而且审计员标记的所有问题均会从问题 “Issue (列

表)”中删除。

下图将显示“Project Configuration (项目配置)”对话框上,“Custom tag (自定义标签)”设置

与“SCA Issue Summary (SCA 问题摘要)”选项卡的关系。

图 10:自定义标签配置窗口与审计摘要面板

本小节包含以下主题:

• 创建自定义标签

• 删除自定义标签

创建自定义标签自定义标签属于项目内的设置,可以保存在过滤器组模板中。如果自定义标签不属于全局性模板组,

则可能会隐藏某些标签信息。

创建自定义标签:

1. 选择 Fortify Software - Project Configuration (项目配置)。

屏幕中将显示 Project Configuration (项目配置)窗口。

2. 单击 Custom Tag (自定义标签)选项卡。

3. 单击 Tags (标签)旁边的 + (加号)。

注意:如果您之前删除了一些标签,则会显示这些标签的列表,单击 Create New (新建)。

屏幕上将显示 Enter Value (输入值)窗口。

4. 为该标签输入一个名称,然后单击 OK (确定)。

该新标签便会显示在列表中。

30 Audit Workbench 用户指南

Page 37: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

5. 为标签添加值:

a. 从 Tag (标签)列表中选择该标签。

该标签会显示在 Tag (标签)字段中,而且会启动 Value (值)菜单。

b. 单击 Value (值)旁边的 + (加号)。

屏幕上将显示 Enter Value (输入值)窗口。

c. 为该值输入一个字串或数字,然后单击 OK (确定)。

d. (可选操作)如果审计员未选择任何值,则选择 default (默认)来设置该属性的值。如果

未选择 “default (默认)”,则该值为空。

6. 重复步骤 4,直到添加完所有标签值。

注意:如果您为所有值输入的均为数字,则您可以利用范围过滤该属性的问题。

7. 为您要添加的每个标签重复步骤 2 至 5。

8. 添加完标签和值之后,单击 OK (确定),关闭 Project Configuration (项目配置)窗口。

标签和值会显示在 “Summary (摘要)”选项卡上。

删除自定义标签删除标签后,将不再在 “SCA Issue Summary (SCA 问题摘要)”选项卡和过滤器选项中显示该标

签。然而,如果该标签是为问题而设置,则删除标签这一操作并不从该问题中删除该标签或值。为

该标签创建的过滤器仍然有效。您可以修改现有的过滤器,但您无法为该属性创建新的过滤器。

删除自定义标签:

1. 选择 Fortify Software - Project Configuration (项目配置)。

屏幕中将显示 Project Configuration (项目配置)窗口。

2. 单击 Custom Tag (自定义标签) 选项卡。

3. 从列表中选择该标签。

4. 单击 Tags (标签)旁边的 - (减号)。

5. 单击 OK (确定)。

6. 如果您删除的标签具有关联的过滤器,则会提示您同时删除该过滤器。

新建过滤器组本小节将说明如何新建过滤器组。要新建过滤器组,您可以直接复制一个现有的过滤器组。创建副

本之后,再修改其中的设置。

新建模板组:

1. 选择 Fortify Software - Project Configuration (项目配置)。

2. 选择 Filter Set (过滤器组)。

屏幕上将显示 Create New Filter Set (新建过滤器组)对话框。

3. 单击 Filter Sets (过滤器组)选项卡。

4. 为新的模板组输入名称。

5. 选择一个现有模板进行复制。

6. 单击 OK (确定)。

即可创建一个新的具有相同文件夹、可见性过滤器和文件夹过滤器的过滤器组。

Audit Workbench 用户指南 31

Page 38: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

配置过滤器本小节包含以下主题:

• 将过滤器复制到另一过滤器组

• 添加文件夹

从 “Issue (问题)”面板创建过滤器

如果文件夹列表中有问题需要隐藏或导向其他文件夹,则您可以使用过滤器向导新建一个过滤器。

向导会显示该过滤器的所有属性及相符的条件。

注意:要查找将问题导向至该文件夹的过滤器,右键单击该问题,然后选择 Why is this issue here? (该问题为什么会在这里?)。

注意:要查找导致隐藏该问题的过滤器,右键单击该问题,然后选择 Why is this issue hidden?(该问题为什么隐藏?)。

根据问题新建过滤器:

1. 从 Filter Set (过滤器组)下拉菜单中,选择一个过滤器组。

2. 在“Issues (问题)”面板上,选择一个问题。

3. 右键单击,然后选择 Generate Filter (生成过滤器)。

屏幕上将显示 Create Filter (创建过滤器)窗口,其中包含一个简短的建议条件列表。

4. (可选操作)单击 More Choices (更多选择),展开条件列表。

将显示其他更多条件。

5. 选择要在此过滤器中使用的条件。

稍后可以在 Filter (过滤器)选项卡上进行修改,以进一步调整该过滤器。

6. 选择您希望创建的过滤器类型,如下所示:

• 选择 Hide Issue (隐藏问题)以创建 Visibility Filter (可见性过滤器)。

• 选择 Set to Folder (设置给文件夹)以创建 Folder Filter (文件夹过滤器),然后选择

文件夹的名称,或者选择“Other Folder (其他文件夹)”来添加现有文件夹或新建一个

文件夹。

新文件夹只会显示在此过滤器组中。

7. 单击 Create Filter (创建过滤器)。

向导会将新过滤器放置在列表的末尾处。对于文件夹过滤器,这会赋予新过滤器 高的优先级。符合新文件夹过滤器的问题会显示在目标文件夹中。

8. (文件夹过滤器的可选操作)在文件夹过滤器列表中,向上拖动该过滤器,从而更改其优先级。

问题会使用新过滤器进行排序。

注意:过滤器仅在选定的过滤器组中创建。

32 Audit Workbench 用户指南

Page 39: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

在 “Filters (过滤器)”选项卡上新建过滤器

使用 “Filters (过滤器)”选项卡选项,为您要过滤的属性和值创建常规过滤器。过滤器仅在选定

的过滤器组中创建。

文件夹过滤器会按顺序依次进行应用,然后问题会导向列表中其符合的 后一个文件夹过滤器。向

导会将新过滤器放置在列表的末尾处。请根据需要调整文件夹过滤器的结构,以便获得您想要的过

滤行为。

在 “Filters (过滤器)”选项卡上新建过滤器:

1. 从 Filter Set (过滤器组)下拉菜单中,选择一个过滤器组。

2. 右键单击 Visibility Filter (可见性过滤器) 或 Folder Filter (文件夹过滤器),然后选择 Create New Filter (新建过滤器)。

If (如果)面板会显示一则消息:Please specify a modifier for the search (请为搜索指定修

正器)。

3. 从第一个下拉菜单中选择问题属性。

4. 第二个下拉菜单会自动填充相应内容。

5. 从第二个下拉菜单中选择该值的匹配方式。

6. 第三个下拉菜单将自动显示该属性的值。

7. 根据 If 行的说明,选择一个值,或指定一个范围。

8. 然后设置为下列选项之一:

• 选择 Hide Issue (隐藏问题)以创建 Visibility Filter (可见性过滤器)。

• 选择 Set to Folder (设置给文件夹)以创建 Folder Filter (文件夹过滤器),然后选择文

件夹的名称,或者选择 “Other Folder (其他文件夹)”添加其他过滤器组中的文件夹或新

建一个文件夹。

新过滤器会显示在列表的末尾处。对于文件夹过滤器来说,这会赋予新过滤器 高的优先级。符合新文件夹过滤器的问题会显示在目标文件夹中。

9. (文件夹过滤器的可选操作)在文件夹过滤器列表中,向上拖动该过滤器,从而更改其优先级。

问题会使用新过滤器进行排序。

注意:过滤器仅在选定的过滤器组中创建。

将过滤器复制到另一过滤器组过滤器的设置仅作用于该过滤器组。然而,您可以将过滤器复制到该项目中设置的其他过滤器组。

如果您要将文件夹过滤器复制到其他过滤器组,而且该文件夹在该过滤器组中尚未处于活动状态,

则会自动添加该文件夹。

复制过滤器:

1. 从 Filter Set (过滤器组)下拉菜单中,选择一个过滤器组。

2. 在 “Filters (过滤器)”选项卡上,选择一个过滤器。

3. 右键单击,然后选择 Copy Filter to (复制过滤器到)。

屏幕上将显示 Select a Filter Set (选择过滤器组)窗口,其中显示了全部过滤器组的列表。

4. 选择一个过滤器组,然后单击 OK (确定)。

过滤器即可添加到该过滤器组中,位于末尾的位置处。

5. (文件夹管理器的可选操作)通过拖放过滤器,将过滤器列表的顺序调整成所需的正确顺序。

问题会根据新过滤器随之进行调整。

Audit Workbench 用户指南 33

Page 40: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

使用过滤器组模板过滤器组模板可让您在不同的项目中使用相同的项目设置。过滤器组模板包含以下设置:

• Folder Filters (文件夹过滤器):控制问题如何排列到文件夹中

• Visibility Filters (可见性过滤器):控制显示及隐藏哪些问题

• Folders properties (文件夹属性):名称、颜色及其在哪些过滤器中处于活动状态

• Custom Tags (自定义标签):显示哪些审计字段及每个字段的值

本小节包含以下主题:

• 导出模板

• 导入模板

导出模板导出模板时会创建一个文件,其中包含当前项目的过滤器组和自定义标签。使用该模板可以将项目配

置导入到其他项目文件中。

导出模板:

1. 选择 Fortify Software - Project Configuration (项目配置)。

屏幕中将显示 Project Configuration (项目配置)对话框。

2. 单击 Filter Sets (过滤器组)选项卡。

3. 单击 Export Project Template (导出项目模板)。

屏幕中将显示 Save Project Template (保存项目模板)对话框。

4. 浏览至您要保存该文件的位置。

5. 输入一个文件名,不必包含扩展名。

6. 单击 Save (保存)。

模板组的当前设置即会保存到该文件中。

导入模板导入模板时会覆盖项目配置的设置。过滤器组和自定义标签也会替换成模板中相应的内容。

导入模板:

1. 选择 Fortify Software - Project Configuration (项目配置)。

屏幕中将显示 Project Configuration (项目配置)对话框。

2. 单击 Filter Sets (过滤器组)选项卡。

3. 单击 Import Project Template (导入项目模板)。

屏幕中将显示 Import Project Template (导入项目模板)对话框。

4. 选择该模板文件。

5. 单击 Import (导入)。

模板过滤器组和自定义标签会随之更新。

34 Audit Workbench 用户指南

Page 41: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

第 4 章:审计分析结果本节包含以下主题:

• 使用 Eclipse 导航和编辑特性

• 自定义问题视图

• 合并多个审计员的审计结果

• 从新的分析结果文件中更新

• 导航并查看分析结果

• 问题分组

• 使用搜索

• 创建问题

使用 Eclipse 导航和编辑特性

Audit Workbench 提供了源代码导航和编辑特性,这些特性的操作方式与 Eclipse 相同。

这些特性可通过以下方式访问:

• Source (源)菜单,提供源代码的编辑和格式化工具

• Search (搜索)菜单,提供关键字搜索及代码导航工具

• Options (选项)菜单中的 Preferences (首选项)选项,允许您自定义窗口和编辑器的显示

方式

有关使用这些特性的信息,请参见 Eclipse 文档。

自定义问题视图您可以从 Options(选项) - Options(选项) - Interface Preferences(界面首选项)菜单中设置

以下选项,以自定义 “Issues (问题)”视图:

Audit Workbench 用户指南 35

Page 42: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

图 11:界面首选项

• Show Entry Points (显示入口点):显示用户输入进入程序的所有位置。

• Show Suppressed Items (显示废除项):显示您已废除的所有项。默认情况下,会禁用该

选项。

• Show Removed Items (显示删除项):如果您已经执行了“(Import New SCA Analysis导入新 SCA 分析)”,则会显示自上次分析以来已删除的所有项。

• Use Short Filenames (使用短文件名):仅通过文件名而非相对路径来参照 “Issues (问

题)”视图中的问题。默认情况下,已启用该选项。

• Show View (显示视图):允许显示 Analysis Trace (分析跟踪)、 Issues (问题)以及 Summary (总结)面板。它还提供了 Other (其他)选项,其中包含标准的 Eclipse 导航特性。

合并多个审计员的审计结果Audit Workbench 允许多个审计员审计某个相同代码的各个部分,然后合并审计结果。要这样做,请

选择 Tools (工具) - Merge Audits (合并审计),然后导航到审计项目文件 (.fpr) (其中包含您

要合并到当前项目中的审计后的问题)。

注意:仍需要进行外部协调,以确保不同的问题组都经过了审计。如果对相同的问题进行了两次审

计, Audit Workbench 会发出警告,并允许您执行以下其中一项操作:

• 取消合并 (未做更改)

• 对于有冲突的问题,使用当前审计员的更改

36 Audit Workbench 用户指南

Page 43: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

创建自定义清除规则Audit Workbench 允许您为特定的函数创建自定义清除规则。

创建清除规则:

1. 右键单击函数,打开关联菜单。

2. 选择 Write a Rule for This Function (为该函数编写规则),打开 Custom Rules (自定义规

则)向导。

3. 选择 Generic Validation Rule (一般验证规则)。

屏幕将显示 Select Language (选择语言)窗口。

4. 选择源代码的语言,然后单击 Next (下一步)。

5. 屏幕将显示 “Function Information (函数信息)”窗口。

6. 系统会自动植入所选函数的包、类和函数名。

7. 验证信息是否正确,然后单击 Next (下一步)。

屏幕将显示 “Function Argument (函数参数)”窗口。

8. 选择您要清除的参数,然后单击 Next (下一步)。

屏幕将显示 “Custom Rulepack Selection (自定义规则包选择)”窗口。

9. 选择您要在其中添加规则的规则包。

10. 单击 OK (确定)。

从新的分析结果文件中更新如果您对某个分析结果文件执行了审计,随后对源文件重新运行扫描,则您可以用新分析结果文件

中的结果来更新利用旧分析结果文件创建的审计项目文件,且不会丢失先前输入的审计信息。

利用新的扫描而创建的分析结果文件中的结果来更新审计项目文件:

1. 打开旧的审计项目文件。

2. 选择 Tools (工具) - Import New SCA Analysis (导入新的 SCA 分析)。屏幕将显示 Choose SCA Analysis File (选择 SCA 分析文件)窗口。

3. 选择新的分析结果文件。

4. 选择 File (文件) - Save As (另存为),然后将新的分析结果文件另存为新的审计项目文件。

您也可以使用 updatefpr.jar 命令行工具(可让您在不启动 Audit Workbench 的情况下执行更

新),利用新的分析结果文件更新审计项目文件。

updatefpr.jar 命令行工具位于以下目录中:

<install_directory>/Tools/updatefpr

使用语法如下:

java -jar updatefpr.jar <new>.fvdl old.fpr <new>.fpr

通常,会将审计数据从旧的扫描复制到新的扫描中,方法是使这两次扫描中的漏洞实例 ID 相匹配。

不过,由于分析引擎中发生更改,对于同一种逻辑漏洞,Fortify SCA 4.5 实例 ID 可能不同于 Fortify SCA 4.0 实例 ID,从而导致某些审计数据的丢失。

对于同一版本的代码基数, migrate_audit_data 可将审计数据从 Fortify SCA 4.0 FPR 迁移到 Fortify SCA 4.5 FPR。即使实例 ID 各不相同,它也会查看漏洞结构以确定两种漏洞是否相同。

以下目录包含 migrate_audit_data 和 README.txt 文件 (说明该工具的用法):

<installation_directory>/Tools/migrate_audit_data

Audit Workbench 用户指南 37

Page 44: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

导航并查看分析结果在您打开一个用来查看 Fortify Source Code Analyzer (Fortify SCA) 所检测到的问题的 Audit Workbench 项目之后,您可以在 Summary (摘要)面板中审计这些问题,以反映这些问题的严重

级别,以及对该问题执行的安全分析状态。

系统会按审计结果的严重性以及准确性,对审计结果进行分组,并在默认情况下将问题识别为位于

“Issues (问题)”面板中的 Hot (严重)列表内。单击 Warning (警告)和 Info (信息),查看

分组在这些列表中的问题。

每个列表中的问题数量显示在相关按钮下面。

要检验与 Issues (问题)面板中所列问题相关的代码,选中该问题。源代码部分包含显示在源代码

查看器面板中的问题,并在面板的标题中显示文件所包含问题的名称。

问题分组根据所选 Group By (分组方式)选项的不同,导航树中显示的各项会有所不同。下表中描述了

“Group By (分组方式)”选项。

在各种 Group By (分组方式)选项之间切换,以查看不同的问题视图。

表 10:分组方式选项

选项 描述

Analyzer (分析器) 按分析器类型对问题进行分组

Audit Analysis(审计分析)

按审计分析对问题进行分组,如可疑的和可利用的

Category (类别) 按漏洞类别对问题进行分组。此为默认设置。

File name (文件名) 按文件名对问题进行分组

Package (包) 按照包或命名空间对问题进行分组。对于该选项不适用的项目(如 C 项目),不会进行显示。

Sink 对共享同一数据流侵入函数的问题进行分组

Source 对共享同一数据流源函数的问题进行分组

Taint flag(感染标记)

按问题包含的感染标记对其进行分组

New Issues(新问题)

显示从上次扫描以来出现的新问题。例如,如果您运行新的扫描,任何新问题会都会显示在“New Issues (新问题)”组之下的树

中,而其他问题会显示在“Existing Issues (现存问题)”组中。在新扫描中删除的问题会显示在“Removed (已删除)”列表中。

(none) (无) 显示没有进行分组的平面视图。

38 Audit Workbench 用户指南

Page 45: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

使用搜索您可以使用搜索选项来查看问题的子集。搜索条件基于搜索修正器。搜索修正器可指定某个问题的

特定属性,以根据该属性执行搜索。

要使用“Advanced Search (高级搜索):”对话框来建立搜索表达式,请单击 Advanced (高级)。

屏幕将显示“Search Query (搜索查询)”窗口。

另外,请以下列格式在搜索字段中输入搜索条件:

<modifier>:<criteria>

关于搜索修正器 要执行精确的匹配搜索,请在引号中输入条件。例如,如果您输入 status:reviewed,则无论是

否经过检查,都会返回所有问题,因为它们都包含词汇 "reviewed"。要仅搜索检查过的问题,请输

入 status:"reviewed"。

要使用名称中包含空格的修正器,如自定义标签的名称,请用方括号界定修正器。例如,要搜索新

的问题,请输入 [issue age]:new。

下表描述了搜索修正器。

未用修正器限定的搜索,会尝试匹配有关下列属性的搜索字符串:领域、主规则 ID、分析器、文件

名、严重性、类名、函数名、实例 ID、包、可信度、类型、子类型、感染标记、类别、侵入、源。

• 要将搜索应用于所有修正器,请输入一个字符串,如 control flow。这样,会搜索所有修正

器,并返回包含字符串 "control flow" 的任何结果。

• 要将搜索应用于特定修正器,请键入修正器的名称和字符串,如下所示:analyzer:control flow。这样,会查找分析器是 "control flow" 的所有结果。

表 11:搜索修正器

修正器 描述

[issue age] 搜索问题状况,即已删除、现存或新问题。

analysis (初级自定义标签的默认名称)搜索问题的分析字段

<custom_tagname> 搜索指定的自定义标签

analyzer 搜索问题,查找已经通过的分析器

audited 搜索问题以查明是真(如果已设置初级自定义标签)还是假(如果未设置初级自定义标签)

category (cat) 搜索指定类别或某一类别的子字符串

comments(comment, com)

在针对问题输入的注释中搜索

commentuser 搜索带有来自指定用户的注释的问题

confidence(con) 搜索具有指定可信度值的问题

file 搜索包含问题的文件

historyuser 搜索有关历史记录中用户名的问题

Audit Workbench 用户指南 39

Page 46: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

关于搜索字符串本小节描述了搜索字符串字段的语法。

• Contains: 搜索没有任何特殊的限定界定符的短语

• Equals: 若短语包含在 “”中,则搜索完全匹配项

• Regex: 搜索符合 Java 风格正则表达式 (以 /. 界定)的值 例如 /eas.+?/。

• Number range: 标准数学语法:(and) 表示排除, [ and ] 表示包含,因此, (2,4] 意味着大于 2 但小于或等于 4

• Not Equals: 在字符串前添加一个感叹号 !,即表示否定上述任何项。例如, !term 将返回默认

字段中没有短语的所有问题

搜索查询示例 考虑以下示例:

• 在包含 jsp 且将 getSSN() 作为源的文件名中,要搜索所有 privacy violation,请输入:

category:"privacy violation" source:getssn file:jsp

• 要搜索所有包含 com/fortify/awb 的文件名,请输入:

file:"com/fortify/awb"

kingdom 搜索指定领域中的所有问题

maxconf 搜索可信度高达某一数值且包含指定为搜索短语的数值的所有问题

<metagroupings> 搜索问题元分组字段。默认元组如下: [Owasp Top Ten 2006][Owasp Top Ten 2007][Fortify Priority Order]

minconf 搜索可信度低于某一数值且包含指定为搜索短语的数值的所有问题

package 搜索指定包中的所有问题

primaryrule (rule)

搜索与指定侵入规则相关的所有问题

ruleid 搜索由指定规则 ID (用于生成问 source、 sink 及所有传递

路径)报告的所有问题

severity (sev) 搜索具有指定严重级别的所有问题

sink 返回已有字符串传递到侵入函数中的问题

source 返回已有字符串传递到源函数中的问题

status 搜索已检查、未检查和正在检查的问题的“状态”

taint 搜索已指定感染标记的问题

trace 搜索已有字符串传递到数据流跟踪中的问题

表 11:搜索修正器

修正器 描述

40 Audit Workbench 用户指南

Page 47: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

• 要搜索包含跟踪信息且将 mydbcode.sqlcleanse 作为名称的一部分的所有路径,请输入:

trace:mydbcode.sqlcleanse

• 要搜索包含跟踪信息且将 cleanse 作为名称的一部分的所有路径,请输入:

trace:cleanse

• 要搜索所有包含 cleanse 作为任何任意修正器的一部分的问题,请输入:

cleanse

• 要搜索注释中带有 asdf 的所有已废除的漏洞,请输入:

bucket:suppressed comments:asdf

创建问题将您认为是一个问题但未被检测到的问题添加到 “Issues (问题)”列表中。手动配置的问题可以

在 “Summary (摘要)”选项卡上像审计其他问题一样进行审计。

新建问题:

1. 选择源代码查看器面板中代码行内的对象。

2. 右键单击包含问题的行。

3. 从关联菜单中选择 Create New Issue (新建问题)。

屏幕将显示 Create New Issue (新建问题)窗口。

4. 选择问题类别,然后单击 OK (确定)。

问题将添加到导航树中,并在右侧显示 “(custom issue) (自定义问题)”,然后可将其编辑为包含

适当的审计信息,如同其他问题一样。

废除问题您可以废除已修复的问题 (例如,通过执行数据验证),也可以废除不准备进行修复的问题。

可以使用以下方法中的一种来废除问题:

• 在 Issues (问题)面板中选择问题,然后在 Summary (摘要)选项卡上单击 Suppress (废

除)图标。

• 右键单击“Issues (问题)”面板中的问题,然后选择 Suppress (废除)。

如果您想要检查已经废除的结果,请从 Analysis Results (分析结果)工具栏上的显示问题菜单中选

择 Show Suppressed Issues (显示废除的问题)。

Audit Workbench 用户指南 41

Page 48: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

42 Audit Workbench 用户指南

Page 49: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

第 5 章:使用高级功能这部分包含了以下这些主题:

• 管理规则包

管理规则包该部分描述了如何去升级安全编码规则包并管理规则安全设置。

升级安全编码规则包安全编码规则包会找出核心语言和和第三方编程接口中的安全漏洞。

要完全利用安全编码插件提供的行业领先技术,完善和升级安全编码规则包是必须的。

你可以通过以下方式来获得新的安全编码规则包:

• 选取规则包升级服务器。

• 手动复制客户的规则文件到 <install_directory>/Core/config/customrules 目录

注意:当您升级一个规则包时,任何对于规则包掩码的改变都会被覆盖。

更新规则包:

1. 选择 Fortify Software - Options (选项) - Rulepack Management (规则包管理)。

2. 单击 Update (更新)。

会更新安全编码规则包。

要获取可用的安全编码规则包的描述,请查看安全编码规则包参考。

Audit Workbench 用户指南 43

Page 50: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

44 Audit Workbench 用户指南

Page 51: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

第 6 章:生成报告本节包含以下主题:

• 打开报告模板

• 运行报告

• 使用报告模板

• 保存报告模板

• 保存对报告模板的更改

• 编辑报告模板 XML 文件

打开报告模板打开报告模板:

1. 在 Audit Workbench 工具栏中单击 Reports (报告)。

系统会显示 “Generate Reports (生成报告)”窗口。

2. 从 “Report (报告)”的下拉列表中选择报告模板。

“Generate Report (生成报告)”窗口中会显示报告模板设置。

运行报告选择了所需报告模板和报告设置后,即可生成报告以查看其结果。您可以将报告结果另存为 PDF、RTF 和 XML 文件。

运行报告:

1. 在 Audit Workbench 工具栏中单击 Reports (报告)。

系统会显示 “Generate Reports (生成报告)”窗口。

2. 从 “Report (报告)”下拉菜单中选择报告模板。

3. 另外,还可以更改报告一节的设置。

4. 单击 Print Report (打印报告)。

会显示保存报告的对话框。

5. 指定文件名称和保存报告的位置。

6. 选择报告的文件类型。提供的选项有 PDF、 RTF 或 XML。

7. 单击 Save (保存)。

已生成报告并另存为一个文件。

使用报告模板本节介绍了报告模板的选择区和编辑区。其中包括:

• 关于 Fortify 报告模板

• 选择报告小节

• 编辑报告的子小节

Audit Workbench 用户指南 45

Page 52: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

关于 Fortify 报告模板

首次安装 Fortify 产品后,下拉列表中会显示 Fortify 报告模板。如果您或其他用户已经编辑或创建了

其他默认报告模板,可能无法查看上述默认报告模板。

Fortify 报告模板包括:

• Fortify 安全报告:一种中级报告,可以提供有关所执行分析的综合信息以及所执行审计的高级

详细信息。还可以为优先级 高的类别提供高级说明和示例。

• Fortify 开发人员工作手册:一份综合列表,其中列出了已找到的所有问题类型,并为每种问题

列举了多个示例。它还为每种类别的问题数目提供了高级汇总信息。

选择报告小节您可以选择要包含在报告中的各个小节,还可以编辑各小节显示的内容。

选择要包含在报告中的各个小节:

1. 在左侧列表中勾选每个小节标题的复选框,即可将其包含在报告中。

2. 单击小节标题可突出显示该标题。

窗口的右侧会显示小节的详细信息。有关编辑各小节的详细信息,请参见第 46 页中的“编辑报告的

子小节”。

要从报告中删除某个小节,请取消勾选小节标题旁边的复选框即可。

编辑报告的子小节选择了小节标题后,便可以编辑在报告中显示的内容。您可以编辑文本、添加或更改文本变量,还可

以自定义图标或结果列表中显示的问题。

其中包括:

• 编辑文本子小节

• 编辑结果列表子小节

• 编辑图表子小节

编辑文本子小节

编辑文本子小节:

1. 勾选所需子小节标题旁边的复选框,即可将该文本包含在报告中。子小节标题下方会显示对文本的说明。

2. 单击 Edit Text (编辑文本)。

文本框中会显示即将会包含在报告中的文本和变量。

3. 根据需要编辑文本和文本变量。

编辑文本子小节后,您可以插入在运行报告时定义的变量。

46 Audit Workbench 用户指南

Page 53: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

表 12: 文本变量

变量 描述

$AUDIT_GUIDE_SUMMARY$ 列出了通过回答 Audit Guide (审计指南)的问题所创建的

过滤器

$CLASSPATH_LISTING$ 扫描过程中使用的 JAR 文件,每行一个相对路径

$COMMANDLINE_ARGS$ 命令行参数的完整列表 (其格式与项目汇总的格式相同)

$FILE_LISTING$ 已扫描文件的列表,每个文件的格式为 <relative file path> # Lines # kb <timestamp>

$FILTERSET_DETAILS$ 当前过滤器组正在使用的过滤器列表

$FILTERSET_NAME$ 当前过滤器组的名称

$FORTIFY_SCA_VERSION$ Fortify SCA 版本

$LIBDIR_LISTING$ 扫描过程中指定的 libdirs,每行一个相对路径

$LOC$ 代码总行数

$NUMBER_OF_FILES$ 已扫描的文件总数

$PROJECT_BUILD_LABEL$ 项目的内部版本标签

$PROJECT_NAME$ Build ID

$PROPERTIES$ 分析阶段设置的属性的完整列表 (其格式与项目汇总的格式相同)

$RESULTS_CERTIFICATION$ 带有每个文件的有效性列表的完整认证详情 (请参见项目汇总)

$RESULTS_CERTIFICATION_SUMMARY$

用于描述认证的短句 (其格式与项目汇总的格式相同)

$RULEPACKS$ 分析过程中使用的规则包的完整列表 (其格式与项目汇总的格式相同)

$SCAN_COMPUTER_ID$ 执行扫描操作的计算机主机名

$SCAN_DATE$ 使用语言环境的默认格式化类型进行的分析的日期

$SCAN_SUMMARY$ 已扫描代码库的汇总格式为 # files, # lines of code

$SCAN_TIME$ 分析阶段所用的时间

$SCAN_USER$ 执行扫描的用户名

$SOURCE_BASE_PATH$ 代码库的源库路径

$TOTAL_FINDINGS$ 找到的问题总数,不包括已废除或删除的问题

$WARNINGS$ 已出现的警告的完整列表 (其格式与项目汇总的格式相同)

$WARNING_SUMMARY$ 扫描过程中发现的警告次数

Audit Workbench 用户指南 47

Page 54: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

编辑结果列表子小节

编辑结果列表子小节:

1. 勾选所需子小节标题旁边的复选框,即可将该文本包含在报告中。子小节标题下方会显示对结果列表的说明。

2. 单击列有标题的问题可展开各个选项。

3. 选择将按其对结果列表进行分组的各种属性。有关用作分组方式的属性列表,请参见第 38 页中

的“问题分组”。如果选择按类别进行分组,用于类别的建议、摘要和解释也会包含在报告中。

4. 您可以使用搜索功能细化该子小节中显示的各种问题。有关搜索语法的更多详情,请参见第 39 页中的 “使用搜索”。

查询内容会显示在“Subsection (子小节)”字段的 “Refine Issues (细化问题)”中。

5. 勾选或清除各组复选框中的“Limit number of Issues (有限数量的问题)”。

6. 如果勾选了该复选框,请键入每个组中显示的问题数量。

编辑图表子小节

编辑图表子小节:

1. 勾选所需子小节标题旁边的复选框,即可将该文本包含在报告中。子小节标题下方会显示对图表的说明。

2. 选择按其对图表进行分组的各种属性。有关用作分组方式的属性列表,请参见第 38 页中的“问

题分组”。

3. 您可以使用搜索功能细化该子小节中显示的各种问题。有关搜索语法的更多详情,请参见第 39 页中的“使用搜索”。

查询内容会显示在“Subsection (子小节)”字段的 “Refine Issues (细化问题)中。”

4. 选择图表类型。图表类型包括表格、直方图和饼图。

保存报告模板您可以将当前的报告设置另存为新的模板,以便日后选择该模板运行更多的报告。

将设置另存为报告模板:

1. 在 Audit Workbench 工具栏中单击 Reports (报告)。

系统会显示“Generate Reports (生成报告)”窗口。

2. 从“Report (报告)”下拉菜单中选择该报告模板。

3. 更改报告小节和子小节的设置。

4. 单击 Save as New Template (另存为新模板)。

即可保存为新的报告模板。当您从报告下拉菜单中选择该报告模板的名称时,该模板的报告设置便会

显示在“Generate Report (生成报告)”窗口中。

保存对报告模板的更改您可以保存对报告模板的更改,这样,当前的新设置即会显示为默认设置。

将某个报告模板另存为默认的报告模板:

1. 在 Audit Workbench 工具栏中单击 Reports (报告)。

系统会显示“Generate Reports (生成报告)”窗口。

48 Audit Workbench 用户指南

Page 55: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

2. 从 “Report (报告)”下拉菜单中选择要另存为默认报告模板的模板。

3. 另外,还可以更改报告小节和子小节的设置。

4. 单击 Save Settings as Default (另存为默认设置)。

下次打开 “Generate Reports (生成报告)”窗口时,窗口中即会显示该报告模板的设置。该报告

模板的名称显示在 “Report (报告)”下拉菜单的顶端。

编辑报告模板 XML 文件

报告模板会另存为 XML 文件。您可以编辑这些 XML 文件,以做出更改或创建新的报告模板文件。

编辑 XML 文件时,您可以选择要包含在报告模板中的各个小节和每个小节的内容。

报告模板 XML 文件的默认位置为:

<install_directory>/Core/config/reports

通过在该目录中指定路径或更改 header.png 和 footer.png,还可以自定义报告中使用的标识语。

添加报告小节您可以通过编辑 XML 文件来添加报告小节。在 XML 的结构中, ReportSection 标签可定义一个

新的小节。在定义的新小节中,Title 标签定义了小节名称,其中必须至少包括一个 Subsection 标签,用于在报告中定义该小节的内容。以下是 Fortify 安全报告中 Results Outline 小节的 XML 代码:

<ReportSection enabled="false" optionalSubsections="true">

<Title>Results Outline</Title> <SubSection enabled="true">

<Title>Overall number of results</Title> <Description>Results count</Description> <Text>The scan found $TOTAL_FINDINGS$ issues.</Text>

</SubSection> <SubSection enabled="true">

<Title>Vulnerability Examples by Category</Title> <Description>Results summary of the highest severity issues. Vulnerability examples are provided by category.</Description> <IssueListing limit="1" listing="true">

<Refinement>severity:(3.0,5.0] confidence:[4.0,5.0]</Refinement> <Chart chartType="list">

<Axis>Category</Axis> </Chart>

</IssueListing> </SubSection>

</ReportSection>

在上述示例中, "Results Outline" 小节包含两个子小节。第一个子小节是名为 Overall number of results 的文本子小节。第二个子小节是名为 Vulnerability Examples by Category 的结果列表。一个小节的内容可以包含任何子小节的组合。

Audit Workbench 用户指南 49

Page 56: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

添加报告子小节在报告小节中,您可以添加多个子小节或编辑子小节中的内容。子小节可以生成文本、结果列表或

图表。

添加文本子小节

在文本子小节中,您可以包含 Title 标签、Description 标签和 Text 标签。在 Text 标签中,

方便用户可以在生成报告之前编辑其中的内容,当然您仍可以提供默认内容。有关文本子小节中可

用文本变量的说明,请参见第 46 页中的“编辑文本子小节”。以下是 Results Outline 小节

中 Overall number of results 子小节的 XML 代码:

<SubSection enabled="true"> <Title>Overall number of results</Title> <Description>Results count</Description> <Text>The scan found $TOTAL_FINDINGS$ issues.</Text>

</SubSection>

在上述示例中,该文本子小节的标题为 Overall number of results。用于介绍该文本用途的

说明文字为 Results count。用户可以在运行报告之前编辑 "text" 字段中的文字,该内容使用了一

个名为 $TOTAL_FINDINGS$ 的变量。

添加结果列表子小节

在结果列表子小节中,您可以包含 Title 标签、 Description 标签和 IssueListing 标签。在 IssueListing 标签中,您可以定义 "limit" 的默认内容,并将 listing 设为 true。即便用户可以

在生成报告之前编辑 Refinement 标签的内容,您仍可以在报告中包含带有默认语句或不带默认语

句的标签。要生成结果列表,需将 Chart 标签的 chartType 属性设为 list。您还可以定义 Axis 标签。以下是 Results Outline 小节中 Vulnerabilities Examples by Category 子小节

的 XML 代码:

<SubSection enabled="true">

<Title>Vulnerability Examples by Category</Title> <Description>Results summary of the highest severity issues. Vulnerability examples are provided by category.</Description> <IssueListing limit="1" listing="true">

<Refinement>severity:(3.0,5.0] confidence:[4.0,5.0]</Refinement> <Chart chartType="list">

<Axis>Category</Axis> </Chart>

</IssueListing>

</SubSection>

在上述示例中,结果列表子小节的标题为 Vulnerability Examples by Category。用于

介绍该文本用途的说明文字为 Results summary of the highest severity issues。Vulnerability examples are provided by category。该子小节将会为每种包含符合 severity:[3.0,5.0] confidence:[4.0,5.0](即 Refinement 标签的值)语句的问

题类别(即 Axis 标签的值)列出 (listing=true) 一个问题 (limit="1")。

50 Audit Workbench 用户指南

Page 57: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

添加图表子小节

在图表子小节中,您可以包含 Title 标签、 Description 标签和 IssueListing 标签。在 IssueListing 标签中,您可以定义 "limit" 的默认内容,并将 listing 设为 false。即便用户

可以在生成报告之前编辑 Refinement 标签的内容,您仍可以在报告中包含带有默认语句或不带

默认语句的标签。要生成一个饼图,需将 Chart 标签的 chartType 属性设为 pie。提供的选项

包括 table、 pie 和 bar。用户可以在生成报告之前更改此设置。您还可以定义 Axis 标签。

以下代码显示了图表子小节的一个示例。

<SubSection enabled="true">

<Title>New Issues</Title> <Description>A list of issues discovered since the previous analysis</Description> <Text>The following issues have been discovered since the last scan:</Text> <IssueListing limit="-1" listing="false">

<Refinement /> <Chart chartType="pie">

<Axis>New Issue</Axis> </Chart>

</IssueListing>

</SubSection>

在上述子小节中,图表 (limit="-1" listing="false") 包含名为 New Issues 的标题以及包

含 The following issues have been discovered since the last scan 内容的文本小

节。由于 "Refinement" 标签为空,该图表将会包含所有问题,并按照 New Issue(即 Axis 标签

的值)的值对这些问题进行分组。该图表将会显示为一个饼图 (chartType="pie")。

Audit Workbench 用户指南 51

Page 58: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

52 Audit Workbench 用户指南

Page 59: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

第 7 章:编写自定义规则这部分包含以下主题:

• Fortify SCA 规则概述

• 使用自定义规则包

• 使用自定义规则向导

• 编辑和删除规则

• 在 XML 视图中编写规则

• 配置自定义规则元素

• 验证自定义规则

Fortify SCA 规则概述

默认情况下, Fortify SCA 使用安装的安全编码规则包用来检查源代码,并定义一系列可能出现的问

题,如可被攻击者利用的安全漏洞和不良的编程实践。

安全编码规则包中的规则分析了受支持语言的核心和扩展的 API 包中的元素,并将分析结果记录在 Fortify SCA 中。每一个问题的解释包含了对问题的描述和建议的解决方案,用以保护漏洞免受攻击

和修复不良的编程实践。

您可以通过创建自定义规则包来准确地分析特定的应用程序 (其中包含有关源代码元素附加信息的

规则),验证专门的安全规则,以及细化 Fortify SCA 所报告的问题。

编写有效的自定义规则要编写有效的自定义规则,熟悉已知的安全漏洞类别和通常与它们相关的函数类型是非常重要的。

深入理解各类经常出现在特定类型漏洞的函数有利于在编写自定义规则过程中能够瞄准与安全相关

的函数。确定函数的安全性是一件非常复杂的事情,然而事实证明花费在学习函数类型与漏洞类别

之间关系上的时间的确是有益的。

您必须识别与安全相关的函数,并检查它们的个体行为 (通过检查源代码,或借助 API 文档)以此

来确定能够体现各个函数具体行为和与之相关的漏洞类别的正确规则形式。一旦确定好了这种联系,

使用自定义规则编辑器来创建规则就相对简单了。

使用自定义规则包自定义规则包包含了一系列的规则。自定义规则包能够包含所有受支持语言的规则。

本小节包含以下主题:

• 新建自定义规则包

• 配置规则包的细节

• 安装自定义规则包

Audit Workbench 用户指南 53

Page 60: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

新建自定义规则包本节介绍了如何新建一个自定义规则包。新规则包是空的。当您创建好规则包后,可以编写自定义规

则并将这些规则添加到规则包中。

创建一个自定义规则包:

1. 在“Audit (审计)”窗口中,选择 File (文件) - Open Custom Rules Editor (打开自定义

规则编辑器)。

屏幕上将显示 Fortify Audit Workbench Custom Rules Editor (Fortify Audit Workbench 自定义

规则编辑器)窗口。

2. 选择 File (文件) - New Rule Pack (新规则包)。

屏幕上将显示 Create a New Folder (新建规则包)对话框。

3. 在文件名栏,输入规则包的名称。

4. 单击 Save (保存)。

在“Table View (表格视图)”中将显示一个新的自定义规则包。

打开 “Custom Rulepack (自定义规则包)”

您可以在不打开新规则的情况下将它添加到现有的规则包中。

打开一个现有的自定义规则包:

1. 在“Audit (审计)”窗口中,选择 File (文件) - Open Custom Rules Editor (打开自定义

规则编辑器)。

屏幕上将显示 Fortify Audit Workbench Custom Rules Editor (Fortify Audit Workbench 自定义

规则编辑器)窗口。

2. 选择 File (文件) - Open Rulepack (打开规则包)。

屏幕上将显示 Choose Rules File (选择规则文件)对话框。

3. 选择所需的规则包,然后单击 Open (打开)。

在“Table View (表格视图)”中将打开一个新的自定义规则包。

配置规则包的细节规则包信息可以定义自定义规则。默认的规则包名称是文件名。 Audit Workbench、 Fortify SCA Team Server 和 Fortify Manager 可以通过显示“Rulepack/Name (规则/名称)”元素帮助用户定义

特定的规则包。

设置自定义规则包的细节:

1. 在“Audit (审计)”窗口中,选择 File (文件) - Open Rulepack (打开规则包)。

屏幕上将显示 Choose Rules File (选择规则文件)对话框。

2. 选择所需的文件,然后单击 Open (打开)。

在 Table View (表格视图)中将显示一个新的自定义规则。

3. 单击 XML View (XML 视图)选项卡。

4. 设置规则包细节,如下所示:

a. 在 Name (名称)元素中的 CDATA 的括号内输入定义规则包的名称。

b. 在 Description (描述)元素中的 CDATA 的括号内输入对规则包的简短描述。

54 Audit Workbench 用户指南

Page 61: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

5. 单击 File (文件) - Save Rulepack (保存规则包)。

可以更改规则包的名称和描述。

规则包细节的示例:

<Name><![CDATA[myCompany's Security Rules]]></Name><Description><![CDATA[Enforces security guide lines.]]></Description>

安装自定义规则包本节介绍了如何安装一个自定义规则包副本。默认情况下, Fortify SCA 通过使用自定义规则目录中

的所有可以找得到的自定义规则包来分析代码。自定义规则目录的位置:

<install_directory>/Core/config/ssm.properties

创建一个自定义规则包:

1. 在 “Audit (审计)”窗口中,选择 Options (选项) - Options (选项)。

屏幕上将显示 Options (选项)窗口。

2. 选择 Rulepack Management (规则包管理)。

屏幕上将显示 Ruelpack Management (规则包管理)面板。

3. 单击 Import Rulepacks (导入规则包)。

屏幕上将显示 Select Rulepack (选择规则包) 对话框。

4. 选择所需的自定义规则包,然后单击 Open (打开)。

自定义规则包的副本会保存在自定义规则目录中。

使用自定义规则向导通过自定义规则,您可以分析第三方和专有的库,发现无法扫描使到的源代码信息以及针对可能被

安全编码规则包视为问题的元素编写相关的规则。

使用规则向导可创建如下类型的规则:

表 13: 规则向导选项

选项 描述

Access Control: Database Validation Rule

定义验证对数据库中所存储的信息的访问权限的函数 (授权函数)。这个规则可以发现与未经授权的访问相关的漏洞

Alias Rule 在安全编码规则包或自定义规则的范围内定义核心和扩展 API 所发现的能够模拟其他函数行为的函数。

Allocation Rule 定义内存分配的函数。这个规则有助于跟踪缓冲区大小并检测 buffer overflow 漏洞

Buffer Overflow Detection Rules for 'scanf' Family of Functions

定义像 scanf() 家族函数一样运行的函数。这些规则有助于跟踪缓冲区大小并检测 buffer overflow 漏洞

Buffer Overflow Detection Rules for 'sprintf' Family of Functions

定义像 sprintf() 家族函数一样运行的函数。这个函数可以在格式化字符串中并置多个起始缓冲区,并将格式化字符串的多个内存单位复制到目标缓冲区。这个规则有助于跟踪缓冲区大小并检测 buffer overflow 漏洞

Audit Workbench 用户指南 55

Page 62: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

Buffer Overflow Detection Rules for 'strcat' Family of Functions

定义像 strcat() 家族函数一样运行的函数。它在目标缓冲区的末端并置了多个起始缓冲区的内存单位。这些规则有助于跟踪缓冲区大小并检测 buffer overflow 漏洞

Buffer Overflow Detection Rules for 'strcpy' Family of Functions

定义像 strcpy() 家族函数一样运行的函数。它可以将多个内存单位从起始缓冲区复制到目标缓冲区。这些规则有助于跟踪缓冲区大小并检测 buffer overflow 漏洞

Cross-Site Scripting Sink Rule 定义在输入参数没有进行适当验证的情况下有可能在浏览器中执行恶意代码的函数

Cross-Site Scripting Source Rule 定义充当输入源的函数,如果这样的函数没有经过适当的验证,会导致浏览器执行恶意代码。

Cross-Site Scripting Validation Rule

定义发送到网页前需要进行适当的数据验证的函数

Generic Pass-Through Rule 定义一个其输入参数会和输出参数交互数据的函数。

Generic Semantic Rule 定义可能出现的 dangerous function

Generic Sink Rule 定义在输入参数没有进行适当验证的情况下有可能带来多种安全漏洞风险的函数

Generic Source Rule 定义充当输入源的函数,如果这样的函数没有经过适当的验证,会导致多种安全漏洞。

Generic Validation Rule 定义能够针对多种安全漏洞而进行适当验证的函数

HTTP Response Splitting Sink Rule

定义在输入参数没有进行适当验证的情况下有可能破坏 HTTP 响应头文件的函数

HTTP Response Splitting Validation Rule

定义加入 HTTP 响应头文件之前已进行适当的数据验证的函数

Integer Overflow Sink Rule 定义易于发生 integer overflow 漏洞的函数,这种漏洞会在

输入参数验证不当的情况下导致逻辑错误和 buffer overflow。

Log Forging Sink Rule 定义在输入参数没有进行适当验证的情况下有可能向日志文件写入恶意或伪造条目的函数

Pass-Through Rule that Indicates that Outgoing Value does not End with a Newline Character

定义未在输出参数中附加换行符的参数

Pass-Through Rule that Indicates that Outgoing Value does not End with a Null Character

定义没有适当地以 "\0" 结束输出缓冲区的函数

Pass-Through Rule that Indicates that Outgoing Value Ends with a Newline Character

定义在输出参数中附加换行符的参数

Pass-Through Rule that Indicates that Outgoing Value Ends with a Null Character

定义适当地以 "\0" 结束输出缓冲区的函数

表 13: 规则向导选项

选项 描述

56 Audit Workbench 用户指南

Page 63: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

Pass-Through Rule that Indicates that Outgoing Value is Deobfuscated

定义充当去模糊化例程的函数

Pass-Through Rule that Indicates that Outgoing Value is not Numeric

定义处理输入参数的函数,以使其输出参数不为数字。

Pass-Through Rule that Indicates that Outgoing Value is Numeric

定义处理输入参数的函数,以使其输出参数为数字。

Pass-Through Rule that Indicates that Outgoing Value is Poorly Encrypted

定义对输入参数所执行的加密方式较差的函数,如基于 64 位的编码。

Pass-Through Rule that Indicates that Outgoing Value Represents the Length of the String

定义输出参数可以表示字符串长度的函数

Password Management Sink Rule

定义采用永远不会被破译或去模糊化的明文密码作为参数的函数

Password Management: Weak Cryptography Sink Rule

定义采用加密方式较差的密码作为参数的函数

PCI Violation Sink Rule 定义有可能将信用卡数据显示给攻击者的函数

PCI Violation Source Rule 定义将信用卡数据引入应用程序的函数

PCI Violation Validation Rule 定义信用卡数据显示给攻击者前可以对这些数据进行适当验证的函数

Privacy Violation Sink Rule 定义在输入参数处理不当的情况下由于向攻击者显示私人信息而导致可能危及用户隐私的函数

Privacy Violation Source Rule 定义作为私人数据源的函数,如果处理不当,会危害用户隐私。

Privacy Violation Validation Rule 定义能适当处理私人数据且不会危及用户隐私的函数。

SQL Injection Sink Rule 定义在输入参数没有进行适当验证的情况下有可能执行恶意 SQL 或对数据库所存储的数据提供未经授权的访问权限的

函数

SQL Injection Source Rule 定义充当输入源的函数,如果这样的函数没有经过适当的验证,会导致 SQL 被注入到数据库查询中。

SQL Injection Validation Rule 定义在利用数据进行 SQL 查询之前能够对这些数据进行适当验证的函数

String Length Rule 定义能够计算字符串长度的函数。这个规则有助于跟踪字符串的长度,以便检测 buffer overflow 漏洞。

String Termination Error Sink Rule

定义在输入参数没有适当地以 "\0" 结尾的情况下可能会容易

导致 buffer overflow 漏洞

String Termination Error Source Rule

定义由于输入数据源没有适当地以 "\0" 结尾而容易导致 buffer overflow 漏洞。

表 13: 规则向导选项

选项 描述

Audit Workbench 用户指南 57

Page 64: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

使用向导编写新规则:

1. 在“Audit (审计)”窗口中,选择 File (文件) - Open Custom Rules Editor (打开自定义

规则编辑器)。

屏幕上将显示 Fortify Audit Workbench Custom Rules Editor (Fortify Audit Workbench 自定义

规则编辑器)窗口。

2. 选择 File (文件) - New Rule (新规则)。

屏幕上会显示 Rules Wizard (规则向导)。

3. 选择所需的规则类型。

向导会提示您输入有关选定规则类型的各种信息。

4. 在每一个窗口,输入所需信息,然后单击 Next (下一步)。

屏幕上会显示 Successful Rule Generation (规则生成成功)窗口。

5. 按照如下方式将新规则添加到规则包:

• 选择 New Rule will be inserted into an already open file (将新规则插入到已打开的文

件),然后选择所需的自定义规则包。

• 选择 New Rule will be saved to (将新规则保存至),单击 Browse (浏览),然后选择

所需的自定义规则包。

6. 选择 Show XML source for the new rule (新规则显示 XML 源代码)。

7. 单击 Finish (完成)。

8. 规则被添加到规则包中。自定义规则编辑器所显示的规则包中会包含以 XML 视图方式显示的新

规则。

9. 选择 File (文件) - Save Rulepack (保存规则包)。

规则被保存到规则包中。

编辑和删除规则本小节包含以下主题

编辑规则编辑规则:

1. 选择需要编辑的规则。

2. 单击 Details (详细信息)。

屏幕上会显示“Rule Details Editor (规则细节编辑器)”。

String Termination Error Validation Rule

定义适当地以 "\0" 结束缓冲区的函数。

System Information Leak Sink Rule

定义在输入参数处理不当的情况下可能向攻击者显示有用的系统信息的函数

System Information Leak Source Rule

定义作为系统信息数据源的函数,如果处理不当,会向攻击者泄漏有用的数据。

System Information Leak Validation Rule

定义能够适当处理系统数据的函数

表 13: 规则向导选项

选项 描述

58 Audit Workbench 用户指南

Page 65: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

3. 更改 “Rule Parameters and Rule Description (规则参数和规则描述)”面板所需要的信息。

4. 单击 OK (确定)。

删除规则删除规则:

1. 选择需要删除的规则。

2. 单击 Delete (删除)。

屏幕上会出现一个对话框,询问您是否删除。

3. 单击 Yes (是)删除该规则,或单击 No (否)取消删除。

在 XML 视图中编写规则

通过自定义规则,您可以分析第三方和专有的库,发现无法扫描使到的源代码信息以及针对可能被

安全编码规则包视为问题的元素编写相关的规则。

有关规则结构的详细信息,请在如下中参见 《Fortify Software Securing Coding Rules Schema》:

<install_directory>/Documentation/en/web/rules-schema/rules-schema.html

插入 XML 模板

插入模板:

1. 在 “Custom Rules Editor (自定义规则编辑器)”中,打开自定义规则包。

在 Fortify Audit Workbench Custom Rules Editor (Fortify Audit Workbench 自定义规则编辑

器)窗口中会显示 Table View (表格视图)。

2. 单击 XML View (XML 视图)。

3. 右键单击 RuleDefinitions (规则定义)标签。

4. 选择 Insert Rule Template (插入规则模板) - <template_name>。

template_name 适用于 <install_directory>/Core/config/ruletemplates/rules 中的所有模板。

规则中会插入所有需要的元素。

5. 在属性和元素中输入规则信息完成规则。

必填的元素和属性会以栏中的红色 "X" 标识。

6. 完成后,选择 File (文件) - Save Rulepack (保存规则包)。

创建自定义规则模板自定义规则模板是带有常规规则定义组件的 XML 文件。您可以修改现有的模板或创建您自己的模板。

创建模板:

1. 在 “Custom Rules Editor (自定义规则编辑器)”的 XML 视图中复制规则定义。

2. 将规则粘贴到文本文件中。

3. 用您希望显示在 “Insert Rule Template (插入规则模板)”中的名称命名文件,并将它保存在

下面的目录中:

<install_directory>/Core/config/ruletemplates/rules

文件名将显示在可用模板列表中。

Audit Workbench 用户指南 59

Page 66: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

配置自定义规则元素本节描述了规则定义元素,如:

• 定义规则信息

• 定义领域、类别和严重性

• 定义函数

• 定义规则定义信息

定义规则信息规则信息的识别也可以在其他过程实现,如“Project Summary (项目摘要)”面板中的 Audit Workbench “Audit Issue Details (审计问题细节)”选项卡。设置语言是必需的,指定标签和指定

注意事项是可选的。

规则信息包括以下组成部分:

• 设置语言

• 添加标签

• 添加笔记

设置语言

规则是特定语言。您必须设置语言属性。格式版本号属性指定了规则版本号。当前安全编码规则包版

本号是 3.4。

以下示例显示了用于 Java 的 3.4 版本的语义规则:

<SemanticRule formatVersion="3.4" language="java">

添加标签

将在输出中包含允许输入文字的标签元素。比如,标签文字将显示在 “Analysis Trace (分析跟

踪)”面板中。输入字串设置标签,如:

<Label>Company Rule<Label>

添加笔记

使用笔记标签,您可以输入任何相关信息或关于新规则的评论。笔记仅显示在 XML 视图中。

如以下例子所示,在 CDATA 的括号中输入文本:

<Notes><![CDATA[Enforces corporate security policies.]]></Notes>

定义自定义规则描述您可以写下新规则描述,可以在选择 Details and Recommendations(细节和建议) 选择卡时获得该

描述。描述提供关于决定漏洞的标准和修正漏洞的补救方案的信息。

本节说明了描述元素的主要组成部分:

• 编写概要

• 编写解释

• 编写建议

• 编写提示

60 Audit Workbench 用户指南

Page 67: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

编写概要

在概要元素中输入对问题的描述,该描述被设计作为一个摘要提供给对分类 (category)未必熟悉

的审计员的。这个描述不应试图解释分类,而应提供一个对本身性质的尽可能多的提示。这段文本

会在一些狭窄的空间出现,所以它不应超过10个单词。

如以下例子所示,概要元素中的文字必须使用 CDATA 括号:

<Abstract>

<![CDATA[Enter a description of the issue that the rule matches.]]>

</Abstract>

编写解释

解释元素中的文字显示在 “Details (细节)”选项卡中。对漏洞的深入讨论,与漏洞相伴典型构

造,漏洞会如何被利用,和可能发动攻击的范畴。

如以下例子所示,概要元素中的文字必须使用 CDATA 括号:

<Explanation>

<![CDATA[Enter a detailed explanation on vulnerability.]]>

</Explanation>

编写建议

建议元素中的文字显示在 “Recommendation (建议)”选项卡中。该文字应解释如何修复漏洞。

<Recommendations>

<![CDATA[Enter instructions on how to fix the issue.]]>

</Recommendations>

编写提示

提示元素中的文字显示在 “Recommendation (建议)”选项卡中。普遍或困难的审计情况的范例,

带有如何鉴别特定问题的小提示。随着在真实审计中新情况的发现,这个部分的内容应该逐渐增多。

小提示应该是真实的,并对努力要搞清楚一份 source code analysis 结果的人有帮助。

<Tips>

<![CDATA[Enter a tip.]]>

</Tips>

定义领域、类别和严重性当编写以下规则类型时,请设置领域 (可选)、类别和严重性:

• Configuration

• Control Flow

• Data Flow Sink

• Semantic

• Structural

Audit Workbench 用户指南 61

Page 68: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

使用自定义规则向导

在自定义规则向导中,请选择以下的漏洞信息:

• 类别: 选择一个类别或输入与此规则匹配的一个事件的新类别( 多 255 个字符)。

列表显示出用于安装的自定义和安全编码规则包的规则的类别。

• 严重性: 为与此规则相符合的事件设置“severity (严重)”属性,可以选择 “Low (低)”、

“Medium (中)”、“High (高)”或 “severity (严重)”。

图 12:自定义规则向导: 类别和严重性屏幕

使用 XML View (XML 视图)

在 XML View (XML 视图)中为以下标签设置规则信息值:

注意: 按下 Ctrl+Space 显示用于本地安装的安全编码规则包和自定义规则包的规则类型的值的列表。

表 14: 自定义规则信息字段

元素 数据类型 描述

VulnCategory 字符串 对漏洞的分类和分级,如 Buffer Overflow 或者 SQL Injection。

DefaultSeverity 浮点 显示漏洞重要性级别的范围,从 1.0 到 5.0。

VulnKingdom 字符串 漏洞属于的领域。

VulnSubcategory 字符串 漏洞类别的子类别。(可选)。

62 Audit Workbench 用户指南

Page 69: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

定义函数本节解释了如何识别与规则匹配的函数。

使用 Java 风格的正则表达式可以识别自定义规则向导中的函数信息窗口中的函数,以及识别使用 XML 视图时 FunctionIdentifier 元素中的函数。

为了识别函数的数据包和类,请使用 Java 风格的正则表达式以显示以下内容:

• 未定义:将向导字段或模式元素中的字段或元素设置为空值(空白)

• 未定义或未在任何数据包或类中定义:在向导字段或模式元素中输入“.*”

• 在任何数据包或类别中定义:在向导字段或模式元素中输入“.+”

使用自定义规则向导

使用 Java 风格正则表达式以识别在“Function Information (函数信息)”窗口中与所有规则类型

相符的函数。以下将适用到除了配置与别名之外的所有规则类型中:

• 数据包:如果已定义将触发当前规则的函数,请输入与命名空间或数据包相符的正则表达式。

• 类别:如果已定义会触发当前规则的函数,请输入与类别相符的正则表达式。

• 函数:为将触发当前规则的函数或方法输入正则表达式。

注意:别名规则用于定义窗口中函数,将在下一节描述别名规则。

图 13:自定义规则向导: 函数信息窗口

使用 XML View (XML 视图)

本节解释了如何为除配置和别名规则之外的所有规则类型识别函数。

注意:配置规则类型与 XML 文件或属性文件中的值相符。别名规则函数会在“From and To”标签

中定义。

Audit Workbench 用户指南 63

Page 70: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

函数识别符包括:

• 定义命名空间、类别和函数

• 识别并定义函数参数

• 定义类别之间的关系

• 定义语言修改器

• 定义参数属性

定义命名空间、类别和函数

FunctionIdentifier 元素被用于识别应用规则的函数。

识别并定义函数参数

定义函数参数您可以限制这样的规则,即与那些有其他特定值的函数相匹配并符合某一个签名 (参

数列表)的函数。限制函数基于签名触发规则在语言中十分有用,允许具有相同名字函数的定义能够

重载,以便接受不同参数。

如下所示,在参数元素中定义函数的参数:

表 15: 识别 XML 中的函数

元素名称 内容 类型 描述

NamespaceName TEXT string 如果已定义将触发当前规则的函数,请输入与命名空间或数据包精确匹配的字符串。

Pattern regex 如果已定义将触发规则的函数,请输入与命名空间或数据包名称相符的正则表达式。

ClassName TEXT string 如果已定义将触发规则的函数,请输入与类别精确匹配的字符串。

Pattern regex 如果已定义会触发规则的函数,请输入与类别相符的正则表达式。

FunctionName TEXT string 输入能够触发规则的函数或方法的名称。

Pattern regex 输入与触发规则的函数名称相符的正则表达式。

表 16: XML 函数参数列表

元素

属性

描述

名字 类型 值

Parameters varArg Boolean true | false

用于识别函数是否具有参数的变量数。

64 Audit Workbench 用户指南

Page 71: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

例如,思考下面的 C++ 方法:

MyFunc (char* s, int i)MyFunc (char* s)MyFunc (char* s, int i, char* s)

在这个例子中:

<Paramtype>char*</ParamType><Paramtype>int</Paramtype><WildCard min="0" max="1"/>

可以匹配第一个和第三个签名,但不匹配第二个。

定义类别之间的关系

Apply To (应用到) 元素定义了类别之间函数的多变的关系。

表 17: 参数元素的子元素

元素

属性

描述

名字 类型 值

ParamType 字符串和那些在特定函数中定义的参数类型相对应。空的或未识别元素将指引 Fortify SCA 不受任何限制地与任何方法或函数签名相匹配。

WildCarda

a. 通配符声明通常表明紧跟在其它任意签名元素之后的输入的参量,而且不能先于这种元素出现。

min int 整数代表了匹配的任意类型参数的 小数量,其出现在特定函数的签名的 后。

max int 整数代表了匹配的任意类型参数的 小数量,其出现在特定函数的签名的 后。

表 18: ApplyTo 元素

元素

属性

描述

名字 类型 值

ApplyTo implements Boolean true | false "true" 指明在规则中指定的函数是在一个

接口中定义的,而且那个规则应该通过使用那个指定在任意类中的,执行指定的接口的函数而触发。

overrides Boolean true | false "true" 指明除了匹配特定的函数之外,规

则也应该匹配那些指定类中继承而来的类中的函数的定义,而不需要特别考虑。

extends Boolean true | false "true" 指明虽然指定函数没有在指定的类

中定义,但是规则也应该匹配继承于指定类的那些类中执行的等价函数。

Audit Workbench 用户指南 65

Page 72: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

定义语言修改器

Modifiers (修改器)元素定义了应用到函数定义中的语言修改器。

除了辨别 webservice Modifier 的特例之外,在编程语言,或者编程语言可适用的机制中, Modifier 变量直接和它们近似命名的匹配物相对应。

webservice Modifier 用来辨识 webservice 内部的调用。

比如,要创建一条仅与 MyFunc(…) 相符的规则,如果其被宣布为 public 和 static,请添加以下

元素:

<Modifiers>

<Modifer>public</Modifier><Modifer>static</Modifier>

</Modifiers>

定义参数属性当创建数据流、控制流和语义规则时,如果参数传给了具有某些属性的函数,请使用仅与规则相符的 条件元素。

如果条件元素为真, Fortify SCA 将评定以第一个节点开始的条件声明和匹配的规则为真。

条件是以下测试的逻辑 Boolean 值的声明:

表 19: 修改器元素

元素

描述

子元素 类型 值

Modifiers Modifier string privatestaticprotectednativefinalpublicwebservice

定义了应用到函数定义中的语言修改器。

表 20: 参数属性元素

元素

属性

描述

名字 类型 值

ConstantEq argument int 使用参数从 0 开始的参数列表索引来识别它们

value 识别匹配的值

ConstantGt argument int 使用参数从 0 开始的参数列表索引来识别它们

value numeric 如果在参数属性中指定的零开始索引的参数是一个比指定的值大的常数,则返回真值

66 Audit Workbench 用户指南

Page 73: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

使用运算符创建条件声明

以下元素是 Conditionals operators (条件运算符):

ConstantLt argument int 使用参数从 0 开始的参数列表索引来识别它们

value numeric 如果在参数属性中指定的零开始索引的参数是一个比指定的值小的常数,则返回真值

ConstantMatches argument int 使用参数从 0 开始的参数列表索引来识别它们。如果

在参数属性中指定的零开始索引的参数是一个符合正则表达式的常数,则返回真值。

Pattern 模式是 ConstantMatches 的子元素。如果您在 ConstantMatches 元素中使用正则表达式,则它必须

包含在模式元素中。

IsConstant argument int 如果零开始索引的参数是一个常数,则返回真值。

TaintFlagSet taintFlag string 对于已经设置了指定的感染标识集的规则,如果此规则的 InArgument元素中已经指定了一个或多个参数,则返回真值。举例来说,如果一个测试提供了 WEB 感染标识,那

么这个规则只有在数据从一个源点引发出来,并增加 WEB 污染标记,传递到指定函数的时候,才能匹配,

这可以防止误报的产生,比如来自命令行的数据触发 cross-site scripting 漏洞。

注意:这个测试仅仅适用于数据流汇点规则。

IsType argument int 使用参数从 0 开始的参数列表索引来确定它们

IsType 包含 ClassName 和 Namespace 元素,如果指

定的零开始索引参数属于由子元素 ClassName 和 Namespace 指定的类型,则 IsType 返回真值。

如果 IsType 在 NOT 元素中,当指定的零开始索引参数不属于由 IsType/Class Name 和 IsType/Namespace指定的类型时,则返回真值。

表 21: 条件运算符元素

元素 描述

And 包括两个或更多参数属性元素。如果所有条件为真,则返回真值;如果一个或一个以上条件为假,则返回假值。

Or 包括两个或更多参数属性元素。如果任何一个条件为真,则返回真值。

Not 包含一个参数属性元素。如果参数不是子元素中特定的值,则返回真值。您可以在 "And" 或 "Or" 元素中放入 "Not" 条件。

表 20: 参数属性元素

元素

属性

描述

名字 类型 值

Audit Workbench 用户指南 67

Page 74: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

定义规则定义信息这一部分描述了规则定义的参数,通过规则的类型来组织:

• 在别名规则中定义函数

• 定义特定的分配规则元素

• 定义特定的缓冲区拷贝元素

• 定义特定的配置规则元素

• 定义特定的控制流规则元素

• 定义特定的数据流规则元素

• 定义特定的语义规则元素

• 字符串长度规则

在别名规则中定义函数

别名规则指定了另外一个函数一样运行的函数。 Fortify SCA 将应用相同规则到您识别的函数中。

使用向导

如下所示,您必须为别名规则识别两个函数:

• 在“Aliasing Function Information (别名函数信息)”窗口: 定义可以模拟其他函数行为的函数。

• 在 “Aliasing Information (别名信息)”窗口: 输入函数名称,其名称与在标准库中相同。如果

有必要,识别函数中所定义的类和 / 或命名空间的名称。

使用 XML View (XML 视图)

对于别名规则,定义与 From 元素的规则相符的函数,和在 To 元素中可以在标准库中模拟的函数。

有关子元素的更多详情,请参见第 63 页中的“定义函数”。

特定的别名规则元素是:

表 22: 别名规则函数识别符

元素 子元素 描述

From FunctionNameClassNameNamespaceNameParametersApplyToModifiersConditionals

使用与 FunctionIdentifier 元素相同的元素和规则(包括参数设置),识别与规则相符的函数。注意: FunctionName 是唯一需要的子元素。

To FunctionNameClassNameNamespaceNameParametersApplyToModifiersConditionals

识别在标准库中的或自定义规则中的函数。其值必须与指定函数相符。注意:不支持正则表达式, Pattern 元素不可以作为函数、

类别或命名空间子元素。

68 Audit Workbench 用户指南

Page 75: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

比如,如果你有自己malloc的实施,你可以创建一个别名规则去指定你自己版本函数。

<From><FunctionName> <Value>myMalloc</Value></FunctionName>

</From><To>

<FunctionName>malloc</FunctionName></To>

定义特定的分配规则元素

分配规则指定了一个执行内存分配的函数。这是一个由 Fortify SCA 使用的信息性的代码建模规则,

以帮助跟踪缓冲区大小并检测缓冲区溢出。

当您创建分配规则时,请使用描述在以下章节中的规则组件:

• 第 60 页中的“定义规则信息”

• 第 61 页中的“定义领域、类别和严重性”

• 第 63 页中的“定义函数”

Fortify SCA 通过将 SizeUnits 和 DataSize 元素相乘计算出被分配的内存总量。下面的表格描述了特

定的分配元素:

表 23: 特定的分配元素

元素

属性

描述

名字 类型 值

DestinationArgument int 识别缓冲区参数由函数分配内存的

return 识别在缓冲参数中由函数返回的对象

this 识别被对象调用的函数为缓冲参数

DataSize type formatString 识别用于确定字节真实数量的 format string

stringLength 识别用于确定字节真实数量的字符串长度

value 识别用于确定字节数量的参数属性的值

addend Int 确定被添加到由参数和类型属性描述的值中的单元数量

arg Int 使用参数列表索引识别指定缓冲大小的参数

SizeUnits value CHARTCHARWCHARMBCHARInt

描述将要分配的数据单元。

其中整数表明字节大小。

arg Int 指定包含将被分配的数据单元大小的参数

Audit Workbench 用户指南 69

Page 76: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

接下来的是特定的分配元素的一个例子:

<DestinationArgument>return</DestinationArgument>

<DataSize type="value" addend="0" arg="0"/>

<SizeUnits value="CHAR"/>

定义特定的缓冲区拷贝元素

编写缓冲区拷贝规则以使函数将数据从一个缓冲区拷贝到另一个缓冲区。这个一个信息性的代码建模

规则,用来帮助 Fortify SCA 确定是否有足够的空间来进行这样的特定的拷贝操作并检测潜在的缓冲

区溢出。

当您创建缓冲区拷贝规则时,请使用描述在以下章节中的规则组件:

• 第 60 页中的 “定义规则信息”

• 第 63 页中的 “定义函数”

下面的表格描述了特定的缓冲区拷贝规则元素:

表 24: 缓冲区拷贝规则元素

元素

属性

描述

名字 类型 值

SourceArgument int 使用由 0 开始的参数列表索引识别复制到

目的参数的参数注意: 如果输入除了来自源代码(比如标准输入)之外还来自缓冲区,则不要定义 SourceArgument。

this 识别复制到目标参数的参数是被调用的函数对象

DestinationArgument int 识别将源参数复制到其中的参数(使用由 0 开始参数列表索引)

注意: 指定一个参数。

return 识别出数据被复制到由函数返回的对象

this 识别出数据被复制到被函数调用的对象

FormatArgument int 使用从 0 开始的参数列表索引来识别接收了 format string 的参数。

注意: 指定一个参数。

return 识别由函数返回的 format string

this 识别出 format string 是被函数调用的对象

70 Audit Workbench 用户指南

Page 77: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

定义特定的配置规则元素

配置规则定义了由于 web 应用程序和应用程序服务器的不正当配置而引起的漏洞。配置规则支持对 XML 和资源配置文件的分析。

XML 文件的规则中具有描述所侦测到漏洞的条件 XPath 表达式。资源文件的规则说明了当前的或者

缺失的特殊关键字或者关键值,这可以通过使用正则表达式来指定。

SourceOffset type formatString 识别复制源值时被用于确定初始偏移的 format string

stringLength 识别复制源值时被用于确定初始偏移的缓冲区字符串长度

value 识别复制源值时被用于确定初始偏移的参数属性的值

addend int 确定被添加到由参数和类型属性描述的值中的单元数量

arg int 指定设置初始偏移的参数,其中,数据是取自源值。指定一个参数。

DestOffset type formatString 识别当数据被编写入目的值时被用于确定初始偏移的 format string

stringLength 识别当数据被编写入目的值时被用于确定偏移的缓冲区字符串长度

arg int 指定设置初始偏移的参数,其中,数据被复制到目的值。指定一个参数。

DataSize type formatString 识别用于确定将被复制的数据真实大小的 format string

stringLength 识别用于确定将被复制的数据真实大小的字符串长度

value 识别用于确定将要复制的数据大小的参数属性的值

addend Int 确定被添加到由参数和类型属性描述的值中的单元数量

arg Int 识别指定将被复制的数据数量的参数

SizeUnits value CHARTCHARWCHARMBCHARInt

描述将要复制的数据单元。

其中整数表明字节大小。

arg Int 指定包含将被复制的数据单元大小的参数

表 24: 缓冲区拷贝规则元素

元素

属性

描述

名字 类型 值

Audit Workbench 用户指南 71

Page 78: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

当您创建配置规则时,请使用描述在以下章节中的规则组件:

• 第 60 页中的 “定义规则信息”

• 第 61 页中的 “定义领域、类别和严重性”

下面的表格描述了特定的配置规则元素:

下面的例子显示了与属性相符的部分配置规则,它以 "file_ext" 为开始,并包括 .txt 的值:

<ConfigFile type="properties">

<Pattern>myApplication.*\.properties</Pattern>

</ConfigFile>

<PropertyMatch>

<NameMatch>

<Pattern>file_ext.*</Pattern>

</NameMatch>

<ValueMatch>.txt</ValueMatch>

</PropertyMatch>

注意:在这个版本的 Fortify SCA 中,配置分析器支持 XPath 1.0。配置分析器也有改进,现在允许 XPath 表达式的规格评价为真(这是之前版本的 Fortify SCA 的情况),现在还可以使评价指向一个

节点集。 Fortify Software 建议你使用一个 XPath 表达式 (其评价指向一个节点集),因为这会得到

更好的分析和报告结果。

定义特定的控制流规则元素

控制流规则提供了具有不安全行为特点的状态机器的定义,此规则可以检测到潜在的危险的操作顺序。

当您创建控制流规则时,请使用描述在以下章节中的规则组件:

• 第 60 页中的 “定义规则信息”

• 第 61 页中的 “定义领域、类别和严重性”

表 25:

元素

属性

内容 描述

名字 值

ConfigFile type xml | properties

TEXT | Pattern

设置配置文件类型并输入文件名称。使用 Pattern 元素匹配带有正

则表达式的配置文件名称。注意: 文件名是和完整的文件名

相比较,包括所有的文件扩展名。

XPathMatch (XML only)

expression string XPath 表达式描述了漏洞

PropertyMatch(Properties only)

NameMatch

设置属性名称。使用 Pattern 元素

为正则表达式加标签。

ValueMatch

在规则能够检测到的属性中设置值。使用 Pattern 元素为正则表达式加标签。

72 Audit Workbench 用户指南

Page 79: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

控制流规则可以有多个函数识别符。函数控制符在控制流定义中使用。

控制流规则定义概览

这一部分描述了 control flow rule Definition 元素的格式。不同于数据流或者语义的规则,一个控制流

规则没有指定一个函数;而是指定一系列的程序元素 (它们可能是函数调用或者是程序中其它的实

体)。这个定义,出现在规则的定义字段中,就像一个简单的编程语言。

注意: C++ 和 Java 风格的注释由以下格式支持:

• // 创建一个直到行结尾的注释

• /* 创建一个注释,直到一个匹配的*/

每一条规则定义都定义了一个状态机器。每一个状态机器都确切地具有一个开始状态,一个或多个

错误状态,和任意多的中间状态。这个机器通常有一个当前状态。如果当前状态始终是一个错误状

态,那么就会报告一个漏洞。

状态之间是通过转变来相互连接的。每一个转变都有一个原始状态,一个终点状态,和一些模式。

如果一个转换的原始状态是当前状态,而且它其中的一个转换模式和程序的一部分匹配,那么转换

的终点状态就变成了新的当前状态。在这种情况下,机器就如所说的那样,从初始状态转换到终点

状态。程序的这个部分对模式来说就称之为 “输入”。

编写定义的声明部分

机器的定义开始于机器状态的声明。状态是由关键字 state 定义的,可选择地加上 start 或 error 来指定开始状态或者错误状态,状态名字就分别紧跟其后。简单的机器应具有以下状态定义:

state start state1;state state2;state error state3;

表 26: Control Flow Function 元素

元素

属性

内容 描述

名字 类型 值

FunctionIdentifier id string FunctionName 定义在 Definition 元素中提到的每个函

数。控制流规则可以具有多个函数识别符。为在 Definition 元素中引用这个函数分

配一个唯一的 ID。

ClassName

NamespaceName

FunctionCallIdentifier id string FunctionIdentifier 用条件语句定义函数识别符。只定义一个函数和一组条件。为在 Definition 元素中引用这个函数分配一个唯一的 ID。

Conditional 定义条件,在这种条件下函数和规则相匹配。

ControlflowRuleFlag flagValue

Boolean true | false

TEXT 输入一个控制流分析器标记名称,将 flagValue 设置为 true 或 false。

PrimaryState TEXT 输入定义了机器状态的字符串,该机器状态定义了漏洞。

Definition CDATA 代码分段描述了状态机器的控制流规则。

Audit Workbench 用户指南 73

Page 80: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

机器同样也可能存在变量,其变量由关键字 var 来声明。一个变量能够匹配程序中任意的表达式。

当一个变量第一次使用的时候,它会和它匹配的表达式绑定。对于同一个变量的后续使用,变量只有

当输入和变量所绑定的表达式相同的时候才匹配。一个普通的变量声明可能看上去是这个样子的:

var f;

后,模式可以通过命名来避免重复地输入同样模式名的需要。模式是由关键字 pattern 来命名

的,之后跟随着模式,写在小括号中。

举例来说,下面的这一行发布了一个叫作 alloc 的模式,它和 malloc、 calloc 函数匹配:

pattern alloc { malloc(...) | calloc(...) }

要知道更多关于模式的详情,请看下面。

注意:如果一个控制流规则包含了格式 limit <refid>; 中的一行,那么这个控制流规则只能应用

在那些其索引 ID refid 和函数识别符匹配的函数中。

编写定义的转换部分

转换定义了机器的当前状态进行改变的方式。如上所述,每一次转换都有一个初始状态,一个终点状

态和一个模式。可能会有很多转换是由相同的初始状态开始的;在这种情况下,新的当前状态就会成

为第一次转换后的终点状态,其模式和输入数据相匹配。转换由源状态的名字、标记 ->、终点状态

的名字和一个或多个在小括号中的模式来定义。

在同一次转换中的多个模式应该用 | 字符来分隔开来,如下所示:

source -> destination { pattern1 | pattern2 }

包含以下元素中某一个的模式:

• Named Pattern 的使用

一个在声明部分具有 pattern 关键字的所发布的模式可能会通过指定模式 keyword 后的模式

名而在转换中被使用,如下所示:

state1 -> state2 { pattern alloc }

• 赋值语句

控制流规则经常会参照函数调用的返回值,特别是对象构造器和其它将句柄返回到资源的函数。函数的返回值或者任何赋值语句,能够由后面带有等号 (=) 符号以及一个表达式的规则名称来匹

配。(表达式请查看下面。)赋值操作符的左侧必须是一个之前公布的规则变量。

• 表达式

表达式可以是下面任何一个:

• 字符串,包含在双引号当中(C 语言风格)

• 字符,在单引号当中(C 语言风格)

• 整数

• 浮点数

• 布尔值“true”和 “false”(没有引号)

• "null" 值(没有引号)

• *<表达式 >: < 表达式 > 的间接引用

• &<Expression>: < 表达式 > 的引用 (C 语言风格)

• 函数调用:查看下面的函数调用

• ? 字符: 与在输入中的任何表达式相匹配

• 规则变量的名称: 如果规则变量没有绑定,那就匹配任意表达式并和这个表达式的规则变量

绑定。如果规则变量已经绑定了,那就匹配变量第一次绑定到的表达式。

74 Audit Workbench 用户指南

Page 81: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

• 语言特征语句

程序的某些方面不能使用以上的表达式来描述。对于这些方面,存在由特殊的模式类型。这些模式类似于 C 语言或者 Java 中的函数调用,但是所有的函数名都是以一个# 字符开始的。

有效的语言特征语句有:

• #end_scope(var): 匹配封装范围的 后,表达式和规则变量 var绑定

• #end_function(): 匹配当前函数的结尾,取决于是否是一个返回-声明或者到达函数的

结尾

• #return(expr): 匹配一个带有匹配 expr 返回表达式的返回语句

• #return(): 匹配任何返回语句

• #compare(var, const): 在 var(一个规则变量)和 const(一个字符串、字符、整

数、浮点数量、布尔、空值或‘?’表达式)之间匹配比较式(==、!=、<、>、<=、>=)

• #simple_declaration(var): 匹配一个类型的声明 - 一个整数、指针、索引或者其它

原始的数据类型。将规则变量 var 约束到程序中发布的变量中。

• #declaration(var): 和 #simple_declaration(var) 相同

• #complex_declaration(var): 在 C 语言或者 C++ 语言中,和一个复杂的数据类型

(结构体或者对象)的声明相匹配。指向结构体的指针、指向 C++ 对象的指针和索引,还有

指向 Java 对象的索引是不匹配的;对于这些数据类型可以使用 #simple_declaration 模式。

• #buffer_declaration(var): 在 C 语言或者 C++ 中匹配一个堆栈缓冲区的声明

• #any_declaration(var): 与上述所有内容匹配

• #ifblock (var, const, which): 匹配一个在 var 和 const 之间的比较式,该比较式

为 #compare 而定义,之间的一个运算符具有附加的限制,即运算符必须是一个等价测试

(==、 !=、或一个类似运算符),而且比较只能出现在一个分支或者循环结构的判断式中

(如 if 语句、 for 循环和 while 循环)。指定状态的转换仅仅出现在分支结构中,其中 var == const 等价于 which,其中 which 或者是真或假。

注意: 比如如何使用 #ifblock 创建规则,请参见第 110 页中的“使用 #ifblock Directive 匹配条件

分支”。

在 Definition 元素中引用函数

大多数引起人们兴趣的安全属性涉及到函数的使用和基于函数识别符的语法的匹配。控制流规则使用函数识别符中的索引 ID 字段来指定函数以便进行转换。

举例来说,如果存在一个带有索引 ID allocator 的函数识别符,那么控制流模式 v = $allocator(?) 就会分配规则变量 v 到任何和 $allocator 函数识别符匹配的函数的返回值,并

只取一个参数。

一般来说,规则函数的参数应该能准确地匹配输入函数的预期参数。因此,要编写一个和第二个 link 系统调用的规则变量 var 的参量绑定的规则,规则就需要读取 $link(?, var),并假设一

个和 link 系统调用匹配的函数识别符已经用一个 link 的索引 ID 定义了。

“每个参数一个表达式”原则存在一个特例: 函数的参数中的省略号 (...) 匹配 0 或更多表达式。这

就有可能通过指定 function(..., var) 来匹配一个函数的 后一个参数,而且 function(...) 能够匹配指定函数的任意调用,而不用注意该函数的参数。

面向对象的语言允许方法在特定的对象上进行分派,只需使用 <object>.<function>(<arguments>) 语法。控制流规则通过接受

<variable>.<function>(<arguments>) 来支持这种分派,其中 <variable> 代表一个规则

变量。

Audit Workbench 用户指南 75

Page 82: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

接下来的两种转换指定在 Java LinkedList 中调用 clear() 方法:

begin -> new { list.$newList(...) }new -> clear { list.$clear() }

这假设 newList 是一个和 LinkedList 构造器匹配的函数识别符的索引 ID ,而 clear 是一个和所连

接列表(或者任何所连接列表继承的高等级类,或者 LinkedList 所实现的接口)中的 clear 方法匹配

的函数识别符的索引 ID。而这个 list 是之前定义的规则变量。

控制流规则语法描述

接下来是控制流语法的描述

76 Audit Workbench 用户指南

Page 83: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

其中:

• ::= 表示左边的标记是右边表达式的一个缩写形式

• <IDENTIFIER>: 一组“字符”的引用 (一系列的字符、数字和下划线,而不包括空格)。出现

在上面的引号中的字符串,如 "limit", "state", "start", "error", "pattern", "var", "null", "true" 和 "false" 都不是合法的标识符。

• <FUNCTION_IDENTIFIER>: 一个函数识别符的索引 ID 的引用。索引 ID 也必须遵从标识符

规则。

• <INTEGER_LITERAL>: 是一系列单个或多个数字。

• <BOOLEAN_LITERAL>: 代表字符串为真或假。

• <FLOATING_POINT_LITERAL>: 是一个浮点数典型的 C 语言或者 Java 语言的表达形式。它

可以是一系列数字,当中包含一个小数点和一个可选的后 形式,如 "e+<number>" 或者 "e-<number>" 用来代表一个指数,或者它可以是一系列的数字,不包含小数点,但是有一个

符合要求的指数后 。

• <CHARACTER_LITERAL>: 是一个写在单引号中的简单的字符。支持 C 语言风格的编码 \n, \t, \b, \r, \f, \\, \' 和 \",正如 \NNN 用来表示八进制数字 NNN 那样。

• <STRING_LITERAL>: 是一系列写在双引号中的字符。允许出现在文字字符中的编码也同样允

许出现在字符串字符中。

定义特定的数据流规则元素

数据流分析器使用数据流规则从由用户控制输入的程序入口和它通过函数和变量传递来追踪它。数

据流规则鉴别扮演不同角色的函数,并允许 Fortify SCA 精确地进行数据流分析。

Audit Workbench 用户指南 77

Page 84: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

当您创建数据流规则时,请使用描述在以下章节中的规则组件:

• 第 60 页中的 “定义规则信息”

• 第 61 页中的 “定义领域、类别和严重性”(仅用于数据流侵入规则)

• 第 63 页中的 “定义函数”

• 第 66 页中的 “定义参数属性”(可选的)

你选择的规则类型决定了哪组内部参数,外部参数、和感染标识是适用的,和他们的值会如何被 Fortify SCA 使用。

这种关系的详细信息在下表中介绍。

表 27: 适用的数据流参数和感染标识

数据流规则元素名称 子元素 描述

DataflowEntryPointRule

TaintFlags 感染标识可以被添加到进入指定函数通过在内部参数中列出的参数的数据。

InArguments 在进入指定函数主体时,所有这里列出的参数都被认为是被感染的。

DataflowSourceRule TaintFlags 感染标识可以被添加到来自指定函数调用,且通过 外部参数中列出参数的数据。

OutArguments 在指定函数调用后,所有这里列出的参数都被认为是被感染的。

DataflowCleanseRule 清除规则描述终止数据流路径的函数并且汇报通过他们的用户输入对以后的使用是安全的。

TaintFlags 向 OutArguments 中添加感染标识。使用一个逗号分

隔的列表添加多个标识。注意: 由 "-" 开始的感染标识没有影响,因为该函数

将所有标识都从接收到的数据中删除了。

OutArguments 在一次指定函数调用后,所有这里列出的参数都被认为是彻底没有感染的。注意: 不适用于被 TaintFlags 元素添加的感染标识。

DataflowPassthroughRule

传递口规则描述了特定函数从输入到输出的映射。

TaintFlags 感染标识可以从在外部参数 列出的数据中添加或移除。对于传递有效数据的函数,添加一个 VALIDATED_<CATEGORY> 感染标识以防止数据触

发相关类型的问题。

InArguments 在一次指定函数调用中,如果任何一个在这里列出的参数是被感染的,那么所有在 外部参数 中列出的参数都被认为是被感染的。

OutArguments 在一次指定函数调用中,如果任何一个在内部参数中列出的参数是被感染的,那么所有这里列出的参数都被认为是被感染的。

DataflowSinkRule Sink 如果这里列出的任何一个参数是被感染的且没有一个有效化标识,那么所分配的漏洞类别和严重程度会作为一个问题出现在 source code analysis 结果中。

78 Audit Workbench 用户指南

Page 85: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

定义 InArguments 和 OutArguments 元素

参数列表应被作为在当前规则 Function Identifier (函数识别符)部分中指定的函数的输入或输出。

键入的值应该是一个逗号分隔的列表,包含下列:

• return 指定了函数返回的对象

• this 指定了函数调用的对象

• 一个从 0 开始的对函数参数的数字引用

• 对一个结构体的子变量的名称引用。

例如,如果一个函数返回一个结构体,这个结构体有一个子字段 foo,你需要输入 return.foo 来引用这个字段。如果这个结构体是第一个参数 (而不是返回值),你需要将 0.foo 作为引用,指代 foo。

参数可以用几种方式来引用:

• 一个单个参数 n (例如,第一个参数被简化为数字 0)

• 包括参数 n 和这之后所有的参数 (例如,第 3 个参数和所有后面的参数就是2…)

• 在 n1 和 n2 之间并包括这两个数在内的参数, (例如,第 2 到第 4 个参数就是 1-3)

定义 TaintFlags 元素

感染标识是一种机制,用于区别被感染的不同种类的数据。它不是把数据看成被感染的或未被感染

的,而是可以将任意字符串 (被称为感染标识)与来自或传递特定函数的数据相联系,以达到区别

的目的。

Fortify SCA 利用感染标识来指出特定数据来源,并识别出对其进行过的特定操作。

感染标识影响 Fortify SCA 的行为,如下所示:

• 如果数据流入口点或源规则将感染标识添加到数据中,且标识被配置为“特定的”感染标识,

Fortify SCA 仅报告出明确地检查出设置了特定感染标识的侵入规则的漏洞。被特定感染标识感

染的数据不会触发没有条件语句的侵入,并且不被 “普通”感染标识被认定为是被感染的。

例如,安全编码规则包用字符串 ARGS 标记在 C 和 Java 中 main() 的参数,用字符串 WEB 标记任何来自 Java 中 HttpRequest 的任何用户输入。

如果数据来自网络,那么 NETWORK 是一个合适的感染标识。

TaintFlags 元素是一个逗号分割的任意字符串列表,带有+ 或 - 作为前 以指出在规则指定的函

数中,感染标识应当从数据中添加还是删除。

例如, HttpRequest.getParameter() 源规则的 TaintFlag 可以是 +WEB, +XSS。如何用条

件来配置侵入规则以要求特定感染标识的存在会触发一个规则的信息,请参见第 66 页中的 “定

义参数属性”。

虽然用来作为感染标识的字符串的选择是任意的,安全编码规则包现在使用下表列出的感染标识来指出特定的输入源:

表 28: 全局感染标识

感染标识 语言 描述

ARGS Java, C/C++, .NET 指出数据是命令行参数。

CONSTANTFILE Java 指出用以创建流的文件名是一个常数。

DATABASE Java, C/C++, .NET, PHP

指出数据来自数据库

Audit Workbench 用户指南 79

Page 86: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

DEOBFUSCATED Java, C/C++, .NET, CFML, JSP, JavaScript

指出数据是否是去模糊化的。

ENVIRONMENT Java, C/C++, .NET, SQL, CFML, JSP, PHP

指出数据来自环境,例如环境变量。

FILE_SYSTEM C/C++, .NET 指出数据来自 file system。

FORM Java 指出数据来自 web 表单。

GUI_FORM Java, .NET, JavaScript

指出数据来自非 web 的 GUI 表单。

HTTPRS Java, C/C++, .NET, SQL, CFML, JSP, JavaScript, PHP

指出数据可以包含 CRLF 元字符,因此作为例如 HTTP Response Splitting 的漏

洞的源点。

JAVA_SCRIPT JavaScript 指出被怀疑的数据是动态生成的 javascript 代码。

NETWORK Java, C/C++, .NET 指出数据来自 network,例如来自一个套接字。

NO_NEW_LINE Java, C/C++, .NET 指出数据不包括新行字符。

NOT_NULL_TERMINATED C/C++ 指出数据可能没有被 null 适当终止。

NULL_TERMINATED C/C++ 指出数据已经被 null 适当终止了。

NUMBER Java, C/C++, .NET, SQL, JSP, JavaScript, PHP

指出数据不是一个字符串。

PRIVATE Java, C/C++, .NET, SQL, CFML, JSP

指出数据是私人信息,例如用户的密码或社会保险号码。

PROCESSSTREAM Java 指出被怀疑的流从一个进程对象中取回。

PROPERTY Java 指出数据来自一个系统或应用程序属性文件。

REGISTRY Java, C/C++, .NET, SQL, CFML, JSP

指出数据来自 Windows 注册表。

SERIALIZED Java, C/C++, .NET 指出被怀疑的数据被序列化。

STDIN C/C++, .NET, SQL 指出数据来自控制台标准输入流。

STREAM Java, C/C++, .NET 指出数据来自流。如果流类型不能在编译时被识别,将使用此感染标识。然而,如果已知流在编译时是网络流,则使用 NETWORK 感染标识。对于文件

流,使用 FILE_SYSTEM 感染标识。

STRING_LENGTH C/C++ 指出数据代表缓冲区长度。

表 28: 全局感染标识

感染标识 语言 描述

80 Audit Workbench 用户指南

Page 87: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

• 安全编码规则包中的所有数据流侵入规则都包括一个条件,即当数据被并带有

VALIDATED_<CATEGORY> 感染标识感染时不触发规则(见下表)。

使用一个自定义数据流传递口规则或清除规则来给传递函数的数据添加一个只对特定的漏洞分类有效的感染标识。这将防止 Fortify SCA 报告出带有 VALIDATED_<CATEGORY> 感染标识标

签的数据类别的问题。

当使用自定义数据流侵入规则时,你可以通过创建一个带检查 NOT Taint Set VALIDATED_<CATEGORY> 条件的数据流侵入规则,而在结果中排除问题。

注意: Fortify Software 强烈建议你在使用自定义规则添加一个 VALIDATED_<CATEGORY> 感染

标识前,确保所有验证函数的正确性。有关例子,请参见第 109 页中的“排除扫描分析结果中

的已验证的数据”。

验证感染标识的格式是VALIDATED_<CATEGORY>,其中类别是以下数据流类别之一。 Fortify SCA 侵入规则将检查下列验证感染标识:

• VALIDATED_ACCESS_CONTROL_DATABASE

• VALIDATED_ACCESS_CONTROL_LDAP

• VALIDATED_BUFFER_OVERFLOW

• VALIDATED_COLDFUSION_BAD_PRACTICES_UNAUTHORIZED_INCLUDE

• VALIDATED_COMMAND_INJECTION

• VALIDATED_DYNAMIC_CODE_EVALUATION_COMMAND_INJECTION

• VALIDATED_CODE_CORRECTNESS_ERRONEOUS_CLASS_COMPARE

• VALIDATED_CREDENTIAL_MANAGEMENT

• VALIDATED_CROSS_SITE_SCRIPTING

• VALIDATED_CROSS_SITE_SCRIPTING_POOR_VALIDATION

• VALIDATED_DENIAL_OF_SERVICE

SYSTEMINFO Java, C/C++, .NET, SQL, CFML, JSP, PHP

指出数据是系统相关信息,例如使用的软件版本。

WEAKCRYPTO Java, C/C++, .NET, CFML, JSP, JavaScript

指出数据被一种弱加密算法保护,例如 Base64 编码。

WEB Java, .NET, SQL, CFML, JavaScript, PHP

指出数据来自网络。

WEBSERVICE Java, .NET 指出数据来自 web 服务调用。

XML Java 指出被怀疑数据来自一个 XML 文档。

XSS Java, C/C++, .NET, SQL, CFML, JSP, JavaScript, PHP

指出数据可以包含 HTML, JavaScript 和其他 web 和浏览器相关的元字符,因此可能是例如 Cross-Site Scripting 漏洞

的源点。

XSSSTREAM Java, .NET 指出被怀疑的流是 HTTP 回应输出流,因此当包含 web 和浏览器相关元字符的

数据被写入那个流时,可能被例如 Cross-Site Scripting 的漏洞攻击。

表 28: 全局感染标识

感染标识 语言 描述

Audit Workbench 用户指南 81

Page 88: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

• VALIDATED_FORMAT_STRING

• VALIDATED_HTTP_RESPONSE_SPLITTING

• VALIDATED_ILLEGAL_POINTER_VALUE

• VALIDATED_INTEGER_OVERFLOW

• VALIDATED_LDAP_INJECTION

• VALIDATED_LDAP_MANIPULATION

• VALIDATED_LOG_FORGING

• VALIDATED_LOG_FORGING__DEBUG_

• VALIDATED_PASSWORD_MANAGEMENT

• VALIDATED_PASSWORD_MANAGEMENT_WEAK_CRYPTOGRAPHY

• VALIDATED_PATH_MANIPULATION

• VALIDATED_POOR_ERROR_HANDLING_UNHANDLED_EXCEPTION

• VALIDATED_PRIVACY_VIOLATION

• VALIDATED_PROCESS_CONTROL

• VALIDATED_RESOURCE_INJECTION

• VALIDATED_SETTING_MANIPULATION

• VALIDATED_SQL_INJECTION

• VALIDATED_SQL_INJECTION_HIBERNATE

• VALIDATED_STRING_TERMINATION_ERROR

• VALIDATED_SYSTEM_INFORMATION_LEAK

• VALIDATED_TRUST_BOUNDARY_VIOLATION

• VALIDATED_UNSAFE_JNI

• VALIDATED_UNSAFE_REFLECTION

• VALIDATED_JAVASCRIPT_HIJACKING_AD_HOC_AJAX

• VALIDATED_DANGEROUS_FILE_INCLUSION

• VALIDATED_DYNAMIC_CODE_EVALUATION_CODE_INJECTION

• VALIDATED_FILE_PERMISSION_MANIPULATION

• VALIDATED_DANGEROUS_FUNCTION

• VALIDATED_DYNAMIC_CODE_EVALUATION_SCRIPT_INJECTION

• VALIDATED_OPEN_REDIRECT

定义特定的语义规则元素

语义规则 (SemanticRule) 定义了函数和 API 在程序内层面的使用的危险性,尤其是 buffer overflow、 format string、和执行路径类型的漏洞。

当您创建语义规则时,请使用描述在以下章节中的规则组件:

• 第 60 页中的 “定义规则信息”

• 第 61 页中的 “定义领域、类别和严重性”(仅用于数据流侵入规则)

• 第 63 页中的 “定义函数”

• 第 66 页中的 “定义参数属性”(可选的)

语义规则类型元素值确定了您应该定义的元素、源、目标、控制、格式和执行路径参数。下表列出了

各个规则类型的适用元素。

82 Audit Workbench 用户指南

Page 89: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

语义规则参数:各个参数字段提供给 Fortify SCA 关于特定函数行为的信息。以下的表格描述了定义

参数的所有可用元素。如上面的表格所示,参数的可用性根据不同规则类型而不同。

表 29: 语义规则类型元素值

类型值 可用元素 描述

default None 无条件地标记指定函数。

formatStringPrint 验证适当形式的 format string,并探测可能出现的 buffer overflow。

SourceArgument 将被打印的参数。

DestinationArgument 选择性地指定一个单个参数。如果函数打印到一个特定的目的地缓冲区,那么这个参数这里指定。如果参数被打印到屏幕或其他未指定的目的地,那么这里参数可以不设置。

FormatArgument 指定单个参数。获取 format string 的参数。

formatStringScan 验证适当形式的 format string,并探测可能出现的 buffer overflow。

SourceArgument 可以选择地指定单个参数。如果指定的函数从一个作为参数传递的源字符串获取输入,那么这个参数的索引应在这个字段指定。输入也可能从一些其他源中读取,在这种情况下则不需要指定源参数。

DestinationArgument 写入格式化字符串的参数。

FormatArgument 指定单个参数。获取 format string 的参数。

memory None 识别设置了内存值并可能被偶然优化的函数。

processControl 验证传递的字符串,如执行路径参数是一个充分有效的路径。

ExecutionPathArgument

指定单个参数。获得要执行的命令的路径的参数。

uncheckedReturnValue None 验证指定函数的返回值被分配给一个变量。

表 30: 参数的语义规则元素

元素 描述

SourceArgument 获得要在拷贝操作中使用的源缓冲区的函数中使用的参数

DestinationArgument 获得要在拷贝操作中使用的目标缓冲区的函数中使用的参数

ControlArgument 一个函数中获得要在一次复制操作中考量的数据的数量范围的参数

FormatArgument 一个函数中获得要在格式化输入或输出中使用的 format string 的参数

ExecutionPathArgument 一个函数中获得要执行的命令路径的参数

Audit Workbench 用户指南 83

Page 90: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

这些字段键入的值应该是一个以逗号分隔的列表,包含下列:

• Audit Workbench 关键字 return 指定了函数的返回值

• Audit Workbench 关键字 this 指定了对函数调用的对象的引用

• 对一个结构体的子变量的名称引用。例如,如果一个函数返回一个结构体,这个结构体有一个子

字段 foo,你需要输入 return.foo 来引用这个字段。如果这个结构体是第一个参数 (而不是

返回值),你需要将 0.foo 作为引用,指代 foo。

• 一个从 0 开始的对函数参数的数字引用

参数可以用几种方式来引用:

• 一个单个参数 n(例如,第一个参数可以为简单的数字 0)

• 包括参数 n 和这之后所有的参数(例如,第 3 个参数和所有后面的参数就是2…)

• 在 n1 和 n2 之间并包括这两个数在内的参数(例如,第 2 到第 4 个参数就是 1-3)

字符串长度规则

字符串长度规则指出由计算字符串长度的信息规则描述的特定函数。这是一个信息化规则类型,帮助 Fortify SCA 计算缓冲区大小,从而更好地判断 buffer overflow 问题是否真的在源代码中存在。

当您创建字符串长度规则时,请使用描述在以下章节中的规则组件:

• 第 60 页中的 “定义规则信息”

• 第 61 页中的 “定义领域、类别和严重性”(仅用于数据流侵入规则)

• 第 63 页中的 “定义函数”

• 第 66 页中的 “定义参数属性”(可选的)

这个部分描述了在特定的字符串长度规则信息面板中的参数。

图 14:特定的字符串长度规则信息

参数有:

源参数:可以选择地指定需要计算长度的参数。指定单个参数。

目标参数:长度被复制到的参数。指定单个参数。

容量的单位:Configure 按钮可连到一个描述计算个体长度的大小的对话框。这可以通过传递到函数

的一个参数指定(被允许的值与源参数相同),或者你可以指定下列值中的一个:

• CHAR• TCHAR• WCHAR• MBCHAR

• 一个正整数,其中整数表示用字节计算的大小

例如,你可以指定 arg 1 描述大小。在程序中, arg 1 是 sizeof (struct foo),这会通知 Fortify SCA 字符串大小是 sizeof (struct foo)。

84 Audit Workbench 用户指南

Page 91: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

举例一个有效的规则包定义的规则元素可以包含任意条规则,它们的类型和它们想要操作的分析器相对

应。下面每一个例子都提供了一个程序源代码资源或构造的一个简单的英文描述,这个程序源代码

资源或构造可以通过使用 Fortify SCA 中的某一个分析器来模仿或者鉴别。在描述完每个规则所解决

的问题后,提供了规则的 小 XML 实现作为不同规则类型的例子。这代表可选规则元素(例如描

述)不包括在其中。考虑使用这些例子,或者其它你使用 Audit Workbench 创建的例子,如你自己

编写的自定义规则的模板。

有关可用的不同的规则类型的更多信息,以及特定区域和不同规则类型所接受的变量的细节信息,

请参见第 60 页中的 “配置自定义规则元素”。

这一部分包含了关于下面这些规则的例子:

• 语义规则举例

• 数据流的源规则举例

• 数据流传递规则举例

• 数据流侵入规则举例

• 配置规则举例(属性文件)

• 配置规则举例(XML 文件)

• 控制流规则举例

• 结构规则举例

语义规则举例将定义在任何包中的任何一个类的 Java 函数 foo() 的调用进行标记。

<SemanticRule formatVersion="3.4" language="java">

<RuleID>53C789D7-F6A0-4D95-87B7-94DCE1A935E2</RuleID>

<Description/>

<VulnCategory>Unconditional</VulnCategory>

<DefaultSeverity>3.0</DefaultSeverity>

<Type>default</Type>

<FunctionIdentifier>

<NamespaceName><Pattern>.*</Pattern></NamespaceName><ClassName><Pattern>.*</Pattern></ClassName><FunctionName><Value>foo</Value></FunctionName><ApplyTo implements="false" overrides="true"

extends="true"/>

</FunctionIdentifier>

</SemanticRule>

Audit Workbench 用户指南 85

Page 92: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

数据流的源规则举例将包 com.fruit 中的类 FruitDatabase 中定义的 Java 函数 getWebInput() 的返回值作为一

个不可信赖的输入源进行识别。并且,将返回感染标识 +XSS 的返回值进行分配,以便指出数值对 cross-site scripting 漏洞来说是一种风险。

<DataflowSourceRule formatVersion="3.4" language="java">

<RuleID>BC6FFEF9-C760-4BCA-AD48-2B5D90F4C4CC</RuleID>

<FunctionIdentifier>

<NamespaceName><Value>com.fruit</Value></NamespaceName><ClassName><Value>FruitDatabase</Value></ClassName><FunctionName><Value>getWebInput</Value></FunctionName><ApplyTo implements="false" overrides="true"

extends="true"/>

</FunctionIdentifier>

<OutArguments>return</OutArguments>

<TaintFlags>+XSS</TaintFlags>

</DataflowSourceRule>

数据流传递规则举例模仿从一个不可信赖的、或感染的对象中获取一个结果源的行为会导致结果返回到受到感染的对象,

就像通过编写一个贯穿整个过程的规则,指明如果定义在包 com.fruit 中的类 Basket 中的

getFruit() 函数被调用了,在一个受到感染的对象 (this 对象)上,那么函数返回的变量也受

到感染。

<DataflowPassthroughRule formatVersion="3.4" language="java">

<RuleID>DE93DE07-EFC6-4118-B49E-0033273D09AA</RuleID>

<FunctionIdentifier>

<NamespaceName><Value>com.fruit</Value></NamespaceName><ClassName><Value>Basket</Value></ClassName><FunctionName><Value>getFruit</Value></FunctionName><ApplyTo implements="false" overrides="true"

extends="true"/>

</FunctionIdentifier>

<InArguments>this</InArguments>

<OutArguments>return</OutArguments>

</DataflowPassthroughRule>

86 Audit Workbench 用户指南

Page 93: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

数据流侵入规则举例当来自一个不可信赖的源的数据到达这个函数的任意一个参数时,将所有定义在包 com.fruit 中的

类 FruitDatabase 的函数 executeQuery() 进行标记。

<DataflowSinkRule formatVersion="3.4" language="java">

<RuleID>F21C2F33-186F-4943-954A-416648B7FCC9</RuleID>

<VulnCategory>SQL Injection</VulnCategory>

<DefaultSeverity>4.0</DefaultSeverity>

<Description/>

<Sink><InArguments>0...</InArguments></Sink>

<FunctionIdentifier>

<NamespaceName><Value>com.fruit</Value></NamespaceName><FunctionName><Value>executeQuery</Value></FunctionName><ApplyTo implements="false" overrides="true"

extends="true"/>

</FunctionIdentifier>

</DataflowSinkRule>

配置规则举例 (属性文件)在所有的属性文件中,标记那些将 authentication.on 的值的都设置成 false 的所有实例。

<ConfigurationRule formatVersion="3.4">

<RuleID>610A1E2A-B3AE-4C63-A328-C1DE76270810</RuleID>

<VulnCategory>J2EE Misconfiguration</VulnCategory>

<DefaultSeverity>2.0</DefaultSeverity>

<Description/>

<ConfigFile type="properties"><Value>.*</Value></ConfigFile>

<PropertyMatch>

<NameMatch><Value>encryption.on</Value></NameMatch><ValueMatch><Value>false</Value></ValueMatch>

</PropertyMatch>

</ConfigurationRule>

Audit Workbench 用户指南 87

Page 94: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

配置规则举例(XML 文件)

在 web.xml 中,将 /web-app/encryption的所有实例都标记成 off。

<ConfigurationRule formatVersion="3.4">

<RuleID>543E222C-C318-46A8-BB36-28A894546129</RuleID>

<VulnCategory>J2EE Misconfiguration</VulnCategory>

<DefaultSeverity>3.0</DefaultSeverity>

<Description/>

<ConfigFile type="xml"><Value>web.xml</Value></ConfigFile>

<XPathMatch expression="/web-app [normalize-space(string(encryption))

= 'off']"/>

</ConfigurationRule>

控制流规则举例将所有定义在包 com.fruit 中的类 FruitDatabase 中的函数 startSession() 的调用的所有

进行案例标记,在当前函数结束之前是不被定义在包 com.fruit 中的类 FruitDatabase 中的函

数 endSession()的调用所允许的。

下面这个图表显示了整个流程。

图 15:控制流举例

<ControlflowRule formatVersion="3.4" language="java">

<RuleID>E9A944E8-2621-447B-BBBE-EE4FE2C61D80</RuleID>

<Description/>

<VulnCategory>Access Control</VulnCategory>

<DefaultSeverity>5.0</DefaultSeverity>

<FunctionIdentifier id="start">

<NamespaceName><Value>com.fruit</Value></NamespaceName><ClassName><Value>FruitDatabase</Value></ClassName><FunctionName><Value>startSession</Value></FunctionName><ApplyTo implements="false" overrides="true"

extends="true"/>

</FunctionIdentifier>

<FunctionIdentifier id="end">

<NamespaceName><Value>com.fruit</Value></NamespaceName><ClassName><Value>FruitDatabase</Value></ClassName><FunctionName><Value>endSession</Value></FunctionName>

88 Audit Workbench 用户指南

Page 95: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

</FunctionIdentifier>

<Definition><![CDATA[state start startState;

state startSession;state endSession;state error errorState;startState -> startSession { $start() }startSession -> endSession { $end() }startSession -> errorState { #end_function()

}]]></Definition>

</ControlflowRule>

结构规则举例在 JSP 页面中标记所有的 HTML 格式的注释的实例。

<StructuralRule formatVersion="3.4" language="jsp">

<RuleID>E8885AA6-C967-490A-B4DF-5F4692EF6BF5</RuleID>

<VulnKingdom>Encapsulation</VulnKingdom>

<VulnCategory>System Information Leak</VulnCategory>

<VulnSubcategory>HTML Comment in JSP</VulnSubcategory>

<DefaultSeverity>3.0</DefaultSeverity>

<Description/>

<Predicate><![CDATA[

Comment:html and text matches ".*"

]]></Predicate>

</StructuralRule>

编写无返回规则以识别无返回函数无返回规则 (NonReturningRule) 描述一个没有返回值的函数,主要被控制流分析器用来决定何时一

个控制流路径在一个特定函数处停止而不是继续通过它。这是一个帮助 Fortify SCA 的信息化规则类

型,而不是一个指出是否存在漏洞的规则类型。

当您创建数据流规则时,请使用描述在以下章节中的规则组件:

• 第 60 页中的“定义规则信息”

• 第 61 页中的“定义领域、类别和严重性”(仅用于数据流侵入规则)

• 第 63 页中的“定义函数”

注意: 参数不适用于这个规则类型。

Audit Workbench 用户指南 89

Page 96: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

编写结构规则自定义结构规则必须用 XML View (XML 视图)编写。这个部分介绍如何编写结构规则,包含下列

部分:

• 概述

• 类型

• 属性

• Null 解析

• 关系

• 结果报告

• 调用图的可到达性

• 属性引用

概述如同控制流规则一样,结构规则由一些在许多规则类型中共享的通用元素与一个包含用这个分析器专

用的特有语言编写的规则定义的特殊元素组成。规则定义提供了与规则匹配的代码构造的描述,因此

规则定义是 重要的元素。下面的示例展示了一个典型的结构规则,根据规则,本例鉴别了所有对 Java 函数 Integer.parseInt() 的调用,该函数没有立即出现在附带相应 catch 块的 try 块中

(NumberFormatException):

<StructuralRule formatVersion="3.4" language="java">

<RuleID>64B55F2A-CC9F-4272-BF52-7315AF62B565</RuleID>

<VulnKingdom>Errors</VulnKingdom>

<VulnCategory>Poor Error Handling</VulnCategory>

<VulnSubcategory>Uncaught NumberFormatException</VulnSubcategory>

<DefaultSeverity>3.0</DefaultSeverity>

<Description/>

<Predicate><![CDATA[

FunctionCall: function is[name == "parseInt"and enclosingClass.supers contains

[Class: name == "java.lang.Integer"]] and not in [TryBlock:]or not in [TryBlock:catchBlocks contains

[exception.type.name == "java.lang.NumberFormatException"]])

]]></Predicate>

</StructuralRule>

注意:默认情况下,结构规则不对 JSP 代码有效,因为 JSP 页面生成 Java 代码的工具包括了许多

代码结构,这会引起结构分析器产生许多警告,这些警告比较适合分析人工生成的代码,对工具生成

的代码并不需要。要编写应用于 JSP 的结构规则,请在规则定义中指定规则语言 'jsp'。如果要创建

一个同时适用于 Java 和 JSP 代码的结构规则,您需要编写两份规则定义,其中一个规则所指定的语

言是 'java',另一个是 'jsp'。

90 Audit Workbench 用户指南

Page 97: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

结构规则语言是一种表达代码构造之间关系的语言。规则由一个标签 (指定要匹配的代码构造类

型)和一个布尔值的判断式 (指出在哪种情况下会报告这种构造)组成。以下是一个典型的示例:

CatchBlock: exception.type.name == "java.lang.Exception" or

exception.type.name == "java.lang.Throwable"

通常来说,判断式是由以下内容构建的表达式:

• 字符串、整数和布尔文字

• 标准二进制关系 (==, !=, <, >, <=, >=)

• 一些其他的二进制关系 (is, in, contains, startsWith, endsWith, matches, reaches, reachedBy)

• 布尔连接词 (and, or, not)

• 引用构造属性的标识符

属性可以解析为字符串、整数、布尔、语言类型 (下面会讨论)或者其他构造。您可以用标准点链

符号来引用子属性。在上述示例中, exception 是可以解析为 Variable 的 CatchBlock 属性;

type 是可以解析为 Type 的 Variable 属性;name 是可以解析为 String 的 Type 属性。

子属性允许使用三种特殊关系: is, contains, 和 in 这种关系的右边可以是一个规则本身(在括

号内)。下面是一个典型示例:

ReturnStatement: in [FinallyBlock:]

如果左边的 is, contains 或 is contained 在与子规则匹配的构造中,那么这个关系为真。以上示例可

以匹配所有出现在 finally block 内的 return statement。

后,为了便于以后交叉引用,可以允许变量绑定。下面的两个示例在含义上是完全相等的。

FinallyBlock: contains [ReturnStatement:]

FinallyBlock fb: fb contains [ReturnStatement:]

变量绑定的范围适用于规则及所有子规则。

类型规则语言按照类型进行严格地划分。规则语言的类型被称为结构类型 (structural types),以区别源代

码语言的语言类型 (language types)。类型按照 Construct 组织起来的源代码结构进行分层划分。

每一种类型都继承了其父代的各种属性。

每一种属性都有固定的解析类型。所以,规则语言中每个子表达式的结构类型都在规则说明中明确。

静态的类型检查会在加载规则时执行。

以下是一个类型的完整结构:

Value

- Boolean

- String

- Number

- Null

Type

Construct

- Compilation Unit

Audit Workbench 用户指南 91

Page 98: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

- Statement- - CallStatement- - ReturnStatement- - ThrowStatement- - AssignmentStatement- - IfStatement- - WhileStatement- - DeclStatement- - Block

- - - TryBlock- - - CatchBlock- - - FinallyBlock- - - SynchronizedBlock- - - SwitchBlock

- SwitchBlock

- Expression- - Location

- - - FieldAccess- - - VariableAccess- - - FunctionPointer

- - FunctionCall- - Operation- - Instanceof- - Typecast- - Literal

- - - StringLiteral- - - CharLiteral- - - BooleanLiteral- - - IntLiteral- - - LongLiteral- - - FloatLiteral- - - DoubleLiteral- - - NullLiteral

- Declaration- - Variable- - Class- - Field- - Function

- CommentFile

- Comment

后,规则语言支持对象列表。这些列表没有正式的类型名称,所以他们不能作为一个规则的 "subject" 出现。尽管如此,属性还是能够解析到列表中;列表可以使用 contains 和 in 关系进行

访问,就象结构一样。例如, Function 结构有一个可以返回 Type 对象列表的属性 parameterTypes。下面的规则:

Function: parameterTypes contains [name == "int"]

会匹配带有 int 参数类型的函数。请注意标签可以从子规则中省略;由于我们正在搜索一个 Type[] 列表,默认的标签就是 Type。

您也能按照从 0 开始的索引符号,使用标准的括号存取引用列表。因此,下面的函数会匹配第一个

参数是 int 类型的函数:

Function:parameterTypes[0].name == "int"

92 Audit Workbench 用户指南

Page 99: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

属性第 96 页中的 “属性引用” 提供了所有结构分析器所识别的属性列表。所有的结构类型(包括列表

和原始结构类型)都有关联的属性,每个类型都继承了它父代的属性。

属性经常解析成其解析类型的子类型。例如,考虑下面的 Java 代码行:

x = 30;

在分析器中这会被转换一个 AssignmentStatement。在规则语言中,我们可以用 AssignmentStatement.rhs 属性获得赋值表达式的右边,这个属性的名称会解析为 Expression。然而,这种情况下,它实际上被解析为一个 IntegerLiteral, Literal 的子类型,

而后者本身又是 Expression 的子类型。如果您希望编写一个规则,以匹配每个右边都是语言类型 "int" 的赋值表达式,请:

AssignmentStatement: rhs.type.name == "int"

因为 type 是所有 Expression 对象的一个属性。但是如果希望匹配每个右边都是整数文字 30 的赋值表达式,您必须使用一个子规则来应用 cast AssignmentStatement.rhs:

AssignmentStatement: rhs is [IntegerLiteral: value == 30]

这是因为 value 不是 Expression 的一个属性。为了保证类型安全,在可以访问 value 属性前,

您必须声明 rhs 实际上是一个 IntegerLiteral。

在第 96 页中的 “属性引用” 中列出了所有分析器可以识别的属性。

Null 解析

一些属性只对某些结构类型实例有效。例如, TryBlock 有一个属性 finallyBlock,该属性可以

解析为一个与 try block 关联的 finally block,但并不是所有的 try block 都有关联的 finally block。

在这些情况下,属性会被解析为 null。规则不必检查这一点,因为结构分析器会以明确定义的方式来

处理 null 间接引用。每个 null 的属性都解析为 null(而不引起任何形式的异常),null 对象上的每

个子规则关系都被解析为 false,布尔连接词按照如下方式进行解析:

null and null -> nullnull or null -> nullnull and true -> nullnull or true -> truenull and false -> falsenull or false -> null

也就是说,如果确定是布尔值,那么就会对其解析;否则它就是 null。

关系相等与不相等关系, == and !=,可以用来比较任意两个结构分析器所认可的对象。为了让等式成

立,对象的结构类型必须相符。等式对原始结构类型具有明显的意义;对于构造来说,条件是两个

对象必须在结构上完全相同。确认结构相同的方式有两种,目前只采用其中的一种。对于声明来说,

它主要通过比较符号的规范名称来确认。对于其他结构来说,它主要通过比较底层 NST 节点的即时 ID 来确认。如果列表用相同的顺序列举相等的元素,那么列表就是相等的。

次序关系, <、 >、 <= 和 >= 在字符串、数字和布尔值中使用它们通常的含义。类型,列表和结构是

不能比较的。

Audit Workbench 用户指南 93

Page 100: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

有几个特殊关系:

• is 的含义与 == 相同(但被用来作子规则的开头的这种情形除外)。

• in 和 contains 可与字符串和列表一起使用,含义是显而易见的。

• startsWith、 endsWith 和 matches 仅能用于联系两个字符串。 matches 将关系式的右边

解析为一个 Java 正则表达式,且仅在该表达式与左边相匹配的情况下它才为真;

• reaches 和 reachedBy 仅能用来联系 2 个 Functions 或者 2 个 Classes。相关内容会在第 95 页中的 “调用图的可到达性” 中讨论。

所有这些关系的左边都可以省略。省略后,左边默认的设置就是规则正在匹配的构造。

例如,下列(人为设计的)方法会匹配所有具有一个恰当的超类的类:

Class c: supers contains [Class: != c]

由于 supers 解析为 Class[],从而可以简写为:

Class c: supers contains [!= c]

通常第 1 个示例更受欢迎,虽然长了一点,但是更清楚。

结果报告重新调用下面这个示例,结果会匹配出现在 finally 块中的返回语句:

ReturnStatement: ReturnStatement: in [FinallyBlock:]

下面的规则很相似:

FinallyBlock: contains [ReturnStatement:]

尽管如此,仍存在两个显著的区别。首先,如果一个 finally 块包含多个返回语句,那么第 1 个规则

会生成多个漏洞,而第 2 个规则只会产生 1 个漏洞。

第二个区别就是漏洞的报告方式。在分析器的 FVDL 输出中,原始源点位置总是指向规则 外层的

构造。在上面的第 1 个规则中,返回语句会被高亮显示;而在第 2 个规则中,块自身会被高亮显示。

默认情况下,结构分析器只会报告与之相匹配的 外层结构的源点位置信息。对于有些规则,这是足

够的;但是对其他规则,需要包含更多信息从而让漏洞的含义更丰富。

启用一个子规则的报告,简单地在那个子规则后加一个星号。例如:

ReturnStatement: in [FinallyBlock:]*

这个规则与未加星号的规则在逻辑上对等,它报告的漏洞与未加星号的规则所报告的完全一样。尽管

如此,当它被匹配时,会将二者的返回语句和相应的 finally 块都报告出来。请注意返回语句仍然被

认为是主要的。

生成 FVDL 报告的目的仅仅为了满足与匹配相关的带有星号的规则。例如,考虑如下示例:

Function: contains [AssignmentStatement:]* and public or

contains [ReturnStatement:]* and private

这个规则会匹配任何包含赋值语句的 public 方法,或者任何包含返回语句的 private 方法。结果总是

会报告相匹配的语句,因为 2 个子规则都带有星号。然而,如果方法同时包含了一个赋值语句和返

回语句,那么仅会出现一个报告。如果方法是 public,会报告赋值语句;相反如果是 private,则会

报告返回语句。

94 Audit Workbench 用户指南

Page 101: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

调用图的可到达性许多结构规则仅适用于某些上下文。例如,在 Enterprise Java Beans (EJBs) 中建议永远不要直接调

用 java.io 库。通过实现某个规则来匹配每个对 java.io 的调用:

FunctionCall: function.enclosingClass.name startsWith "java.io."

但是这会生成大量的误报,因为绝大多数对 java.io 的调用并不涉及 EJB。更好的近似结果就是

限制出现在 EnterpriseBean 中的函数调用。请注意函数调用的封闭类和函数本身的封闭类是有

区别的。

FunctionCall: enclosingClass.supers contains

[name == "javax.ejb.EnterpriseBean"] andfunction.enclosingClass.name startsWith "java.io."

尽管如此,这会遗漏许多 EJB 间接调用 java.io 的情况。例如,如果一个 EJB 在不同的类中调用

一个实用程序方法,然后这个实用程序方法打开了一个文件,那么这种操作应视为违规。为了处理

此类情况,结构分析器提供了两种关系, reaches 和 reachedBy 来检查程序的调用图。表达式

f reaches [...subrule...]

仅在一些调用图中的路径是从 f 开始并以与子规则匹配的函数终结时为真。reachedBy 类似,只是

路线朝相反的方向进行。

下面是给上述 EJB 规则编码的 好方式:

FunctionCall: enclosingClass.supers contains

[name == "javax.ejb.EnterpriseBean"] andfunction reaches [enclosingClass.name startsWith "java.io."]*

请注意使用星号表明应报告目标函数。请参见第 94 页中的 “结果报告”。

您也可以在类上使用 reaches 和 reachedBy 关系。只有在 A 的一些函数到达 B 的一些函数时,

类 A 才能到达类 B。例如,下面的规则可以与 Applet 到达的类中的 public 字段匹配:

Field: public and not final and enclosingClass reachedBy

[supers contains [name == "java.applet.Applet"]]

请注意字段本身不能作为 reachedBy 关系的一部分出现,只有函数和类才能满足 reaches 或 reachedBy。

还要注意鉴于性能的原因,变量范围不能在 reaches 或 reachedBy 判断式中交叉使用。例如,下

面的示例是非法的:

Function f: reaches [Function: != f]

变量 f 不能出现在 reaches 关系的子规则中。

Audit Workbench 用户指南 95

Page 102: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

属性引用

本节介绍了属性。

表 31: 属性引用

名称

附加参数

描述

名称 描述

AssignmentStatement

lhs (表达式) 赋值表达式的左边 一个赋值。

rhs (表达式) 赋值表达式的右边

Block 一个代码块。

Boolean 一个布尔值。

BooleanLiteral value (布尔值) : 这个字符的值。 一个布尔字符(true 或 false)

CallStatement 一个函数调用语句本身。

CatchBlock exception (变量) 捕获到的异常。 一个 "catch" 块。

CharLiteral 一个字母型字符。

Class functions (函数) 这个类中声明的函数。 一个类或接口声明。

fields (字段) 这个类中声明的字段。

supers (类) 这个类所指定的类和接口的列表。这包括当前的类。

interface (布尔值) 这个类实际是否是一个接口。

Comment text (字符串) 注释的文本内容 一个源代码注释。注意:结构规则不检测 .NET 文件中的注释。doc (布尔值) "true",如果这个注释是一个 Java

或 JSP 文档注释。

block (布尔值) 如果这是一个块代码注释 (不包括文档注释)

inline (布尔值) 如果这个注释是一个单行 "inline" 注释 ("//")。

startline (数字) 这个注释起始位置的行号。

CommentFile comments (注释) 所给文件中的注释。 在一个特定文件包含所有注释的对象。注意: 结构规则不检测 .NET 文件中的注释。

file (字符串) 这个注释所在的文件。

Compilation Unit 一个编译单元(通常所有的代码都在一个文件中)。

Construct enclosingClass(类)

这个结构外部 近的类。 所有可匹配结构的基础类型。

empty (布尔值) 如果无子项。

96 Audit Workbench 用户指南

Page 103: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

Declaration abstract (布尔值) 所有声明的基础类型。

final (布尔值)

package (布尔值)

private (布尔值)

protected (布尔值)

public (布尔值)

static (布尔值):

strictfp (布尔值)

synchronized(布尔值)

virtual (布尔值)

volatile (布尔值)

serializable(布尔值)

webservice(布尔值)

name (字符串) 所声明的实体的名称

type (类型) 所声明的实体的类型

DeclStatement variable (变量) 声明中的变量 一个声明。

DoubleLiteral 一个双精度型字符。

表 31: 属性引用

名称

附加参数

描述

名称 描述

Audit Workbench 用户指南 97

Page 104: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

Expression type (类型) 声明的类型 所有表达式的基础类型。

constantValue(数值)

这一表达式的常值。如果表达式没有常值,或 Fortify SCA 无法确定

它的话,将会是 null。

constantValues(数值)

有关这个表达式可能使用的常值的详细列表。如果 Fortify SCA 不能

列举出这个表达式可能出现的所有常值,那么将会是 null。

partialConstantValues (数值)

这个表达式可能使用的常值的部分列表。

enclosingFunction(函数)

主体包围了这个表达式的函数。

location (位置) 删除强制类型转换等操作后这个表达式的底层位置。如果表达式不能体现一个位置,那么将是 null。

Field 一个字段声明。

FieldAccess instance (表达式) 基本表达式。 存取一个变量字段的表达式。

field (字段) 被访问字段的声明。

FinallyBlock 一个 "finally" 块。

FloatLiteral 一个浮点型字符。

表 31: 属性引用

名称

附加参数

描述

名称 描述

98 Audit Workbench 用户指南

Page 105: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

Function constructor(布尔值)

这是否是一个 constructor。 一个函数或方法。

destructor (布尔值) 这是否是一个 destructor。

initializer (布尔值) 这是否是一个静态的 initializer。

parameters (变量) 这些函数参数的声明。 警告: 除非函数被定义为正在分析的源文件,否则为 null。仅针对参

数的类型,请使用 "parameterTypes"。

parameterTypes(类型)

参数类型。

exceptionTypes(类型)

声明要抛出的异常列表。

returnType (类型) 这个函数的返回类型(与 "type" 相同)。

callers (函数) 调用这个函数的函数列表。

callees (函数) 被这个函数调用的函数列表。

isReferenced(布尔值)

这个函数的地址是否被引用过。

supers (函数) 这个函数(直接或间接地)重新定义或实现的函数列表。

FunctionCall instance (表达式) 这个方法在哪个对象实例上被调用。对于静态函数调用将会是 null

一个函数或方法调用。

function (函数) 函数调用的目标。

arguments(表达式)

函数的实参。

FunctionPointer 一个函数识别符。

IfStatement expression(表达式)

条件表达式。 一个 "if" 条件语句。

ifBlock (块) 如果条件是 true 时执行的块。

elseBlock (块) 如果条件是 false 或 null 时执行的块。

Instanceof targetType (类型) 正在检查的类型。 一个类型实例检查表达式。

expression(表达式)

正在检查类型的表达式。

IntLiteral value (数字) 这个字符的值。 一个整数型字符。

表 31: 属性引用

名称

附加参数

描述

名称 描述

Audit Workbench 用户指南 99

Page 106: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

Literal image (字符串) 这个字符值的字符串版本。 一个字符值。

Location arrayIndices(表达式)

数组可以表明这个位置。 一个存储位置。

LongLiteral value (数字) 这个字符的值。 一个长整型字符。

Null Null 程序值。

NullLiteral 一个表示程序值为 "null" 的字

符值。

Number 一个整数或浮点值。

Object 所有对象的基础类型。

Operation op (字符) 一个等于源代码语言中运算符标记的字符串

一个运算符表达式(一元的与二元的)。

unary (布尔值) 运算符是否是一元运算符。

lhs (表达式) 这个运算符的左边。

rhs (表达式) 这个运算符的右边

ReturnStatement

expression(表达式)

正在返回的表达式 一个 "return" 语句。

Statement enclosingFunction(函数)

主体中包含这个语句的函数 一个源代码语句。

String length (数字) 字符串中的字母数字。 一个字符串值。

StringLiteral 一个字符串字符。

SwitchBlock cases(SwitchCase) "case" 部分的列表。 一个 "switch" 语句块。

SwitchCase default (布尔值) 这个 case 是否为“默认的”

case。"switch" 中的一个 "case"。

expression(表达式)

该 case 值的表达式

synchronizedBlock

lock (表达式) 被同步的对象的表达式。 一个 "synchronized" 块。

ThrowStatement expression(表达式)

正在被抛出的表达式。 一个意外抛出语句。

TryBlock catchBlocks(CatchBlock)

关联的 "catch" 块列表。 一个 "try" 块。

finallyBlock(FinallyBlock)

关联的 "finally" 块列表(或 null,如果不存在)。

表 31: 属性引用

名称

附加参数

描述

名称 描述

100 Audit Workbench 用户指南

Page 107: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

编写 ColdFusion 规则

为了给 Macromedia ColdFusion(R)5 应用程序编写规则,您需要了解 CFML 语言特征与标准编程语

言(例如 Java, C#,和 C++)的语言特征是如何对应的。本节介绍了编写 ColdFusion 规则时,需

要特别考虑的细节的规则示例和一些其他的信息。

注意:在余下来的内容中,所有对 ColdFusion 或 CFML 的引用都指代了 ColdFusion/CFML 5。

Type primitive (布尔值) 这个类型是否是原始类型 处于分析中的程序语言的一个类型。

name (字符) 这个类型的名称

arrayDimensions(数字)

数组维度的数量。例如, "Object [] []" 类型有 2 个数组维度。

pointerDepth(数字)

指针间接的等级。例如,类型 "char**" 的指针深度是 2。

indirectionLevel(数字)

间接等级的总数(是 "arrayDimensions" 和 "pointerDepth" 的和)。

definition (类) 定义这个类型的类声明。

Typecast targetType (类型) 将表达式强制转换成的类型 一个强制类型转换的表达式。

expression(表达式)

强制类型转换的底层表达式。

Value 简单的值的基础类型,例如数字和字符串。

Variable enclosingFunction(函数)

主体包含这个声明的函数 一个变量声明。

referenceTaken(布尔值)

这个变量的地址是否被引用过(因此可能是别名)。

VariableAccess variable (变量) 存取中的变量的声明 一个存取变量的表达式。

this (布尔值) true,如果该变量是 "this" 变量

outer (布尔值) true,如果该变量是 "this" 变量的

外部类。

WhileStatement expression(表达式)

条件表达式 一个循环。

block (表达式) 循环的主体。

表 31: 属性引用

名称

附加参数

描述

名称 描述

Audit Workbench 用户指南 101

Page 108: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

本节包含以下主题:

• 标准特征

• 标签

• 数据库访问

• 未被处理的异常

• 其他示例

标准特征这部分介绍了命名空间和函数。

命名空间

所有 ColdFusion 提供的标签和函数都会在 cf 命名空间中出现。

• cf.lib - ColdFusion 标准库函数,例如 URLEncodedFormat(…)

• cf.tag - ColdFusion 标准标签,例如 <cfoutput> 和 <cfquery>

• cf.runtime - 不出现在源代码中,但是会在后台使用

应用程序中的每个 CFML 页都有一个唯一的命名空间,该命名空间与页从应用程序根目录计算的相

对路径相等。回顾一下,当运行一个扫描时,通过 -source-base-dir 命令行选项来设置应用程

序根目录。

命名空间的名称总是使用 Unix 风格的分隔符。例如,如果应用程序根目录是 C:\WebApp,而讨论

的页位于 C:\WebApp\Login\Error.cfm,那么页的命名空间就是 Login/Error.cfm。

用户定义的函数放置在包含页面的命名空间。

函数

CFML 函数的规则和其他任何语言的规则是相似的。主要的区别是,除输入参数和返回值外,数据流

规则还可以访问页的全局变量。在 CFML 中,全局变量结构被称为 Variables。在数据流规则中,

它被称为 globals。

例如,如果经审计员鉴定 C:\WebApp\Login\Error.cfm 中的函数 FixData(…) 要从全局变量 data 中删除可能为恶意的 HTML 和 JavaScript 特殊字符,恰当的擦除 pass-through 规则会去除 XSS 感染标识,如下所示:

规则类型:Data Flow Pass Through

规则的具体信息:

语言:CFML外部参数:globals.data内部参数:globals.data感染源:-XSS

函数识别符:

函数 / 方法名称:FixData命名空间:Login/Error.cfm

102 Audit Workbench 用户指南

Page 109: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

标签标签是 CFML 区别于其他支持 Fortify SCA 语言的标记。

CFML 中的某些标签具有特殊的行为(例如 <cfset>、 <cfoutput>、 <cfif> 和 <cfscript>)。这些标签由 Fortify SCA 在内部处理。然而,大多数标签一般都被模拟为对象。

当在 ColdFusion 中为标签编写规则时,应考虑以下重要属性:

• 每个标签类型都有一个对应的类。例如, <cfmail> 标签体现在 cf.tag.cfmail 类中。

• 标签的每个事件对应类中的新实例。

• 标签的属性通过标签对象的 "setter" 方法设置。例如, <cfmail> 标签的 subject 属性使用 Set_subject(…) 方法进行设置。

• 如果一个属性引用一个变量名,这个变量使用 Input_ 和 Output_ 开头的方法来读/写。

• 标签对象通过一系列对 Write(…) 方法的调用来使用标签内容 (可以包含其他标签)。这种方

法的第一个参数就是所使用的内容。

• 在标签内容被写入标签对象后,会调用标签对象的 "execute" 方法。方法名称和标签名称相同。

这个函数的返回值会被传递到父标签对象的 Write 方法。

为了处理不包含在标签中的 高层代码,每个页都有一个 “虚拟标签”作为一个页上所有内容的容

器。这个标签对象属于 cf.tag.Page 类。

下面的 CFML 代码通过发送一个电子邮件消息来响应表单提交请求:

<cfset subject = form.subject><cfset to = form.email><cfmail from="[email protected]" to="#to#" subject="#subject#">Dear #form.name#, request denied.</cfmail>

Fortify SCA 在内部以如下方式表示这段代码:

subject = form.subjectto = form.emailt = cf.tag.cfmail.Create()t.Set_from("[email protected]")t.Set_to(to)t.Set_subject(subject)t.Write("Dear ")t.Write(form.name)t.Write(", request denied.")t.cfmail()

如果您担心恶意的 subject 行会允许对不良编写的电子邮件客户端软件进行注入式攻击,可以按如下

方式编写规则使 subject 属性成为带 XSS 感染标识的感染数据的 data flow sink:

规则类型:Data Flow Sink

规则的具体信息:

语言:CFML内部参数: 0

函数识别符:

函数 / 方法名称:Set_subject命名空间:cf.tag类名:cfmail

Audit Workbench 用户指南 103

Page 110: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

条件(Taint Flag Set (感染标识设置)):

感染标识:XSS

如果创建侵入规则要改在邮件消息正文中,将 Function/Method Name 字段改为 Write 即可。

变量输入/输出

有时属性接受变量名,而不接受数值。这样的示例如 <cfsavecontent> 标签。

<cfsavecontent variable="report">…</cfsavecontent>

在上面的代码片段中, report 不仅仅是一个字符串值。它指代了一个保存 <cfsavecontent> 标签输出的变量。您需要一个把感染从标签传递到变量的规则。

注意:这个规则已经在 CFML 安全编码规则包中定义了。

规则类型:Data Flow Pass Through

规则的具体信息:

语言:CFML内部参数:this外部参数:return

函数识别符:

函数 / 方法名称:Output_variable命名空间:cf.tag类名:cfsavecontent

数据库访问当使用后面跟随 <cfoutput> 的 <cfquery> 访问一个数据库字段时,不存在显式函数调用。

Fortify SCA 在 cf.runtime 命名空间中插入一个对 QueryGet(query, fieldName) 函数的隐式

调用。

下面的规则为数据库指出不受信赖的数据源:

规则类型:Data Flow Source

规则的具体信息:

语言:CFML外部参数:return感染源:+XSS

函数识别符:

函数 / 方法名称:QueryGet命名空间:cf.runtime

未被处理的异常检测未被处理的异常涉及两个部分: 定义异常类型和识别异常源代码。

104 Audit Workbench 用户指南

Page 111: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

标准异常类型

CFML 安全编码规则包已经包含了以下异常类型的定义: Application、Database、Template、

Security、 Object、 MissingInclude, Expression 和 Lock。安全编码规则包还包含了对高

级异常类型的定义,您可以参见 《Macromedia's CFML 5.0 reference manual》的 "cftry/cfcatch" 页上的相关介绍。

每个异常都有一个对应的感染标识。通过转换,一个异常的感染标识可全部变成大写形式,并通过

给异常名称添加前 EXCEPTION_ 把所有的非文字数字字符替换为下划线来获得。

自定义异常类型

为了让 Fortify SCA 知道自定义异常类型,你需要编写 3 个规则。例如,如果您需要定义异常类型 UserInput,那么首先要定义一个代表这个异常的新的感染标识。

感染标识名称:EXCEPTION_USERINPUT

类型:特定

抛出异常的规则:

规则类型:Data Flow Source

规则的具体信息:

语言:CFML外部参数: 0感染源:+EXCEPTION_USERINPUT

函数识别符:

函数 / 方法名称:Throw命名空间:cf.runtime

条件 (常量等于):

参数: 1值:UserInput

然后编写另一个规则,用来捕获异常。

规则类型:Data Flow Pass Through

规则的具体信息:

语言:CFML内部参数: 0外部参数: 0感染源:-EXCEPTION_USERINPUT

函数识别符:

函数 / 方法名称:Catch命名空间:cf.runtime

条件 (常量等于):

参数: 1值:UserInput

后,编写另一个规则,用于异常未被捕获时进行检测。

规则类型:Data Flow Sink

Audit Workbench 用户指南 105

Page 112: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

规则的具体信息:

语言:CFML内部参数: 0

函数识别符

函数 / 方法名称:Uncaught命名空间:cf.runtime

条件(Taint Flag Set (感染标识设置)):

感染标识符:EXCEPTION_USERINPUT

异常源代码

异常源代码是可能会抛出异常的函数。异常通过特殊的全局变量 $Exceptions 传播。例如,

<cflock> 标签可以抛出 Lock 异常。对应的规则是:

规则类型:Data Flow Source

规则的具体信息:

语言:CFML外部参数:globals.$Exceptions感染源:+EXCEPTION_LOCK

函数识别符:

函数 / 方法名称:cflock命名空间:cf.tag类名:cflock

其他示例本节介绍了以下规则:

• 被要求的属性

• 禁用的标签

• 禁用的属性

• 禁用的属性值

被要求的属性

查找所有 <cfmail> 标签不带 timeout 属性使用的实例。

规则类型:control flow

函数识别符 1:函数 / 方法名称:Create引用 ID:Create命名空间:cf.tag类名:cfmail

函数识别符 2:函数 / 方法名称:Set_timeout引用 ID:SetTimeout命名空间:cf.tag类名:cfmail

函数识别符 3:函数 / 方法名称:cflock

106 Audit Workbench 用户指南

Page 113: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

引用 ID:End命名空间:cf.tag类名:cfmail

控制流规则的具体信息:

语言:CFML定义: state start Start;state StartSending;state SetTimeout;state error WaitIndefinitely;var Tagstart -> StartSending { Tag = $Create(...) }StartSending -> SetTimeout { Tag.$SetTimeout(...) }startSending -> WaitIndefinitely { Tag.$End(...) }

禁用的标签

<cfdump> 标签通常在调试期间使用,但不应出现在产品代码中。

注意:这个规则已经在 CFML 安全编码规则包中定义了。

规则类型:semantic

规则的具体信息:

规则类型:default语言:CFML

函数识别符:

函数 / 方法名称:cfdump命名空间:cf.tag类名:cfdump

禁用的属性

<cfindex> 标签的 action 属性不支持 ColdFusion MX。您可以禁用这个属性,使 终的移植变得

更简单。

规则类型:semantic

有关规则的具体信息

规则类型:default语言:CFML

函数识别符:

函数 / 方法名称:Set_action命名空间:cf.tag类名:cfindex

禁用的属性值

您可能不希望使用 <cffile> 标签中的 delete 操作。

规则类型:semantic

规则的具体信息:

规则类型:standard语言:CFML

Audit Workbench 用户指南 107

Page 114: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

函数识别符:

函数 / 方法名称:Set_action命名空间:cf.tag类名:cffile

条件(常量等于):

参数: 0值:delete

自定义规则示例从理论上认识安全漏洞是非常必要的,但是把这些信息与现实生活中的安全问题联系起来很难。

下面的示例列举了如何编写自定义规则以解决特定的问题:

• 在第三方代码中给简单的数据流属性建模

• 把所有包含一个通用名称元素的函数都当作传递

• 排除扫描分析结果中的已验证的数据

• 使用 #ifblock Directive 匹配条件分支

• Structural 规则举例

在第三方代码中给简单的数据流属性建模看下面的代码,它从 web 表单中读取值,并将值储存在一个集合中,然后将得到的这个值作为对数

据库的一个查询:

...Foo x = getWebInput("x");Basket b = new Basket();b.addFoo(x)Foo z = b.getFirstFoo();Bar result = Database.executeFooQuery(z);

...

在这个示例中,代码依赖第三方类 Foo、Bar、Basket 和 Database,这些类在编译时没有可用的

原始资料,也还没有涵盖在安全编码规则包中。而且,由于对来自 web 的外部数据的处理和操作,

这个例子中的安全漏洞似乎可以被数据流分析器检测到。

为了提供有效数据流分析所要求的范围,您需要编写自定义规则以鉴别:

• 被感染的数据从哪里进入程序

• 它如何在代码中传播

• 它在哪些与安全相关的函数中使用会是不安全的

在这个示例中,输入是从一个 web 表单中使用 getWebInput(...) 调用读取的,并返回一个 Foo 对象。为了让 Fortify SCA 正确地将这个函数识别为被感染的数据源,您需要编写一个数据流源规

则,指定函数的返回值为分配传染的输出参数。针对上述示例代码的分析,规则的结果认为变量 x 被感染。

接下来,您需要确定通过新的自定义源规则识别出的被感染数据是如何经过程序的。在下面的两行

中,由于新的自定义源规则, Fortify SCA 认为 x, 是被感染了的变量,并将该变量添加到名为 Basket 的集合中。

108 Audit Workbench 用户指南

Page 115: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

一旦将变量 x 添加到 b 中,为了让 Fortify SCA 跟踪与之相关的感染,您需要编写另外一个数据流规

则,这次是 pass-through 类型。自定义 pass-through 规则将 Basket 类中的 addFoo(...) 函数的

第一个参数 (参数 0)识别为被感染数据的流入路径,相应地,将函数被调用的 Basket('this' 对象)识别为感染的流出路径。针对上述示例代码的分析,规则的结果认为添加被感染的变量 x 后,

Basket b 也被感染。

与 x 相关的感染传播的下一个途径是从 Basket b 获取到 z。于是认为示例的安全分析现在会把 z 看作被感染的数据,这种推理是完全合乎逻辑的,但是需要另外一个自定义规则才能实现。因此,

您必须编写另一个自定义 pass-through 规则,把 Basket 对象识别为被感染数据的输入路径,相应

地,把 getFirstFoo(...) 函数的返回值识别为感染的输出路径。针对上述示例代码的分析,规

则的结果就是 b.getFirstFoo(...) 的返回值和认为变量 z 也被感染。

后,被自定义规则跟踪的直到到达变量 z 的数据的用途是作为数据库使用 executeFooQuery(...) 调用的一个查询。因为向相应的 web 表单输入数据的用户有可能会输入

恶意的内容,企图破坏数据库或未经授权而访问敏感信息,这会允许数据直接作为对数据库的查询

来使用,从而构成了一个 SQL Injection 漏洞。为了让 Fortify SCA 检测到这一点,您必须编写 后

自定义数据流的分析规则,这一次为 sink 类型。这个新的自定义 sink 规则将 Database 类中的 executeFooQuery(...) 静态函数的第 1 个参数 (参数 0)识别为被感染数据的输入路径,这暗

示 Fortify SCA 如果被感染的数据到达这个参数,它应该报告漏洞分类和相关的规则(这个示例中的 SQL Injection)。针对上述示例代码的分析,规则的结果就是使用被感染的变量 z 调用函数 executeFooQuery(...) 将被视为一个 SQL Injection 漏洞,并以此种方式出现在 Fortify SCA 的输出中。

把所有包含一个通用名称元素的函数都当作传递在这个示例中,假设您希望把所有以前 set 开头的函数都当作传递。在正则表达式中, "." 标记与

任意的字符都匹配,所以正则表达式组合 ".*" 与 0 个或更多的任意字符匹配,这恰恰是您解决这个

问题的钥匙。因此,为了创建上述规则,可以用下面的函数识别符来创建一个 pass-through 规则:

• 函数/方法名称:正则表达式 "set.*"

• 包:正则表达式 ".*"

• 类:正则表达式 ".*"

排除扫描分析结果中的已验证的数据考虑下面的代码,其中 MyLibrary.validateForSQLInjection() 是一个验证数据 SQL injection 的函数。然而,在分析下面的代码时,Fortify SCA 报告一个 SQL Injection 问题。由于您知

道 MyLibrary.validateForSQLInjection() 在将数据传递到 s.executeQuery(count) 前已经正确地验证了数据,因此希望要把这个 SQL Injection 问题从扫描分析结果中排除。

String count = request.getParameter("count");boolean valid = MyLibrary.validateForSQLInjection(count);

Connection c = null;Statement s = null;ResultSet r = null;

if(valid) { c = DriverManager.getConnection("MyConnectionDriver");s = c.createStatement();r = s.executeQuery(count);

Audit Workbench 用户指南 109

Page 116: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

else {

// error...

}

...

为了防止有效数据触发 SQL Injection sink 规则,为 MyLibrary.validateForSQLInjection() 编写一个自定义数据流的 pass-through 规则,把 VALIDATED_SQL_INJECTION 感染标识添加到外

部参数。

当您使用自定义 pass-through 规则运行 Fortify SCA 时, SQL Injection 问题将不再出现在分析结

果中。

注意:当您使用 Fortify Software 安全编码规则包时,存在带有 VALIDATED_SQL_INJECTION 感染

标识的数据的问题将不会触发相关漏洞类别的 sink 规则,因此不会在分析结果中进行报告。要在自

定义 sink 规则中模仿这个行为,在您的 SQL Injection sink 规则中添加一个 NOT Taint Flag Set VALIDATED_SQL_INJECTION 条件。

使用 #ifblock Directive 匹配条件分支

控制流规则中的 #ifblock(var, const, which) 指令允许规则编写者指定状态转变仅在条件构

造(例如 if 语句)的一个分支中发生。使用 #ifblock 指令的状态转变仅在表达式 var == const 被估值为 which 时执行。

例如,考虑以下代码:

Object result = functionThatMayReturnNull();if (result == null) {return null;} else {return result.toString();}

变量 result 应该在任意方法调用它之前首先检查是否为 null 。可以用下面的规则来表达:

state start startState;state mayBeNull;state isNotNull;state error badMethodCall;var result;startState -> mayBeNull { result = $functionThatMayReturnNull() }mayBeNull -> isNotNull { #ifblock(result, null, false) }mayBeNull -> badMethodCall { result.#any_function()}

当这个规则用于扫描上面给出的示例代码时,从 mayBeNull 到 isNotNull 的转变仅发生在 if 语句的 else 分支,因为对于 if 语句的 then 分支, result == null 比较的评估为 true,而 #ifblock 构造的 which 参数为 false。

如果 if 语句的断言被转换为读取 result != null,那么到 isNotNull 状态的转变会发生在 if 语句的 then 分支中,而 else 分支中对 result 的间接引用会被规则报告出来。这体现了 #ifblock 构造的一个重要属性。which 参数可以应用到 var == const 比较中,而不能应用到程序中出现的

实际表达式。这种情况下,断言 result == null or!(result!= null) 会导致转变发生在 if 语句的 else 块中,而断言中的 result!= null or!(result == null) 会导致转变发生在 then 块中。

110 Audit Workbench 用户指南

Page 117: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

#ifblock 构造通常用于规则必须从分析中丢弃某些值的情况。例如, memory leak 规则使用 #ifblock 表达式来避免调用 malloc() 的结果是 null 时所出现的误报。这个规则构造也适用于以

下情况:仅在变量为某个特定值时才使用规则 (如上示例)。如果结果不是 null,那么它与示例中 null dereference 规则没有任何关系。

Structural 规则举例

下面的规则匹配对 finalize() 的显式调用。异常发生在 super.finalize() 方法的主体中出现

的对 super.finalize() 的调用中。

FunctionCall:function is [name == "finalize" and parameterTypes.length == 0

and not (enclosingFunction is

[name == "finalize" and parameterTypes.length == 0]and enclosingClass.supers contains function.enclosingClassand function.enclosingClass != enclosingClass)

下面的示例与 "hidden" 继承字段相匹配,这些字段的访问权限在派生类中比在父类中要更受限制。

Field f: not public and enclosingClass.supers contain

[Class: != f.enclosingClass and contains

[Field: name == f.name and(public orprotected and (f.private or f.package) orpackage and f.private)

]*

]*

下面的示例检查不经过克隆直接返回私有数组类字段的公有 (或受保护的)方法。如果数组类字段

是完全引用,则不会触发规则。因此,如果字段声明是 "int[][] array;",那么 "return array[3];" 会匹配规则,但 "return array[3][4];" 不会。

ReturnStatement rs: enclosingFunction is [public or protected] and

expression.location is [FieldAccess: field is

[private or package or ( protected and rs.enclosingFunction.public)] and

field.type.arrayDimensions > arrayIndices.length]

验证自定义规则通过在简单的测试代码中验证并确定您的规则可以得到希望的结果,您可以在将规则包应用到较大

代码库以前及时发现规则中的行为错误。一旦规则通过本节中的测试,请使用相似的方法在代码库

中对其进行测试。

本小节包含以下主题:

• 验证自定义规则包

• 自定义规则包的疑难解答

Audit Workbench 用户指南 111

Page 118: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

验证自定义规则包创建简单的测试代码来验证您所编写的规则,并将新的自定义规则保存到测试规则包中。使用 Fortify SCA 仅根据您新的自定义规则来扫描测试代码。

注意: 验证规则时,通过选择 Options (选项) - Show Hidden (显示隐藏)、 Show Removed(显示删除) 和 Show Suppressed (显示废除)来显示所有问题。

使用新的自定义规则进行扫描

本节介绍了如何仅使用测试自定义规则包来扫描项目。确保测试自定义规则包中仅包含您希望测试的

规则。

在验证一个清晰的规则时,首先使用 安全编码规则包扫描项目,然后使用自定义规则包和安全编码

规则包再扫描一次。在使用某个函数且问题已被删除的上下文中验证规则是否与该函数匹配。

使用新的自定义规则扫描源代码:

1. 创建简单的源文件,其中的代码与其文件夹中的规则匹配。

2. 打开 Audit Workbench,单击 Advanced Scan (高级扫描)。

屏幕上会显示 Browse for Root Directory (浏览根目录)窗口。

3. 选择包含您源文件的文件夹,然后单击 OK (确定)。

屏幕上会显示 Commandline Builder (命令行构建器) 对话框。

4. 如果是 Java 项目,选择根文件夹,然后单击 Classpath Directory (类路径目录)。

5. 单击 Next (下一步)。

Commandline Builder: Stages of Fortify SCA Analysis (命令行构建器:Fortify SCA Analysis 操作步骤)窗口会显示在屏幕上。

6. 单击 Manage Rulepacks (管理规则包)。

7. 如果未安装测试自定义规则包,单击 Add Custom Rulepack (添加自定义规则包),然后安装

规则包。

8. 清除所有安全编码规则包并自定义规则包(测试包除外)。

注意: 在测试清晰的规则时,使用安全编码规则包和自定义规则包进行扫描。

9. 单击 OK (确定)。

10. 单击 Run Scan (运行扫描)。

FPR 文件会显示在 “Audit (审计)”窗口中。

验证函数是否与规则匹配

Fortify SCA 将规则与函数一一匹配。利用这些说明来确保规则能够匹配所有您希望匹配的函数,即

便是规则类型可能从结果中删除了问题。

以下规则类型可能不会产生问题:

• Cleanse or validation rules: 删除经由函数的数据中的感染标识。

• Source rules: 为从该函数返回的数据添加一个或多个感染标识。这些规则可能/不可能产生问题。

• Sink rules: 将带有特定感染标识的数据到达函数的情况识别为问题。

112 Audit Workbench 用户指南

Page 119: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

查看匹配函数的规则:

1. 在函数面板中中,选择 Show All (显示全部)和 Group by function (按函数分组)。

屏幕上会显示源代码中的所有函数。

2. 验证规则是否正确匹配了函数:

a. 右键单击函数,然后选择 Show Matched Rules (显示匹配的规则)。

屏幕上会显示 “Matched Rules (匹配的规则)”窗口。它会显示匹配该函数的所有规则。

b. 定位测试中的自定义规则的规则 ID。

c. 单击 OK (确定)以关闭窗口。

d. 对规则所需匹配的每一个函数执行同样的操作。

3. 要查看函数使用的位置,右键单击函数,然后选择 Find Usages (查找使用)。

“Search Results (搜索结果)”选项卡会显示该函数的位置列表。其中包括文件的路径和函数

使用的代码行数。

注意: 这是验证清晰规则仅匹配所需函数的 准确的方式。

4. 单击函数的位置以在代码导航面板中显示该函数。

列出规则报告的各个问题

这部分说明介绍了如何查找和验证与特定规则相匹配的问题。

查找匹配某一规则的所有问题:

1. 在 “Issue (问题)”面板中,单击 All (全部)选项卡。

2. 在 “Group by (分组方式)”中,选择 New Issue (新问题)。

屏幕上会显示新问题列表。

3. 选择所需问题,然后单击 Details (详细信息)选项卡。

4. 滚动至末尾,然后复制规则 ID。

5. 在 Search (搜索)字段中,输入 ruleid: 然后随后立即粘贴规则 ID。

例如: ruleid:97B9518A-F1BC-44CE-BEB1-D5FBDDFCCF9D

6. 按 Enter 键。

屏幕上会显示所有与搜索标准相匹配的问题。

7. 验证规则是否报告了您所需要的问题的类型和数目。

列出从扫描中删除的问题

发现在扫描之间删除问题的规则并非易事。这部分的说明介绍了如何显示所有在扫描之间删除的问

题。要显示要删除的项,您需要首先使用安全编码规则包扫描代码,然后再使用安全编码规则包和

自定义的规则包 (包含验证规则)扫描相同的代码库。

查找删除的问题:

1. 在 “Issue (问题)”面板中,单击 All (全部)选项卡。

2. 在 “Group by (分组方式)”中,选择 Removed Issues (删除问题)。

屏幕上会显示此扫描和 后一个扫描之间的问题列表。有关规则匹配的更多信息,请参见第 112 页中的 “验证函数是否与规则匹配”。

Audit Workbench 用户指南 113

Page 120: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

自定义规则包的疑难解答本节介绍了编写自定义规则时会发生的问题:

• 扫描时报告的语法错误

• 预期的问题未显示

扫描时报告的语法错误

如果以下错误发生在您通过新规则运行扫描的过程中,在“XML View (XML 视图)”中打开规则,

并验证规则的每一个元素信息是否完整。

错误表示规则的格式无效。

[1380] Rule "11F48876-58A8-4A48-8D78-C52E9295DC7E": 语法错误。

检查扫描错误和警告:

1. 选择 Tools (工具) - Project Summary (项目汇总)。

2. 在 Project Summary (项目汇总)面板中,单击 Analysis Information (分析信息)选项卡。

3. 单击 Warnings (警告)选项卡。

屏幕上会显示扫描警告和错误。

预期的问题未显示

自定义规则可能不匹配,原因如下:

• 函数或方法、类和包或命名空间的类型与函数在代码中的使用方式不匹配,具体信息请参见第 112 页中的 “验证函数是否与规则匹配”。

• 由源规则添加的 TAINT 标识与 sink 规则中的 TAINT 标识条件不匹配。

• TAINT 标识被 pass-through 规则意外删除。

• 匹配这个问题的可见性过滤器。选择 Options (选项) - Show Hidden Issues (显示隐藏问

题)。在 “All (全部)”选项卡中,选择 “Group by <none> (任意分组)”,右键单击该问

题,然后选择 Why is this issue hidden? (这个问题为何隐藏?)“Filters (过滤器)”选项卡

上会突出显示“Visibility Filter (可见性过滤器)”。

114 Audit Workbench 用户指南

Page 121: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

第 8 章:故障排除与支持 本节包含以下主题:

• 故障排除

• 报告错误和请求增强功能

故障排除本节将提供以下故障排除信息:

• 利用日志文件进行故障排除

• org.eclipse.swt.SWTError 错误消息

• 内存不足错误

• 重置默认视图

利用日志文件进行故障排除如果遇到运行时错误,请查看日志文件以获取相关信息。

有关 Fortify 的错误,请参见:

<fortify_data_directory>/awb/log/awb.log

有关 Eclipse 的错误,请参见:

<fortify_data_directory>/awb/.metadata/.log

其中:

• 在 Unix 平台上, <fortify_data_directory> 是指目录 ~/.fortify

• 在 Windows 平台上, <fortify_data_directory> 是指 Documents and Settings 下特定用

户目录下的 Local Settings/Application Data/Fortify

org.eclipse.swt.SWTError 错误消息

在 Unix 系统上, Audit Workbench 可能无法启动,并会显示下列错误:

org.eclipse.swt.SWTError: No more handles [gtk_init_check() failed]

如果看到这个错误,则请确保 X11 的配置正确无误,而且已经设置了 DISPLAY 变量。

内存不足错误如果遇到内存不足的错误,而且您使用的不是 Macintosh OS X 平台,请设置 AWB_VM_OPTS 环境

变量来配置更大的堆大小。

例如,要为 Audit Workbench 分配 700 MB,则将该变量设置为 -Xmx700M。当指定该选项时,确保

您分配的内存未超过可用的物理内存,因为这样会降低效能。

作为一项指导原则,假设没有执行其它内存密集型进程,分配的内存不应超过系统可用内存的 2/3。

如果您使用的是 Macintosh OS X,请编辑下列文件,将 -Xmx500m 参数改为 -Xmx700m 或更高:

<install_directory>/Auditworkbench.app/contents/MacOS/eclipse.ini

Audit Workbench 用户指南 115

Page 122: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

如果超过 JVM 在以下平台上强制执行的限制,则 Audit Workbench 可能无法加载,并显示错误:

JVM terminated.Exit code=1。

• Linux 2.4 - 1800 MB

• Linux 2.6 - 2650 MB

• Windows 2000 - 1500 MB

• Windows 2003 - 1500 MB

• Windows XP - 1250 MB

• Mac OS X - 1800 MB

• AIX 5.2 - 无限制

• Solaris 8 - 1800 MB

重置默认视图如果您曾经关闭或者移动过面板,如“Issues (问题)”面板或 “Summary (摘要)”面板,则您

可以在 Options (选项)菜单中选择 Reset Default Views (重置默认视图),即可将用户界面重

置回原始的默认状态。

报告错误和请求增强功能用户反馈在产品的成功过程中必不可少。要请求增强功能、补丁,或者报告错误,请发送电子邮件到

技术支持中心:

[email protected]

请务必在电子邮件主体中包含下列信息:

• 产品:Audit Workbench

• 版本号:要确定版本号,请在 Audit Workbench 界面上选择 Help (帮助) - About Audit Workbench (关于 Audit Workbench)。

• 平台:(例如 PC)

• 操作系统:(例如 Windows 2000)

当请求增强功能时,请包含有关增强功能的描述。

当报告错误时,请提供足够的详细信息,以便 大限度地重现该问题。您描述得越详细,技术支持

就能越快地分析并修复该问题。同时要包含从发生该问题时开始记录的日志文件 (或其中的相关

部分),以及您对该问题严重程度的评价:

• 阻断性的

• 致命性的

• 重大的

• 一般的

• 次要的

• 轻微的

116 Audit Workbench 用户指南

Page 123: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

索引

符号“Analysis Trace (分析跟踪)”面板

描述 7“Details (详细信息)”面板 13“Diagram (图示)”面板 13“Entry Pts (入口点)”列表 6“Group By (分组方式)”选项 38“Hot (严重)”列表 6“Info (信息)”列表 6“Issues (问题)”面板 5“Issues (问题)”视图

自定义 35“Merge Audits (合并审计)”选项 36“Removed (已删除)”列表 6“Search (搜索)”字段 7“Source Code Viewer (源代码查看器)”面板 10“Summary (摘要)”面板 12“Suppressed (已废除)”列表 6“Warning (警告)”列表 6AAudit Workbench

概述 3界面 5

BBuild ID, 设置 19被感染数据流的方向 7编写

规则 10C参考信息 13查看

分析结果 38函数列表 13结果认证 9

查找函数 10

创建问题 41自定义清除规则 37

从新的 SCA 分析中导入 37从新的结果文件进行更新 37D打开

项目 23代码显示 10导航

分析结果 38问题 7

导航树 7定位

函数文件 11对问题的解释 13

FFile Bug (文件 Bug) 12FPR

打开 23规则包 21

废除 12分析结果

查看 38导航 38指定 12

分组函数 10

G管理

规则包 21关于

Analysis Trace (分析跟踪) 7Audit Workbench 3Audit Workbench 界面 5结果认证 9问题列表 6“Details (详细信息)”面板 13“Diagram (图示)”面板 13“Issues (问题)”面板 5“Source Code Viewer (源代码查看器)”面板 10“Summary (摘要)”面板 12

规则编写 10建议 12描述 12详细信息 12

规则 ID标识规则 13

H函数

定位项目文件 11分组 10搜索 10图标类型 10未使用的 10显示 10

合并审计 36IID

问题 12JJava

版本 21类路径 21

加载FPR 23

建议 12将审计数据从 4.0 迁移到 4.5 37结果认证

查看 9

Audit Workbench 用户指南 117

Page 124: Audit Workbench...Fortify 是 Fortify Software, Inc. 的注册商标。 本文档中的品牌和产品名称是其各自所有者的商标。Audit Workbench 用户指南 iii 目录

L列出

函数 10, 13Mmigrate_audit_data 工具 37面板

Analysis Trace (分析跟踪) 7Diagram (图示) 13Issues (问题) 5Source Code Viewer (源代码查看器) 10Summary (摘要) 12详细信息 13

描述规则 12

Q清除规则

创建 37SSCA Confidence (SCA 可信度)

问题 13扫描

Build ID 19高级 19规则包 21Java 项目 19简单 19

设置Java 版本 21类路径 21自定义标签 12

审计废除 12合并 36注释 12

审计数据迁移 37

实例 ID标识问题 13

数据流感染方向 7图示 13图示图标 8, 14

搜索函数 10问题 7

Uupdatefpr.jar 工具 37W问题

创建 41废除 12分析 12分组 38规则 ID 13

ID 12建议 13解释 13SCA Confidence (SCA 可信度) 13实例 ID 13搜索 7提示 13文件 12显示在导航树中 7修复 12在“Source Code Viewer(源代码查看器)”中显示

10注释 12

问题分析 12问题分组 38问题列表 6X显示

函数 10未使用的函数 10问题 7

向导扫描 Java 19扫描 , Build ID 19扫描项目 19

项目打开 23规则包 21函数列表 10Java 版本 21类路径 21

详细信息规则 12

修复问题 12

选择 SCA 分析文件 37Y严重类别 6用于标识问题的提示 13Z针对问题的建议 13正在创建

FPR, 新 19指定

分析结果 12严重性 6

注释 , 问题 12自定义

“Issues (问题)”视图 35自定义标签 12

118 Audit Workbench 用户指南