ML-based-SAST 是一个使用程序切片和BLSTM降低污点传播SAST误报率的工具demo。
.
├── README.md
├── ml # 机器学习模块
│ ├── _theano # BLSTM theano实现版本
│ ├── api.py # API Server
│ ├── console.py # CLI
│ ├── data # 学习用的知识库(包括slice和label)
│ ├── model # BLSTM model
│ ├── preprocessing.py # 数据预处理,包括tokenize
│ ├── settings.py
│ ├── tests # Test case
│ ├── tf # BLSTM tensorflow实现版本
│ └── utils # 用于转换格式
└── report2slice # 切词模块
├── slice # 生成切片文件
├── core # 核心切片和预测模块
├── cli # 切片/预测控制台入口
├── spotbugsGUI # 改造版spotbugsGUI
└── pom.xml
-
ML-based-SAST 依赖于改造后的Joana,因此第一步是使用如下命令构建joana:
# Fetch sources git clone https://github.com/anemone95/joana-mvn cd joana mvn clean install -DskipTests
-
构建切片和预测模块
# Fetch sources git clone https://github.com/Anemone95/MLBasedSAST cd MLBasedSAST/report2slice mvn clean package
-
安装学习模块环境,学习模块依赖如下库
tensorflow==2.0.0 requests==2.22.0 flask==1.1.1 theano==1.0.4 fire==0.2.1
启动一个服务器用来预测,接受slice和label,以及启动一个训练
cd MLBasedSAST/ml
python api.py --model-npz=xxx.npz # run api server
java -jar report2slice/spotbugsGUI/target/spotbugsGUI-1.0-SNAPSHOT.jar
启动后可以看到一个修改版的Spotbugs GUI,首先新建/打开一个project,获取分析结果,该步骤与原版操作过程相同:
点击"AI->Set Server",设置用于预测的服务器:
点击"AI->Slice and Predict",程序会首先分析污点传播结果,对相关Bug进行切片:
切片完成后,程序发送给服务器获取预测结果,可以在左侧看到预测结果。
如果在分析过程中中断,再次slice时会从失败前的最有一步开始,若想重新开始则可以点击“AI->Clean”清除先前数据。
不论是否进行预测,都可以对一个漏洞实例进行标记(但需要先切片),右键漏洞实例即可,标记结果会同时发送给服务器,作为将来学习使用
命令行入口以Spotbugs的xml报告文件作为输入,以json格式输出切片/预测结果。
java -jar report2slice/cli/target/cli-1.0-SNAPSHOT.jar slice -f java-sec-code-1.0.0-spotbugs.xml # 默认切片保存到./slice/{project}文件夹下,可用--output-dir指定输出目录
java -jar report2slice/cli/target/cli-1.0-SNAPSHOT.jar slice -f java-sec-code-1.0.0-spotbugs.xml --server http://127.0.0.1:8888/ # 指定预测用服务器,默认预测结果保存到./predict,可用--output指定输出目录
cd ml
python console.py train --slice-dir=data/slice/benchmark1.2 --label-dir=data/label/benchmark1.2 --epochs=20 # 切片数据文件夹,标记数据文件夹,最大迭代次数