1、扫描 Java 项目
“Scan Java Project(扫描 Java 项目)”向导将转换阶段和分析阶段合并为一个简单的步骤。使用此功能可以扫描源那些代码位于单个目录中的小型 Java 项目。
使用步骤 | 详细描述 |
---|---|
扫描新的 Java 项目 | 打开 Audit Workbench。 |
系统会显示开始页面 | 在“New Projects(新项目)”中,单击 Scan Java Project(扫描 Java 项目)。 |
系统会显示 Browse for Folder(浏览文件夹)对话框 | 选择包含所有需要分析的源代码的文件夹,然后单击 OK(确定)。 注意:Fortify SCA 将 Build ID 设为文件夹名称。 |
系统会显示 AuditGuide Wizard(AuditGuide 向导) | 为需要审计的问题类型选择相关设置,然后单击 Run Scan(运行扫描)。 |
如果 Fortify SCA 在扫描源代码时遇到任何问题,即会显示 Warning(警告)对话框 | 单击 OK(确定) 继续。 Fortify SCA 会分析源代码。完成该过程之后,Audit Workbench 会显示 FPR 文件。 |
2、扫描其他项目
您可以使用“Advanced Scan(高级扫描)”向导转换和分析 Java、JavaScript、PHP、ASP、.NET 和 SQL 项目。对于源代码位于多个目录中、具有特殊转换或构建条件,或包含需要从项目中排除的文件的 Java 项目,应使用“Advanced Scan(高级扫描)”向导。
使用步骤 | 详细描述 |
---|---|
扫描新项目 | 打开 Audit Workbench。 |
系统会显示开始页面 | 在“New Projects(新项目)”中,单击 Advanced Scan(高级扫描)。 |
系统会显示 Browse for Folder(浏览文件夹)对话框 | 选择项目所在的根目录,然后单击 OK(确定)。 |
会显示 Commandline Builder(命令行构建器)对话框。该向导会自动包含所有在扫描中支持的文件 | 另外,还可以添加其他目录中的文件: 单击 Add Directory(添加目录)。 |
命令行构建器
系统会显示 Browse to Folder(浏览至文件夹)对话框:
选择包含希望添加进行扫描的文件所在的文件夹。
单击 OK(确定)。
导航面板中将会显示该目录,并会自动添加所有受支持的文件以进行扫描。要删除该目录,右键单击相应的文件夹,然后选择 Remove Root(删除根):
另外,可排除文件或目录,例如测试源代码:
选择所需文件或目录。
右键单击并选择 Exclude(排除)。
该文件夹会变成灰色:
对于 Java 项目,设置以下内容:
选择包含类文件的文件夹,然后单击 Classpath Directory(类路径目录)。
在 Fortify SCA 转换阶段,该文件夹会变成蓝色,且文件会添加到类路径中:
选择项目的 Java 版本。
输入 Build ID。默认情况下,Build ID 为根目录。
输入 Fortify SCA 在分析阶段生成的 FPR 的路径和文件名。
单击 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(管理规则包)以使用自定义规则包分析源代码,或者禁用某个安全编码规则包。系统会显示 AuditGuide Wizard(审计指南向导)。
审计指南向导
为希望进行审计的问题类型选择相关参数,然后单击 Next(下一步)。
单击 Run Scan(运行扫描)。
如果 Fortify SCA 在扫描源代码时遇到任何问题,会显示 Warning(警告) 对话框:
单击 OK(确定)继续。
Audit Workbench 会显示 FPR 文件。
1、导航并查看分析结果
在您打开一个用来查看 Fortify Source Code Analyzer (Fortify SCA) 所检测到的问题的 Audit Workbench 项目之后,您可以在 Summary(摘要)面板中审计这些问题,以反映这些问题的严重级别,以及对该问题执行的安全分析状态。
系统会按审计结果的严重性以及准确性,对审计结果进行分组,并在默认情况下将问题识别为位于“Issues(问题)”面板中的 Hot(严重)列表内。单击 Warning(警告)和 Info(信息),查看分组在这些列表中的问题。
每个列表中的问题数量显示在相关按钮下面。
要检验与 Issues(问题)面板中所列问题相关的代码,选中该问题。源代码部分包含显示在源代码查看器面板中的问题,并在面板的标题中显示文件所包含问题的名称。
2、审计结果分析
本练习将会引导您浏览一下在练习 3 中使用 Fortify SCA 分析小程序产生的结果。请您检查 Fortify SCA 中各种不同分析器所发现的问题,并比较 Fortify SCA 生成的各种不同输出格式。
请考虑 UserServ.java 的内容:
检查语义问题:
下图突出显示了在练习 3 中的 UserServ.java 中检测出来的 password management 问题的各个要素。
唯一识别符:
开头的十六进制数(在此文本中以哈希标记 (#) 代替)是一个全局性唯一识别符,也称为实例识别符。这些识别符以分析器找到问题的路径、漏洞类型以及其他一些不受细小的代码变动影响的因素为基础而计算得出。例如,唯一识别符不依赖于代码行数。除了唯一性,实例识别符还提供了其他十分有价值的功能,它们可以标识出在多次分析中或不同代码版本之间的相同问题,因此可以被用来追踪审计过的问题。
严重性:
因为这个问题可以使得任何具有访问源代码或者字节码权限的人都可以操作数据库,所以 Fortify SCA 把它的严重级别设为 high。
漏洞类别/漏洞子类别:
Password Management 类中的问题都与潜在地不安全使用密码和其他证书有关。在这个例子中,问题归为 Hardcoded Password 子类别,是由于这里用来连接数据库的密码直接出现在了源代码中。
分析器:
问题由 semantic 分析器报告。semantic 分析器以与编译器十分相似的方式、以它定义的语义分析规则来检查代码。有关分析器的更多信息,请查看《Fortify Source Code Analyzer 用户指南》。
文件名/行号:
虽然密码本身出现在 UserServ.java 文件的第 18 行,但问题被报告在第 16 行,因为使用密码的函数在此被调用。
易受攻击的方法:
hardcoded password 被传递给了DriverManager 类中的 getConnection() 方法。
检查数据流问题。
使用下列图示来理解 SQL injection 问题
请注意这里有许多字段和上面的语义问题相同。这些字段的含意在数据流问题(和在下面要讨论的其他类型的问题)中是相同的。在这里,您将更加关注那些没有在语义问题中出现的字段。数据流问题比语义问题更复杂,因为它们牵涉到源代码中的多个地方。这是一个 SQL injection 问题,它发生在攻击者控制的数据被用来构造 SQL 查询时。数据流分析器将会跟踪那些潜在的恶意输入数据,从数据被输入到程序中一直到它被用来作为攻击的一部分。
Sink:
sink 的文件名、行号以及方法名指出了攻击者控制的查询在何处传递到数据库。紧随在行号之后而在类名和方法名之前的右箭头 (->) 指出了被感染的数据流入了 Statement.executeUpdate()。方法名后括号内的数字是这个方法的参数编号。数字 0 表示攻击者可以控制 executeUpdate() 的第一个参数(SQL 查询字符串)。
Pass-Through:
pass through 的文件名、行号以及变量名指出了将受感染的数据传递给 sink 的变量。双向箭头 (<=>) 指出了受感染的数据流入、并且流出该方法的变量 this.query。
Source:
source 的文件名、行号以及方法名指出了攻击者控制的数据第一次进入程序的位置。紧随在行号之后而在类名和方法名之前的左箭头 (<-) 指出 ServletRequest.getParameter() 引入了被感染的数据。方法名后括号中的单词 return 表示是该方法的返回值持有被感染的数据。
检查控制流问题。
使用下列图示来理解 unreleased resource 问题
控制流问题看上去类似于数据流问题,因为它们通常包含多个结点,不同点在于这些结点所代表的操作步骤是不安全的。Control flow 漏洞被表述为一系列状态的转换。
开始状态/结束状态:
第一个状态转换项显示了从start状态到connection状态的转换发生在第16行。第二个状态转换项显示了从connection状态到end_of_scope状态的转换发生在第44行。
转换表达式:
转换表达式紧跟在 start 和 end 状态名称之后。它给出了触发转换的代码构成。从 start 到 connection 的转换由调用 getConnection() 引起。从 connection 到 end_of_scope 的转换由变量 conn 到达其域的终止处引起。
控制流分析器在代码中找到了一个路径,该路径因为没有调用 conn.close() 而导致数据库连接泄漏。虽然 conn.close() 在第 37 行进行了调用,但是由于第 35 行调用 stmt.close()有可能会抛出异常,所以该方法并不能保证对 conn.close()的调用总会执行。
检查第二种结构问题。
考虑以下 member field race condition 问题
虽然结构问题可能只是报告了一行源代码,但是有时候它们会包含一些与程序结构相关的上下文,以便精确地指出错误。在这个问题中,分析器考虑了成员变量在一个继承于 HttpServlet 的类中进行声明的情况。
生成 Fortify Project Results (FPR) 文件
Fortify SCA 不但能够生成可以直接被审计员阅读的输出,也能够生成一个 FPR 文件,此文件可以用 Audit Workbench 或者其他工具进行查看。
再次运行 Fortify SCA,但是这一次生成 FPR 输出。使用 -f 选项将输出发送给 FPR 文件,如下所示:
sourceanalyzer -f results.fpr UserServ.java
默认情况下,Fortify SCA 最多可使用 600 MB 的内存。如果该内存仍不能满足分析某个特定代码库的需要,您可能需要在扫描阶段提供更多的内存。这可以通过在 sourceanalyzer 命令中使用 -Xmx 选项来实现。
例如,要让 Fortify SCA 可用的内存达到 1000 MB ,可在命令中包含 -Xmx1000M 选项。
注意:为 Fortify SCA 分配的内存不应高于计算机本身的可用内存,因为这样会降低性能。指导原则是在没有运行其他内存密集型程序的情况下,分配的内存不能超过 2/3 的可用物理内存。