# get_sink **Repository Path**: wangcaicai1/vul-trigger ## Basic Information - **Project Name**: get_sink - **Description**: 自动化定位sink点的整个项目环境和代码, - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-16 - **Last Updated**: 2024-01-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 环境配置过程 #### 需要的文件 ``` 下载这个项目zip到本地,解压后得到对应的文件目录格式,这个项目之后没有目录更改则不会更新 后面 git clone https://gitee.com/wangcaicai1/src.git 获取对应src的项目代码,后面代码会不断更新 git clone https://gitee.com/wangcaicai1/match_-sink.git 获取对应Match_Sink的代码,后面代码会不断更新 ``` ## 创建镜像 `docker pull wangnono000/get_sink:2.0 ` ## 创建docker 容器 ```bash docker run -itd --name=vultrigger_wkx -v /home/wkx/hust_vulTrigger/vul-trigger/for_docker/docker_mapping/Implementation:/home/SySeVR/Implementation -v /home/wkx/hust_vulTrigger/vul-trigger/for_docker/docker_mapping/data:/home/SySeVR/data vultrigger_wkx:1.0 /bin/bash ``` 4. 启动容器`docker start vultrigger_wkx` 5. 加载容器`docker exec -it vultrigger_wkx /bin/bash` 6. 安装提取切片所需要的包 ``` apt-get install python3-tk source /etc/profile ``` `pip2 install openpyxl==2.6.4` --- ## 项目结构说明 - Implementation - source2slice - data - C-Diffs - ffmpeg - CVE-2013-0866 xxxxx.diff(diff文件) - C-Non_Vulnerable_Files - C-Vulnerable_Files - Dependency_Files - ffmpeg - CVE-2013-0866 depenfile_47e462eecc0a47ad40f59376199f93f227e21d13.txt - cfg_db(存放CFG图信息) - pdg_db(存放PDG图信息) - dict_call2cfgNodeID_funcID(存放函数调用图信息) - **gitrepos**(存放待解析项目的源码,仅存放一个版本即可) - ffmpeg_git(示例) - [collect.py](http://collect.py)(将某个软件的源码全部拷贝到joern/testCode中去,在测试时使用) - **results**(存放切片结果) - testCode(存放当前次待解析的源文件) - src(存放代码) - get_cfg_relation.py - complete_PDG.py - access_db_operate.py - extract_df2.py(提取切片) - cv_extract.py(提取data/C-Diff/下diff文件的关键变量,会将所有diff文件的关键变量信息存放到一个txt中) - slice_op2.py - general_op.py - get_depen.py(获取依赖文件,将结果存放到/data/Dependency_Files中) - prepare_work.py(删除前面生成的.joernIndex文件,将依赖文件放入joern中解析并重启neo4j,之后生成CFG、PDG和函数调用图,最后完成切片,结果存放在./result中) - **config.json**(存放代码中需要使用到的路径信息) - all_data.xlsx(漏洞函数和CVE的关系照应,代码中需要根据该文件生成字典) - **pre_data**(存放第一步收集到的切片文件) - **results** 提取切片中间的过程信息 - Match_sink 得到切片后自动化匹配sink点的代码 - match_sink.py 匹配sink点跑这个代码 - 其余各个类型的sink点匹配代码 # 整个流程测试 ### 1. 将第一步收集的漏洞文件放到/home/lxy/CvSys/WholeProject/for_docker/docker_mapping/Implementation/source2slice/pre_data/test目录下。**同一个软件**的可以放入多个CVE批量生成切片 > 注意这里的文件名只能是CVE-ID ### 2. 修改/Implementation/source2slice/config.json文件 绿色框中的软件名用自己要分析的软件替换,比如: "all_diff_path":"./data/C-Diffs/**ffmpeg**/", "all_new_path":"./data/C-Non_Vulnerable_Files/**ffmpeg**/", "all_old_path":"./data/C-Vulnerable_Files/**ffmpeg**/", ### 3. git clone 要分析软件任意一个版本的仓库,将此仓库放到/Implementation/source2slice/gitrepos目录下,将文件名修改成**SOFTWARENAME_git** C-Diffs C-Non_Vulnerable_Files C-Vulnerable_Files Dependency_Files ### 4. 创建对应的软件目录 在/Implementation/source2slice/data目录下这个**四个文件夹内**均要创建对应软件名文件夹 在 /Implementation/source2slice/results也要创建对应的软件名文件夹 准备工作结束! ### 现在开始运行docker镜像 #### 随便在虚拟机那个目录下打开命令行 输入 ```shell docker ps -a ``` 就可以看到当前创建好的docker镜像 79d6f001d98a 是镜像ID sysevr_test 是镜像名 #### 使用start命令启动镜像 ```shell docker start DOCKER-ID # docker start 79d6f001d98a 或者 docker start 镜像名称 ``` #### 使用exec命令启动镜像 ```shell docker exec -it 镜像名称 /bin/bash ``` ##### 现在就已经进入到docker镜像中了,然后我们就去source2slice目录下运行生成切片的脚本 运行脚本之前先**source/etc/profile** 更新一下环境。否则一会会报错说没有安装java **一步到位的方法**使用 python 运行脚本python all_data_test.py SOFTWARENAME ```shell source /etc/profile python all_data_test.py tcpdump ``` 最后就可以在 /Implementation/source2slice/results目录下看到切片啦 并且还可以在/Implementation/source2slice/match_results目录下看到sink匹配结果 > 同一软件的切片可以批量处理,同时处理的数量可以自己把握一下,如果切太多万一中间有那个CVE的切片提取报错的话,就可能要全部重新切片。我一般会批量切5-10个 > 如果生成不了切片怎么办? > 1. 如果有报错自己debug > 2. 没有报错但是results中没有slices.txt。检查一下Implementation/result目录下文件的内容,这里记录的是我们提取切片中间步骤的结果和报错信息。一般造成没有切片的原因:没有提取到关键变量和Joern解析有问题,识别不了漏洞函数 --- #### 分步骤说明 1. 第一步先运行 `python3 cv_extract.py` 这一步会从diff文件中提取出关键变量。提取出的关键变量在 `Implementation/result/step1_result.txt` 中进行记录 2. 第二步运行 `python get_depen.py SOFTWARENAME` 这一步会切换git仓库的版本并且从data.xlsx文件中获取到修改函数名,用joern解析软件git仓库中所有的代码,找到和修改函数有调用关系函数所在的文件(跨三层函数),即为依赖文件`/home/SySeVR/Implementation/source2slice/data/Dependency_Files/SOFTWARENAME/CVE-ID/depenfile_47e462eecc0a47ad40f59376199f93f227e21d13.txt` 3. 第三步运行 `python prepare_work.py SOFTWARENAME` 这一步会从pdg上寻找关键变量相关的语句提取出切片,输出`/home/SySeVR/Implementation/source2slice/results/SOFTWARENAME/CVE-ID/slice.txt` 如果diff是只有加号行,只能在NEW文件中提取切片,输出`/home/SySeVR/Implementation/source2slice/results/SOFTWARENAME/CVE-ID/slice_add.txt` 4. 第四步运行以下命令, 这一步会从得到的切片上自动化匹配sink点,结果输出在`/home/SySeVR/Implementation/source2slice/match_results//SOFTWARENAME/CVE-ID/sink_source_json.json` ``` python3 ../../Match_Sink/match_sink.py CWE-189 /home/SySeVR/Implementation/source2slice/data/C-Vulnerable_Files/ffmpeg/CVE-2013-0859/CVE-2013-0859_CWE-189_6d1c5ea04af3e345232aa70c944de961061dab2d_tiff.c_1.1_OLD.c ../results/ffmpeg/CVE-2013-0859/slices.txt /home/SySeVR/Implementation/source2slice/data/C-Diffs/ffmpeg/CVE-2013-0859/CVE-2013-0859_CWE-189_6d1c5ea04af3e345232aa70c944de961061dab2d_tiff.c_1.1.diff ``` --- ## 3. 自动化sink测试单独匹配步骤 切换到 `Match_sink`目录下 ## 使用前请修改match_sink.py文件中 _cwe_, _old_file_, _slice_file_ 如果cwe类型是772和401 还需要修改*diff_file* ## 执行match_sink.py文件 查看输出的结果 在执行的过程中还有输出一下中间信息,后续分析可以参考。 > 如果sink和source输出为空: > 1. 先看一下切片中是否有人工分析到的sink点 > 2. 再确认一下关键变量提取是否正确 > 3. debug 查找自动化匹配代码的不足 > 如果sink点和source点匹配不正确: > debug 查找自动化匹配代码的不足 ## 目前存在的问题 1. 所有的执行过程信息都输出在命令行,并且特别多。需要精简输出信息(目前的想法是将一些需要记录和异常处理等信息记录到log文件,命令行上输出进度条) 2. 针对新样本提取切片之前需要补充data.xlsx文件(每个cve对应的diff修改函数) 3. 在修改print的过程中,可以将文件中存在的直接写的路径, 用configure.json中的路径进行替换 4. 目前还是只能一次性针对一个软件的所有cve进行切片提取 5. /Implementation/result目录下有中间步骤的输出结果,这个对于提取切片失败寻找原因是非常重要的,目前是每切一个cve都会覆盖掉之前的结果,希望把这部分的信息也可以记录到log文件中,log文件可以每个cve有一个对应的文件 6. 如果一个cve有多个diff目前在最终结果上只能保存一个diff对应的切片 7. **我试了三个样例,都没有匹配到sink点 :( ** ## TODO 1. 引入log记录系统,将之前的print替换掉 2. 在命令行上输出进度条,便于批量处理的时候查看状态