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 优缺点分析

优点

  1. 代码逻辑清晰,便于理解和拓展
  2. 支持多种扫描方式,特别是API调用便于持续集成

缺点

  1. 项目已停止维护,规则更新停留在三年前
  2. 仅支持PHP的语义分析,其他语言仅正则匹配
  3. 误报率和漏报率较高

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 优缺点分析

优点

  1. 项目持续维护中
  2. 比Cobra更优的AST语义分析
  3. 代码逻辑清晰便于拓展

缺点

  1. 主要支持PHP和JavaScript,不支持Java
  2. 误报率和漏报率仍较高

2.3 Hades

2.3.1 工具介绍

  • 默安开源的Java源码白盒审计系统
  • 使用smali字节码的虚拟解释执行引擎分析Java源码

2.3.2 技术原理

  1. 将Java源码编译为smali字节码
  2. 基于寄存器指令系统进行解释执行
  3. 相比JVM基于栈的虚拟机更简单高效

2.3.3 安装部署

docker build -t hades .
docker run -p 8088:8088 hades

2.3.4 优缺点分析

优点

  1. 技术思路新颖,值得深入研究

缺点

  1. 部署存在bug,难以本地搭建
  2. 仅支持Java语言

2.4 Fortify

2.4.1 工具介绍

  • 商业级SAST工具
  • 支持27+种开发语言
  • 提供丰富的漏洞检测规则

2.4.2 技术原理

  1. Translation阶段:将各种语言源码转为统一中间语言
  2. Analysis阶段:对中间表现形式进行安全性分析

2.4.3 优缺点分析

优点

  1. 误报率和漏报率表现良好
  2. 检出漏洞类型丰富

缺点

  1. 不支持第三方不安全组件检测
  2. 持续集成需要定制开发

2.5 Checkmarx

2.5.1 工具介绍

  • 以色列Checkmarx公司开发的商业SAST解决方案
  • 支持25+种开发语言
  • 可集成到软件开发全生命周期

2.5.2 技术原理

  1. 构建代码元素和流程的逻辑图
  2. 使用预配置查询或自定义规则查询逻辑图
  3. 支持数据流和控制流分析

2.5.3 优缺点分析

优点

  1. 对CI集成友好,支持多种集成方式
  2. 提供接口可进行定制开发
  3. Web界面操作简单

缺点

  1. 依赖机器配置
  2. 默认规则实用性差,定制复杂
  3. 不支持前后端分离项目分析

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 优缺点分析

优点

  1. 开源便于定制开发
  2. 支持自定义规则
  3. CI集成支持良好

缺点

  1. 偏重代码质量,安全检测效果一般
  2. 对Java支持优于PHP
  3. 部分功能移至商业版

2.7 CodeQL

2.7.1 工具介绍

  • GitHub推出的静态代码分析引擎
  • 使用QL语言对代码进行查询分析
  • 支持多种语言(除PHP外)

2.7.2 技术原理

  1. 使用AST解析器将代码解析为结构化数据存储到CodeDB
  2. 通过QL语言定义污点追踪漏洞模型
  3. 高效查询CodeDB中的AST元数据

2.7.3 安装部署

  1. 下载CodeQL CLI(https://github.com/github/codeql-cli-binaries/releases)
  2. 安装VSCode和CodeQL插件
  3. 下载规则文件(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 优缺点分析

优点

  1. 支持数据流与控制流分析
  2. QL规则开源且正在迭代
  3. 可以深入Jar包扫描

缺点

  1. 不允许企业集成至CI/CD流程
  2. 不支持运行时动态绑定方法分析
  3. 不支持Resource文件扫描

3. OWASP Benchmark计分器使用

3.1 安装部署

  1. 下载Benchmark(https://github.com/OWASP/Benchmark/releases)
  2. 将扫描结果导出为特定格式报告
  3. 构建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 工具选型建议

  1. 开源项目

    • 主要支持PHP:KunLun-M
    • 主要支持Java:Hades(如能解决部署问题)
    • 多语言支持:SonarQube + 安全插件
  2. 商业产品

    • 企业级全面解决方案:Fortify、Checkmarx
    • 深度代码分析:CodeQL(适合研究用途)

4.2 实施建议

  1. 结合项目主要使用语言选择工具
  2. 考虑与现有CI/CD流程的集成需求
  3. 对于关键项目,建议组合使用多种工具
  4. 定期更新规则库以应对新出现漏洞
  5. 对扫描结果进行人工验证以减少误报

4.3 未来发展方向

  1. 结合AI技术提高分析准确性
  2. 增强对前后端分离项目的支持
  3. 改进对现代框架(如Vue、React)的分析能力
  4. 加强软件成分分析(SCA)功能
静态应用程序安全测试(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 安装部署 2.1.4 使用示例 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 安装部署 2.2.4 使用示例 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 安装部署 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 安装部署 2.6.4 使用示例 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 使用示例 2.7.5 优缺点分析 优点 : 支持数据流与控制流分析 QL规则开源且正在迭代 可以深入Jar包扫描 缺点 : 不允许企业集成至CI/CD流程 不支持运行时动态绑定方法分析 不支持Resource文件扫描 3. OWASP Benchmark计分器使用 3.1 安装部署 下载Benchmark(https://github.com/OWASP/Benchmark/releases) 将扫描结果导出为特定格式报告 构建Docker镜像: 3.2 生成计分卡 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)功能