Joern的代码使用-devign

最近一直在做关于图神经网络试验的复现,但是开源的代码真的是少之又少,说起我和joern的爱恨离愁还真是有很长时间了

一. 初试

最近开始对于图神经网络开始初步进行研究,结合之前所做的漏洞检测相关方向,结合趋势决定做使用图神经网络应用漏洞检测问题,通过阅读国内外论文,总结该问题上解决的基本步骤,以及不同论文中在个步骤中采取的不同措施。
Joern的代码使用-devign_第1张图片
总而言之,分为以下三步

  • 代码构图
  • 图的向量化
  • 神经网络设计
    综合考虑,结合创新型与可实现行而言,指定以下策略用于后期的实现
  • 代码构图—joern
  • 图的向量化—word2vec+ onehot
  • 神经网络设计
    从此我joern结缘

二. joern

对于joern的安装,我参考了以下文章,特此感谢
[https://blog.csdn.net/jlu_wangqi/article/details/109412399](https://blog.csdn.net/jlu_wangqi/article/details/109412399)
[https://blog.csdn.net/water_likly/article/details/88415127](https://blog.csdn.net/water_likly/article/details/88415127)
[https://blog.csdn.net/u013648063/article/details/106811275](https://blog.csdn.net/u013648063/article/details/106811275)
[https://blog.csdn.net/water_likly/article/details/89378623?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4.pc_relevant_default&utm_relevant_index=](https://blog.csdn.net/water_likly/article/details/89378623?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-4.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-4.pc_relevant_default&utm_relevant_index=5)
[https://blog.csdn.net/m0_37924639/article/details/78783592](https://blog.csdn.net/m0_37924639/article/details/78783592)
[https://blog.csdn.net/God_Jn/article/details/103238013](https://blog.csdn.net/God_Jn/article/details/103238013)
**主要通过第一二文章做,最后选择第三篇中的方法**
  • 最后做到完全配置成功,但是最后由于Neo4j的版本问题导致失败,失败的过程可单独发文说明,总共耗时两天,最后无果而终,但是除了Neo4j的版本问题我感觉我的配置绝对没有任何问题,如果有合适老版本的Neo4j的小伙伴欢迎私信我。
  • 不建议尝试老版本的joern安装,建议使用新版本的joern-cli,直接进入joern的官方网站查看官方文档安装即可,具体的安装过程见文章

三. joern-cli

关于joern-cli的安装我直接参考的joern官方安装文档,这我一看不有手就行,但是三个问题限制了我

  • problem one :网速的问题,三条语句一点问题没有,但是到了最后一条的时候开始下载文件,我看速度告诉我要好几天,那一刻我是崩溃的,真无语!!!!
    Joern的代码使用-devign_第2张图片
    answer one :当时已经到了深夜里,真是难以入睡,我准备相信我的电脑,我就一直开着让它下载,我想我这么帅一旦晚上网速暴涨呢,我果断睡了,果不其然第二天早上没有下载下来,我决定找别人帮我下列但是我下什么呢,我打开了joern-install.sh,把里边的网址拿了出来,https://github.com/ShiftLeftSecurity/joern/releases/latest/download/joern-cli.zip,找我的好朋友上github上下载下来,一看是joern-cli的压缩包,我可高兴坏了,感觉有了希望,但是后来才发现官方网站给出了所有joern-cli各版本的压缩包以及所有文件的网址
    Joern的代码使用-devign_第3张图片

  • problemr two :我通过以下文章的启发开始使用joern-cli,我心想这不一解压就行了吗,然后直接按照他说的方法我运行就可以了呗。然而不这么顺利,我一在解压文件夹下运行/joern,就直接报错java有问题诶,一大堆主类然后lang什么有问题的,当时忘记截图了
    Joern的代码使用-devign_第4张图片
    https://blog.csdn.net/u013648063/article/details/112311392?spm=1001.2014.3001.5502
    https://blog.csdn.net/qq_36281420/article/details/114526209
    https://blog.csdn.net/u013648063/article/details/106970131
    answer two :在./joern前加sudo。最终我认为是jdk版本的问题后来感觉换到11.04linux比较稳妥,可以上orcle官网注册下载

  • problemr three :最后在下面这篇文章的指导下,改成自己的代码如下,费劲巴拉的导出了几张图片
    https://blog.csdn.net/u013648063/article/details/112311392?spm=1001.2014.3001.5502

sudo ./joern-parse / home/code/
sudo ./joern-export cpg.bin --repr pdg --out /home/joern-cli/pdg
dot -Tpng -o test1.png ./pdg/1-pdg.dot

AST
Joern的代码使用-devign_第5张图片
CPG
Joern的代码使用-devign_第6张图片
PDG
Joern的代码使用-devign_第7张图片
CFG
Joern的代码使用-devign_第8张图片

answer three :导出图的时候已经除夕当天了,过年解决了工作的问题,嘿嘿嘿

四. 代码中使用问题

由于见识到了joern的威力,所以这个论文复现的活一致拖到了开学,最近两天再复现文章的时候遇到了种种问题

(一)指定计划

  1. 确定复现文章:基于关系图卷积网络的源代码漏洞检测
  2. 寻找合适的开源文章:Devign Effective Vulnerability Identification by Learning Comprehensive Program Semantics via Graph Neural Networks
  3. 选择代码:第一个链接是一位大佬自己复现的,代码容易看懂,但是对于边的处理仅限于AST。第二个链接是论文的官方作者的代码仅关于训练过程,第二个链接是论文的对于数据处理,建立图,以及图的向量化过程代码。但是由于第二个代码量很大,并且数据比较大实现难度较大,同时我们并不想复现改文章而是主要想借用其建立图的过程,故选择开源代码一
    https://github.com/epicosy/devign
    https://github.com/saikat107/Devign
    https://github.com/VulDetProject/ReVeal
    代码一的代码结构如下
    Joern的代码使用-devign_第9张图片

(二)跑代码

  1. 配置环境:环境要求如下,对于joern来说,直接把之前下好的joern-cli压缩包放入joern文件夹下即可,同时使用anaconda建立虚拟环境GNN,然后对于Python库可以使用pip ininstall 一切。
    Joern的代码使用-devign_第10张图片
    note:
    **tip1:**除了gensim库的版本要求为3.8.1以外,其他库版本无要求,pip就行,用高版本的gensim也可以就是需要修改一些代码中的参数名比较麻烦,
    **tip2:**在windows下配环境的时候遇到过安装torch_sparse和torch_geometic报错的问题,详见文章

  2. 调整代码:
    problem one 详见文章
    problem two 由于joern版本问题在 devign-master\src\prepare\cpg_generator需修改输出文件夹参数,并且由于java与joern版本适配问题需添加执行sudo,故修改joern_parse函数为

def joern_parse(joern_path, input_path, output_path, file_name):
    out_file = file_name + ".bin"
    joern_parse_call = subprocess.run([sudo,"./" + joern_path + "joern-parse", input_path, "--out", output_path + out_file],
                                      stdout=subprocess.PIPE, text=True, check=True)
    print(str(joern_parse_call))
    return out_file

此时我并未注意危险的来临,一顿操作也让代码运行了起来,没想到埋下了很大隐患

四. 问题解决

(一)问题的产生

清早起来拥抱太阳,满满的正能量,我想通过自己的想法复现那篇文章,想通过生成图后的节点和边提取入手,但是让我发现了一个问题。那就是当执行python main.py -c时虽然成功调用了joern,但是产生了一些报错,同时提示文件not process。
Joern的代码使用-devign_第11张图片
我发现是graph-for-funcs.sc文件产生报错

(二)解决方案的查找

  • 上各大网站查找,但是发现很少附后
  • 后来想到可能由于这个开源代码并没有很多人复现,不如上github上找这个项目看看有无伙伴提出问题,直接在github上搜graph-for-funcs.sc选择issue专题查看,查看再三发现以下几个解决入口

(三)解决方案的查找

  • java版本
    首先根据joern在github上的官方文档上的要求jdk11,并且同时根据报错我发现是库引入错误,同时并不是每一条import均有问题,考虑到是java版本升级的问题,故将jdk8升至jdk11,但最终升级也无济于事。
  • graph-for-funcs.sc版本
    Joern的代码使用-devign_第12张图片
    通过作者的提示我明显感觉到了graph-for-funcs.sc版本与joern-cli版本的适配问题十分关键,接着查看作者所说issue3,在隐藏问题当中,我们看到作者更新过,所以我尝试使用新版本以及老版本,同时在https://github.com/epicosy/devign/issues/9
    中同样有人提出版本问题,总共实验三次,均无果,值得说的是在第三种版本的graph-for-funcs.sc文件很多人提出解决了问题,所有版本文件均保留
    Joern的代码使用-devign_第13张图片
  1. joern-cli版本
    通过在github上搜寻关键字graph-for-funcs.sc查看一些解答,https://github.com/epicosy/devign/issues/9
    最终问题在上面网页中得到解答,通过阅读这些讨论内容我得到以下几个结论
  • java版本不是问题的根源

  • graph-for-funcs.sc 和 joern-cli的适配问题是问题的根源,同时两者适配性很强

  • joern-cli更新极快,可能每天都在更新

  • 该graph-for-funcs.sc 代码下,joern-cli 1.0.170比较适用,但是我们现在使用官方文档方法默认下载最新版本。
    在这里插入图片描述

    最后我上joern-cli的各版本下载网站查看joern-cli 1.0.170,同时查看devign开源代码中文件graph-for-funcs.sc更新时间

joern-cli 1.0.170
Joern的代码使用-devign_第14张图片
graph-for-funcs.sc更新时间
Joern的代码使用-devign_第15张图片
发现graph-for-funcs.sc更新时间在joern-cli 1.0.170发布后两天,作者应该是基于joern-cli 1.0.170做的graph-for-funcs.sc,故下载joern-cli 1.0.170压缩包解压放入代码的joern文件夹下运行,解决问题。并且在后续无意中我发现了一个更好玩的事情详见文章
Joern的代码使用-devign_第16张图片
如果大家实操过程存在问题或者有什么想和博主交流的,可以关注博主公众号
Joern的代码使用-devign_第17张图片

你可能感兴趣的:(实验,joern,graph,embedded,cpg,devign)