本节主要介绍在Java代码审计过程中常用的5种工具的安装和使用方法,包括Java集成开发环境IntelliJ IDEA,以及Java半自动化代码审计工具SpotBugs、Fortify、CodeQL、Semgrep。
IntelliJ IDEA(简称IDEA)是Java编程语言的集成开发环境。IntelliJ IDEA在业界被广泛认为非常好用,尤其在智能代码助手、代码自动提示、代码分析、重构、JavaEE支持,以及集成各类版本控制系统等方面表现出色。
接下来介绍IntelliJ IDEA的使用,首先访问IntelliJ IDEA官网。IntelliJ IDEA官网下载页面如图1-51所示。IntelliJ IDEA有两个版本:Ultimate版本和Community版本。根据操作系统版本下载对应的IntelliJ IDEA程序。Ultimate版本只能免费试用30天,30天后须购买才能继续使用;Community版本可以免费试用。Ultimate版本适用于Web和企业开发,Community版本适用于JVM和Android开发。
图1-51 IntelliJ IDEA官网下载页面
这里下载免费的Community版本,待下载完成后运行IntelliJ IDEA Community安装程序,安装程序主界面如图1-52所示。
图1-52 IntelliJ IDEA Community安装程序主界面
根据自身需求安装IntelliJ IDEA Community,安装完成后运行IntelliJ IDEA Community程序,出现Welcome to IntelliJ IDEA界面,如图1-53所示。
图1-53 Welcome to IntelliJ IDEA界面
如图1-54所示,单击New Project按钮,再在New Project界面选择JDK安装路径,单击Create按钮即可新建一个IDEA项目。
图1-54 新建IDEA项目
接下来,将在IDEA中开发一个Java程序。如图1-55所示,右击src,在src下新建一个Package(包),Package命名为com.test。
图1-55 新建包
如图1-56所示,右击test,新建一个Test类。
图1-56 包下新建类
如图1-57所示,在Test类中编写一个输出“Hello World!”的主函数。
图1-57 在Test类中编写主函数
代码编写完成后,单击Run 'Test.java',IDEA运行Test.java并输出结果,如图1-58所示。
图1-58 运行主函数并输出结果
SpotBugs是一款通过静态分析查找Java代码中存在的安全问题的工具,它是FindBugs的继承者。FindBugs是一款优秀的Java代码审计工具,但FindBugs在2016年后就已经停止更新。SpotBugs需要JDK 1.8.0或更高版本才能运行。在SpotBugs中,存在着十余种用于检测代码安全问题的检测器。
接下来介绍SpotBugs的使用。SpotBugs可通过IDEA插件方式安装,在IDEA中,选择File菜单,如图1-59所示。
图1-59 选择File菜单
在图1-59中选择Settings选项,IDEA中会出现插件安装界面,该界面如图1-60所示。
图1-60 插件安装界面
在插件搜索框中搜索“SpotBugs”,搜索结果如图1-61所示,单击Install按钮即可安装SpotBugs插件。
图1-61 搜索SpotBugs插件的结果
待SpotBugs插件安装完成后,需对SpotBugs插件进行配置,选择Tools下的SpotBugs选项,如图1-62所示。
图1-62 配置SpotBugs插件
如图1-63所示,单击Plugins插件栏的加号按钮,选择Add Find Security Bugs选项添加SpotBugs插件。
图1-63 添加SpotBugs插件
选择图1-63中的Detector选项卡,进入Detector配置界面(如图1-64所示),选择Bug Category选项,选中Malicious code vulnerability和Security复选框。
图1-64 Detector配置界面
接下来选择Report选项卡,进入Report配置界面(如图1-65所示),在该界面仍然选中Malicious code vulnerability和Security复选框。
图1-65 Report配置界面
选择完成后,单击Apply按钮即可将SpotBugs插件配置完成,如图1-66所示。
图1-66 SpotBugs插件配置完成
配置完成后,右击需审计的Java项目目录,在弹出的快捷菜单中选择Analyze Project Files Including Test Sources选项,等待插件运行完成,如图1-67所示。
图1-67 运行SpotBugs插件
插件运行完成后,在IDEA的SpotBugs栏将出现安全扫描报告(如图1-68所示),单击报告即可查看存在安全问题的代码位置。
图1-68 安全扫描报告
Fortify是Micro Focus公司旗下的一款静态白盒代码审计工具,Fortify先通过内置的五大主要分析引擎,即数据流、语义、结构、控制流、配置流对应用软件源码进行静态的安全分析,然后通过自带安全漏洞规则集对源码进行安全问题匹配、查找,并将源码中可能存在的安全问题扫描出来。Fortify支持导出报告。
接下来介绍Fortify的使用。Fortify官网下载界面如图1-69所示,下载后可以免费试用15天。
图1-69 Fortify官网下载界面
Fortify安装完成后,进入它的目录(如图1-70所示),找到并运行auditworkbench.cmd文件即可启动Fortify。
图1-70 Fortify目录
Fortify启动后,其主界面如图1-71所示,单击Scan Java Project,即可对Java项目进行代码审计。
图1-71 Fortify主界面
在如图1-72所示的界面中,选择一个Java项目文件夹。
图1-72 选择Java项目文件夹
待Java文件夹选择完毕后,界面中会出现Java源码版本选择框,选择Java源码版本后单击OK按钮,如图1-73所示。
图1-73 选择Java源码版本
进入Audit Guide Wizard界面,在该界面根据Java项目实际情况选择相关选项后,单击Scan按钮即可开始对Java项目进行代码审计,如图1-74所示。
图1-74 根据Java项目实际情况选择相关选项
等待Java代码审计完成后,界面中将出现Java项目存在的安全问题,如图1-75所示。
图1-75 Java项目存在的安全问题
选择一个安全问题,Fortify界面将展示漏洞位置及漏洞触发过程,如图1-76所示。
图1-76 展示漏洞位置及漏洞触发过程
CodeQL是一款支持Go、Java、JavaScript、Python、Ruby、C/C++等编程语言的静态代码分析工具,研究人员可通过使用CodeQL自带的QL语言规则文件进行漏洞检测,也可以自行编写QL语言规则文件进行漏洞检测。
接下来介绍CodeQL的使用,CodeQL下载页面如图1-77所示,可根据操作系统版本选择下载的codeql-cli版本。
图1-77 CodeQL下载页面
创建一个新的文件夹CodeQl,将下载的codeql-cli压缩包文件解压至该文件夹。图1-78为解压后的文件目录。
图1-78 codeql-cli文件目录
如图1-79所示,将CodeQl\codeql添加至环境变量。
图1-79 将CodeQl\codeql添加至环境变量
重启cmd,在cmd中执行codeql,出现图1-80所示的提示代表环境变量添加成功。
图1-80 成功添加环境变量
随后访问图1-81所示的页面,下载CodeQL源文件。
图1-81 CodeQL源文件下载页面
将下载的CodeQL源文件压缩包解压至CodeQl,并重命名为ql,图1-82所示为ql文件目录。
图1-82 ql文件目录
访问图1-83所示的页面,根据操作系统版本下载并安装Visual Studio Code。
图1-83 Visual Studio Code下载页面
安装完成后,启动Visual Studio Code,其主界面如图1-84所示。
图1-84 Visual Studio Code主界面
如图1-85所示,单击扩展按钮
,搜索CodeQL插件并安装。
图1-85 搜索CodeQL插件并安装
安装插件后,单击资源管理器按钮
,在Visual Studio Code中将CodeQL源文件夹打开并导入源文件,如图1-86所示。
图1-86 导入CodeQL源文件
接下来通过codeql-cli创建CodeQL审计数据库,在本案例中,创建的是java-sec-code项目审计数据库,java-sec-code是一个非常适合学习Java漏洞代码的强大且友好的项目。访问图1-87所示的页面,下载java-sec-code项目。
图1-87 java-sec-code项目下载页面
将下载后的java-sec-code压缩包解压,图1-88所示为其文件目录。
图1-88 java-sec-code文件目录
运行cmd命令,执行图1-89所示的代码,进入java-sec-code项目目录。
图1-89 执行代码
执行如下代码,编译java-sec-code项目并创建CodeQL审计数据库,如图1-90所示。
codeql database create java-database -l=java -c="mvn clean install -Dmaven.test.skip=true"
图1-90 创建CodeQL审计数据库
图1-91代表创建CodeQL审计数据库成功。
图1-91 创建CodeQL审计数据库结果
如图1-92所示,在Visual Studio Code中单击CodeQL按钮
,再单击From a folder按钮,导入创建的CodeQL审计数据库。图1-93代表导入CodeQL审计数据库成功。
图1-92 Visual Studio Code导入CodeQL审计数据库
图1-93 Visual Studio Code成功导入CodeQL审计数据库的界面
CodeQL源文件中有自带的Java代码审计规则文件(如图1-94所示),访问ql\java\ql\src\Security\ CWE,访问结果的各个文件夹中存在Java代码审计规则文件。
图1-94 CodeQL源文件中的Java代码审计规则文件
在Visual Studio Code中单击资源管理器按钮,再访问ql\java\ql\src\Security\CWE\CWE-611目录,访问结果如图1-95所示,该文件夹中存在XXE漏洞审计规则文件XXE.ql。
图1-95 访问结果
如图1-96所示,打开XXE.ql文件,右击文件界面,在弹出的快捷菜单中选择CodeQL:Run Query on Selected Database选项,运行XXE.ql文件。
图1-96 运行XXE.ql文件
XXE.ql文件的运行结果如图1-97所示,可以看到,CodeQL审计出java-sec-code项目中存在8个XXE漏洞。
图1-97 XXE.ql文件运行的结果
选择某个XXE漏洞,代码中将高亮显示该漏洞,如图1-98所示。
图1-98 高亮显示XXE漏洞
Semgrep是一款快速、开源的静态代码分析工具,是基于Facebook开源SAST工具pfff中的sgrep组件开发的,它同时支持正则匹配和AST分析两种模式。Semgrep支持C#、Go、Java、JavaScript、PHP、Python、Ruby等20多种语言的静态代码分析。
接下来介绍Semgrep的使用。在Linux操作系统上执行如下代码安装Semgrep模块。
python3 -m pip install semgrep
安装该模块的过程如图1-99所示。
图1-99 Linux操作系统上安装Semgrep模块的过程
待Semgrep模块安装完成后,执行如下命令。
semgrep -h
如果出现如图1-100所示的信息,代表Semgrep模块安装成功。
图1-100 Semgrep模块安装成功
访问图1-101所示的网址,该网站中提供了Semgrep审计规则集。
图1-101 Semgrep审计规则集页面
在图1-102所示的页面将Language选择为Java,将会展示Java语言的314条Semgrep审计规则集。
图1-102 Java语言的Semgrep审计规则集页面
单击图1-103所示页面中的“show all”,将展示所有Semgrep审计规则集合。图1-104所示为寻找到owasp-top-ten规则集合。
图1-103 所有Semgrep审计规则集合页面
图1-104 owasp-top-ten规则集合页面
图1-105所示为获得owasp-top-ten规则集合路径p/owasp-top-ten。
图1-105 owasp-top-ten规则集合路径页面
在本案例中,仍选择java-sec-code项目进行代码审计,在Linux中执行图1-106所示的命令,将java-sec-code项目下载到本地。
图1-106 在Linux系统执行命令
执行图1-107中框起来的命令,通过Semgrep的owasp-top-ten规则集合对java-sec-code项目代码进行安全审计。
图1-107 审计java-sec-code项目
审计结果如图1-108所示,Semgrep标注出java-sec-code项目代码中存在的安全问题。
图1-108 审计java-sec-code项目的结果