系统级程序设计结课实验-第一部分

实验要求是老师口述的,参考论文Towards security defect prediction with AI,使用记忆网络对数据集进行训练,使之能完成代码漏洞的检测,并且!添加新的漏洞类型(原论文提供的数据集只有两种漏洞类型)进行检查!

这一部分先讲一下使用机器学习进行漏洞检查的原理以及配置训练环境的一些情况。

为什么要用机器学习检查漏洞

  因为静态分析工具很难找完或者准确找到代码中的漏洞,即使是最先进的静态分析工具在Juliet Test Suite(一个代码集合,用以测试漏洞检查工具的性能)上表现也不佳。因为静态分析工具需要制定一些规则,来判断代码是否存在漏洞,而有的漏洞往往难以想到,但是数量又众多,所以可以尝试机器学习,给模型喂数据,模型不需要理解代码的逻辑就可以判断代码是否存在漏洞。这只是个人理解,详细可以看上面的论文

训练的原理

  个人不是很懂机器学习,只能讲一个简单的大概,就是将c代码贴上标签(行位放个特殊的注释),然后用clang等工具将c代码转为token文件,然后喂给记忆网络。记忆网络会用position encoding,即位置编码,详见End-to-end memory networks. InAdvances in Neural Information Processing Systems,对所有代码进行编码变成一个矩阵,然后放入记忆网络用一定的算法(看的不太懂...上面给的论文都有详细介绍这个算法)进行训练,最后得出一个模型,通过这个模型就可以对代码进行预测。对于本次实验,并不需要了解记忆网络工作原理和训练原理(毕竟是系统级程序设计,不是机器学习课程)。

配置训练环境

这次实验用到https://github.com/cmu-sei/sa-bAbI的文件,cmu大佬写的代码,说明里面虽然有教怎么使用,但是还是有些问题需要解决一下。

1.docker的安装,可能我这边网比较差,装最新的docker总是装不上,最后用的apt方法来获取docker.io才装上

2.docker-compose build应该更正为sudo docker-compose,不然会提示没有权限,后面生成数据集以及测试也需要用sudo先获取权限。

3.enviroment.yml文件似乎有些问题,需要修改。将文件中的

替换为

# - libgfortran=3.0.1=h93005f0_2
# - libopenblas=0.3.3=hdc02c5d_3
# - mkl=2019.0=118
# - numpy=1.15.2=py36h6a91979_0
# - numpy-base=1.15.2=py36h8a80b8c_0
# - scikit-learn=0.20.0=py36h4f467ca_1
# - scipy=1.1.0=py36h28f7352_1
- pip:
#- libgfortran==3.0.1=h93005f0_2
#- libopenblas==0.3.3=hdc02c5d_3
#- scipy==1.1.0=py36h28f7352_1
#- scikit-learn==0.20.0=py36h4f467ca_1
#- numpy-base==1.15.2=py36h8a80b8c_0
#- numpy==1.15.2=py36h6a91979_0
- numpy==1.15.2
- scipy==1.1.0
- scikit-learn==0.20.0
#- numpy-base==1.15.2

即可。然后按照github上的方法,一直到训练为止都不会有问题,到了python validate.py这一步会出问题,提示文件夹不存在,这个是validate.py中的一个小疏忽。修改方法如下:

将evaluate_oneoff函数下的代码

if not os.path.exists(path):
if models is None:
models = get_models(models_dir)
predic = models[predic_num].predict(
[val_instances_mat, val_queries_mat])
np.save(path, predic)

  修改为:

if not os.path.exists(path):
    if models is None:
        models = get_models(models_dir)
    predic = models[predic_num].predict(
        [val_instances_mat, val_queries_mat])
    if not os.path.exists(os.path.dirname(path)):
        os.makedirs(os.path.dirname(path))
    np.save(path, predic)

即可。

猜你喜欢

转载自www.cnblogs.com/pdysb/p/10171288.html