SAST(静态应用程序安全测试&代码审计)方案调研
字数 3129 2025-08-22 18:37:21
静态应用程序安全测试(SAST)方案调研与教学文档
1. SAST基础概念
1.1 SAST简介
SAST(Static Application Security Testing)即静态应用程序安全测试技术,是一种在编码阶段分析应用程序源代码或二进制文件的技术。它通过分析代码的语法、结构、过程、接口等来发现潜在的安全漏洞。
1.2 SAST技术发展阶段
SAST技术经历了以下几个发展阶段:
| 技术发展阶段 | 代表工具 | 优点 | 缺点 |
|---|---|---|---|
| 基于正则-关键字匹配的方案 | Seay、Rips免费版 | 实现简单,高覆盖(Seay)或高可用性(Rips) | 误报率和漏报率高,维护成本大 |
| 基于AST(抽象语法树)的方案 | Cobra、Kunlun-M | 在编译处分析代码,不依赖开发习惯 | 无法完美处理所有AST结构,忽略分支/跳转/循环条件 |
| 基于IR/CFG统一数据结构的方案 | Fortify、Checkmarx、Coverity | 带有控制流,专注于Source到Sink过程 | 需要构造中间表示,实现复杂 |
| 基于QL的方案 | CodeQL | 将流环节具象化,通过构造QL语言查找满足条件的节点 | 学习曲线较陡,需要编写查询语句 |
2. 主流SAST工具调研
2.1 Cobra
2.1.1 工具介绍
- 支持十多种开发语言及文件类型扫描
- 支持数十种漏洞类型
- 扫描方式:命令行、界面、API三种
2.1.2 技术原理
- 特征明显的漏洞使用正则匹配
- 复杂漏洞通过Lex/Yacc将代码解析为AST(目前仅PHP支持AST分析)
- 分析危害函数入参是否可控
2.1.3 安装部署
# 基于Docker的安装过程
docker pull centos:centos7
docker run -itd --name code_audit_test centos:7
docker exec -it 容器ID bash
# 升级Python并安装依赖
yum install flex bison phantomjs
git clone https://github.com/WhaleShark-Team/cobra.git
cd cobra
python -m pip install -r requirements.txt
2.1.4 使用示例
python cobra.py -t /tmp/source_code_scan/DVWA-master -f json -o /tmp/report.json
2.1.5 优缺点分析
优点:
- 代码逻辑清晰,便于理解和拓展
- 支持多种扫描方式,特别是API调用便于持续集成
缺点:
- 项目已停止维护,规则更新停留在三年前
- 仅支持PHP的语义分析,其他语言仅正则匹配
- 误报率和漏报率较高
2.2 KunLun-M(昆仑镜)
2.2.1 工具介绍
- 在Cobra基础上深度重构AST回溯部分
- 定位白帽子自用,侧重低误报率
- 引入Tamper概念解决自实现过滤函数
- 使用Python3异步逻辑优化扫描流程
2.2.2 技术原理
- 重构了PHP语法分析逻辑
- 使用SQLite作为数据库存储扫描结果
- 提供Console模式便于使用
2.2.3 安装部署
# 升级SQLite3
wget https://www.sqlite.org/2019/sqlite-autoconf-3270200.tar.gz
tar -zxvf sqlite-autoconf-3270200.tar.gz
./configure --prefix=/usr/local
make && make install
# 安装KunLun-M
git clone https://github.com/LoRexxar/Kunlun-M
pip install -r requirements.txt
cp Kunlun_M/settings.py.bak Kunlun_M/settings.py
python kunlun.py init initialize
2.2.4 使用示例
# 进入console模式
python kunlun.py console
# 扫描源代码
scan
set target /tmp/source_code/DVWA-master/
run
# 查看结果
showt
load 1
show vuls
2.2.5 优缺点分析
优点:
- 项目持续维护中
- 比Cobra更优的AST语义分析
- 代码逻辑清晰便于拓展
缺点:
- 主要支持PHP和JavaScript,不支持Java
- 误报率和漏报率仍较高
2.3 Hades
2.3.1 工具介绍
- 默安开源的Java源码白盒审计系统
- 使用smali字节码的虚拟解释执行引擎分析Java源码
2.3.2 技术原理
- 将Java源码编译为smali字节码
- 基于寄存器指令系统进行解释执行
- 相比JVM基于栈的虚拟机更简单高效
2.3.3 安装部署
docker build -t hades .
docker run -p 8088:8088 hades
2.3.4 优缺点分析
优点:
- 技术思路新颖,值得深入研究
缺点:
- 部署存在bug,难以本地搭建
- 仅支持Java语言
2.4 Fortify
2.4.1 工具介绍
- 商业级SAST工具
- 支持27+种开发语言
- 提供丰富的漏洞检测规则
2.4.2 技术原理
- Translation阶段:将各种语言源码转为统一中间语言
- Analysis阶段:对中间表现形式进行安全性分析
2.4.3 优缺点分析
优点:
- 误报率和漏报率表现良好
- 检出漏洞类型丰富
缺点:
- 不支持第三方不安全组件检测
- 持续集成需要定制开发
2.5 Checkmarx
2.5.1 工具介绍
- 以色列Checkmarx公司开发的商业SAST解决方案
- 支持25+种开发语言
- 可集成到软件开发全生命周期
2.5.2 技术原理
- 构建代码元素和流程的逻辑图
- 使用预配置查询或自定义规则查询逻辑图
- 支持数据流和控制流分析
2.5.3 优缺点分析
优点:
- 对CI集成友好,支持多种集成方式
- 提供接口可进行定制开发
- Web界面操作简单
缺点:
- 依赖机器配置
- 默认规则实用性差,定制复杂
- 不支持前后端分离项目分析
2.6 SonarQube
2.6.1 工具介绍
- 开源代码质量分析平台
- 社区版支持15种语言
- 可集成Dependency-Check和SpotBugs增强安全检测
2.6.2 技术原理
- 基于AST抽象语法树分析
- 通过插件扩展功能(Dependency-Check用于组件漏洞检测,SpotBugs用于代码漏洞检测)
2.6.3 安装部署
# Docker部署
docker network create --subnet 172.41.0.0/16 --driver bridge sonarnet
docker pull sonarqube:8.8-community
docker run --name sonarqube --net=sonarnet --restart always -p 9000:9000 -v /sonarqube/data:/opt/sonarqube/data -v /sonarqube/extensions:/opt/sonarqube/extensions -v /sonarqube/logs:/opt/sonarqube/logs -d sonarqube:8.8-community
2.6.4 使用示例
# PHP项目扫描
/home/sonar-scanner-4.6.0.2311-linux/bin/sonar-scanner \
-Dsonar.projectKey=Dvwa-Scan \
-Dsonar.sources=. \
-Dsonar.host.url=http://10.0.3.158:9000 \
-Dsonar.login=f3111c1b761d376c5091d5cf674390efdd41df09
# Java项目扫描(Maven)
mvn sonar:sonar \
-Dsonar.projectKey=benchmark_findbugs_scan \
-Dsonar.java.binaries=target/classes \
-Dsonar.host.url=http://10.0.3.158:9000 \
-Dsonar.login=27a9b110822fcfd1828d8ac0f1a07c6b857d331a
2.6.5 优缺点分析
优点:
- 开源便于定制开发
- 支持自定义规则
- CI集成支持良好
缺点:
- 偏重代码质量,安全检测效果一般
- 对Java支持优于PHP
- 部分功能移至商业版
2.7 CodeQL
2.7.1 工具介绍
- GitHub推出的静态代码分析引擎
- 使用QL语言对代码进行查询分析
- 支持多种语言(除PHP外)
2.7.2 技术原理
- 使用AST解析器将代码解析为结构化数据存储到CodeDB
- 通过QL语言定义污点追踪漏洞模型
- 高效查询CodeDB中的AST元数据
2.7.3 安装部署
- 下载CodeQL CLI(https://github.com/github/codeql-cli-binaries/releases)
- 安装VSCode和CodeQL插件
- 下载规则文件(https://github.com/github/codeql)
2.7.4 使用示例
# 创建数据库
/home/codeql_test/codeql/codeql database create java-kylin-test --language=java
# 打包数据库
/home/codeql_test/codeql/codeql database bundle -o java-kylin-test.zip java-kylin-test
2.7.5 优缺点分析
优点:
- 支持数据流与控制流分析
- QL规则开源且正在迭代
- 可以深入Jar包扫描
缺点:
- 不允许企业集成至CI/CD流程
- 不支持运行时动态绑定方法分析
- 不支持Resource文件扫描
3. OWASP Benchmark计分器使用
3.1 安装部署
- 下载Benchmark(https://github.com/OWASP/Benchmark/releases)
- 将扫描结果导出为特定格式报告
- 构建Docker镜像:
docker build -t benchmark .
3.2 生成计分卡
docker container run -it benchmark1:latest /bin/bash
./createScorecards.sh
3.3 计分指标说明
- TP(True Positive):正确检出的真实漏洞
- FN(False Negative):漏报的真实漏洞
- TN(True Negative):正确忽略的假漏洞
- FP(False Positive):误报为真漏洞的假漏洞
- TPR(True Positive Rate):TP/(TP+FN)
- FPR(False Positive Rate):FP/(FP+TN)
- Score = TPR - FPR
4. 总结与建议
4.1 工具选型建议
-
开源项目:
- 主要支持PHP:KunLun-M
- 主要支持Java:Hades(如能解决部署问题)
- 多语言支持:SonarQube + 安全插件
-
商业产品:
- 企业级全面解决方案:Fortify、Checkmarx
- 深度代码分析:CodeQL(适合研究用途)
4.2 实施建议
- 结合项目主要使用语言选择工具
- 考虑与现有CI/CD流程的集成需求
- 对于关键项目,建议组合使用多种工具
- 定期更新规则库以应对新出现漏洞
- 对扫描结果进行人工验证以减少误报
4.3 未来发展方向
- 结合AI技术提高分析准确性
- 增强对前后端分离项目的支持
- 改进对现代框架(如Vue、React)的分析能力
- 加强软件成分分析(SCA)功能