前言
最近希望在基于图神经网络的漏洞检测上有所推进,准备复现文章SySeVR: A Framework for Using Deep Learningto Detect Software Vulnerabilities开源代码,基本环境配置是python库环境以及joern-0.3.1、Neo4j-2.1.5环境的配置,环境具体要求如下
假期的时候就已经完成过joern的配置,光是安装就卡了我两个星期,并未详细记录,特此来记录一下。但是最后采用joern-cli绘制图代替joern使用了详细见文章链接
1.预准备
操作系统:Linux(个人ubuntux64后面选择jdk版本时候注意)
root管理员方式登录服务器,我采用的腾讯云服务器,会默认给你用户身份连接,但是会产生以下问题
- 无法直接创建文件夹以及修改文件等报错,所以命令前需要加sudo
- 同时注意在root管理员和用户登录时进行的系统配置是完全两个环境以用户身份修改环境例如python版本的时候管理员身份登陆的时候仍然保证原状,不同身份登陆后进行的操作互不影响
- 鉴于管理员root身份权限更大更方便,防止两个身份同时操作混乱我们可以设置root方式登录使用远程服务器,详细过程见文章
python2版本:2.7
python3版本:3.8
如果你版本低于3.6可能遇到如下问题,具体如何安装详见文章
PyGraphviz requires Python version 3.8 or later (3.6 detected). error: Setup
2.安装java
安装Java的教程网上有很多了,我也自己总结过一种有效的方式,具体详见。
我安装的jdk版本为jdk1.7.0_80,下载链接
3.安装neo4j
我安装joern是为了运行SySeVR,所以我选择了和SySeVR一样的Neo4j 2.1.5,这里建议直接下载链接中的版本,如果自己下载neo4j还需要配置gremlin-plugin,别的所有教程也都选择了配置好的neo4j,我也上传详见资源链接
3.1 neo4j解压到/usr/local/neo4j目录
3.2 解压后还需要更改几个文件
- neo4j-server.properties($JOERN为joern安装的目录)
vim /neo4j/conf/neo4j-server.properties
# location of the database directory
org.neo4j.server.database.location=$JOERN/.JoernIndex
# Let the webserver only listen on the specified IP. Default is localhost (only
# accept local connections). Uncomment to allow any connection. Please see the
# security section in the neo4j manual before modifying this.
注意:一定保证neo4j中的org.neo4j.server.database.location文件地址以及文件名和joern分析函数导入数据库所产生index文件的地址和文件名完全一致,具体见文章
- neo4j-wrapper.conf
vim /neo4j/conf/neo4j-wrapper.conf
# Java Heap Size: by default the Java heap size is dynamically
# calculated based on available system resources.
# Uncomment these lines to set specific initial and maximum
# heap size in MB.
wrapper.java.initmemory=512
wrapper.java.maxmemory=10240 #as large as you can
- /etc/profile
vim/etc/profile
# Add These Content at the End of the File
#######################################
NEO4J_HOME=/usr/local/neo4j
PATH=$PATH:$NEO4J_HOME/bin
export NEO4J_HOME
export PATH
#######################################
source /etc/profile
3.3 验证
/usr/local/neo4j/bin/neo4j console
4 安装ant
选择的版本是apache-ant-1.9.14,链接下载之后解压到/usr/local/ant
4.1 配置环境变量/etc/profile,如下把这些加到文档末尾
vim /etc/profile
#######################################
ANT_HOME=/usr/local/ant
PATH=$PATH:$ANT_HOME/bin
export ANT_HOME
export PATH
#######################################
source /etc/profile
4.2 检测安装结果
ant -version
安装成功会显示
Apache Ant(TM) version 1.9.14 compiled on March 12 2019
5.安装joern
安装的joern也是在SySeVR的项目详细见neo4j步骤里的文件截图,因为都已经配置好了,比较简单,可以到资源中直接下载。
5.1 解压joern-0.3.1到任意目录
cd joern-0.3.1
ant
最后显示BUILD SUCCESSFUL
5.2设置环境变量
- /etc/profile
vim /etc/profile
# 把这些加到文档末尾
#######################################
JOERN_HOME=/home/joern-0.3.1/
export JOERN_HOME
#######################################
- ~/.bashrc
vim ~/.bashrc
# 把这些加到文档末尾
#######################################
alias joern='java -jar $JOERN/bin/joern.jar'
#######################################
- 更新生效
source /etc/profile
source ~/.bashrc
5.3 构建额外的工具
cd joern-0.3.1
ant tools
运行结果和ant的结果相同
BUILD FAILED ant joern-0.3.1/build.xml:35: Directory creation was not succes
如果你未以root管理员身份运行ant tools时会报错上面的内容,方便起见我们如果使用服务器则一定换成root身份运行,如果用的本地就没有这个问题了,如果就是暂时不想换,使用sudo ant就可以解决了
6.安装python-joern
python-joern下载链接也可以在项目中直接找到,具体文件格式如下,也可以直接下载资源。
cd python-joern-0.3.1
python setup.py install
注意:
命令变化
如果用户身份登录,需要命令前加入sudo,若电脑命令行输入python输出python2.x的信息,需要将python setup.py install中的python换为python3,若是python3.x则没有问题。
问题:用户身份登录,根据刚才的原则使用命令sudo python3 setup.py install
产生报错如下:
PyGraphviz requires Python version 3.8 or later (3.6 detected). error: Setup
咋们都是文化人吧,那就直接换成python3.8或更高版本即可,具体升级过程见文章
使用ubuntu用户身份安装python3.8,之后再次执行命令sudo python3 setup.py install
产生报错如下:
# include <Python.h>; pygraphviz/graphviz_wrap.c:154:11: fatal error:
最后查阅大量文献,最后收获一个信息<Python.h>是python最基础的文件,我推测是因为我虽然在ubuntu用户身份安装python3.8,但是root身份中python版本仍然为3.6,有些ubuntu用户身份可以做的事情可以使用python3.8,但是涉及到更高权限的时候命令中的sudo会使用管理员身份但是python版本不对,其中的python.h文件有问题,切换root身份安装python3.8即可安装,成功
7.安装joern-tools
joern-tools下载链接,也可以在博主资源中直接下载。
cd joern-tools-master
python setup.py install
注意:
命令变化
如果用户身份登录,需要命令前加入sudo,若电脑命令行输入python输出python2.x的信息,需要将python setup.py install中的python换为python3,若是python3.x则没有问题,博主用户身份登录,根据刚才的原则使用命令
sudo python3 setup.py install
8.验证joern
输入joern-lookup
查看
root@VM-12-7-ubuntu:/home/thicker/GNN/FIRST# joern-lookup
usage: joern-lookup [-h] [-f [FILE]] [-o [OUT]] [-c] [-g] [-a ATTRIBUTES [ATTRIBUTES ...]]
Lookup nodes using lucene queries and output one row for each matching node. Rows are in the format functionId TAB attributeKey:attributeValue TAB
...'
optional arguments:
-h, --help show this help message and exit
-f [FILE], --file [FILE]
read input from the provided file
-o [OUT], --out [OUT]
write output to provided file
-c, --complete Output the complete node, not just its ID.
-g, --gremlin query is a gremlin traversal as opposed to a lucene query
-a ATTRIBUTES [ATTRIBUTES ...], --attributes ATTRIBUTES [ATTRIBUTES ...]
Attributes of interest
root@VM-12-7-ubuntu:/home/thicker/GNN/FIRST#
就当最后临门一脚的时候,不出意外就又出意外了,报错了
File "/usr/local/lib/python3.8/dist-packages/joerntools-0.1-py3.8.egg/joerntools/shelltool/LookupTool.py", line 4, in <module>
from TraversalTool import TraversalTool
ModuleNotFoundError: No module named 'TraversalTool'
告诉我没有这个库,但是我去寻找的时候文件组织如下:
一个文件下告诉我没有,这是什么鬼啊,头大
那好吧,既然找不到那我就帮你找,我把导入库的语句加上"."改成如下:
改完我直接运行,根本没有毛病,但是又来了一个报错,这个报错我一下就拿捏
Traceback (most recent call last):
File "/usr/local/bin/joern-lookup", line 4, in <module>
__import__('pkg_resources').run_script('joerntools==0.1', 'joern-lookup')
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 658, in run_script
self.require(requires)[0].run_script(script_name, ns)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 1438, in run_script
exec(code, namespace, namespace)
File "/usr/local/lib/python3.8/dist-packages/joerntools-0.1-py3.8.egg/EGG-INFO/scripts/joern-lookup", line 3, in <module>
from joerntools.shelltool.LookupTool import LookupTool
File "/usr/local/lib/python3.8/dist-packages/joerntools-0.1-py3.8.egg/joerntools/shelltool/LookupTool.py", line 4, in <module>
from .TraversalTool import TraversalTool
File "/usr/local/lib/python3.8/dist-packages/joerntools-0.1-py3.8.egg/joerntools/shelltool/TraversalTool.py", line 2, in <module>
from PipeTool import PipeTool
ModuleNotFoundError: No module named 'PipeTool'
告诉我找不到’PipeTool’,这不巧了,刚才我也看到这个文件了
找不到我就帮你,直接加点我就是运行,我不信他不行,但是显示现实让我相信了,报错如下:
Traceback (most recent call last):
File "/usr/local/bin/joern-lookup", line 4, in <module>
__import__('pkg_resources').run_script('joerntools==0.1', 'joern-lookup')
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 658, in run_script
self.require(requires)[0].run_script(script_name, ns)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 1438, in run_script
exec(code, namespace, namespace)
File "/usr/local/lib/python3.8/dist-packages/joerntools-0.1-py3.8.egg/EGG-INFO/scripts/joern-lookup", line 3, in <module>
from joerntools.shelltool.LookupTool import LookupTool
File "/usr/local/lib/python3.8/dist-packages/joerntools-0.1-py3.8.egg/joerntools/shelltool/LookupTool.py", line 4, in <module>
from .TraversalTool import TraversalTool
File "/usr/local/lib/python3.8/dist-packages/joerntools-0.1-py3.8.egg/joerntools/shelltool/TraversalTool.py", line 3, in <module>
from joerntools.shelltool.JoernTool import JoernTool
File "/usr/local/lib/python3.8/dist-packages/joerntools-0.1-py3.8.egg/joerntools/shelltool/JoernTool.py", line 3, in <module>
from joerntools.DBInterface import DBInterface
File "/usr/local/lib/python3.8/dist-packages/joerntools-0.1-py3.8.egg/joerntools/DBInterface.py", line 2, in <module>
from joern.all import JoernSteps
File "/usr/local/lib/python3.8/dist-packages/joern-0.1-py3.8.egg/joern/all.py", line 2, in <module>
from py2neo.ext.gremlin import Gremlin
ModuleNotFoundError: No module named 'py2neo.ext'
我一看这个错我有点蒙了,这不完了,拿捏不住了,错不一样了,不慌上网一搜,告诉我py2neo在新版本当中没有ext这个库,好像是从2020.1.1和4.0版本以上都没有这个库,那我先看了一下我的py2neo版本果然是最新的,那咋们不怕啊,直接pip install py2neo==3.x,直接enter安装,告诉我没有这个版本了,直接木了
Looking in indexes: http://mirrors.tencentyun.com/pypi/simple
ERROR: Could not find a version that satisfies the requirement py2neo==3.1.2 (from versions: 4.0.0, 4.1.0, 4.1.1, 4.1.2, 4.1.3, 4.2.0, 4.3.0, 2020.0.0, 2020.1.0, 2020.1.1, 2021.0.0, 2021.0.1, 2021.1.0, 2021.1.1, 2021.1.2, 2021.1.3, 2021.1.4, 2021.1.5, 2021.2.0, 2021.2.1, 2021.2.2, 2021.2.3)
没事,勇敢牛牛不怕困难,上网上搜看看有没有资源,功夫不负有心人真的找到py2neo3.x版本了,这不就有了,但是结果还是不行,资源我也挂了连接
#py2neo-3.1.1-py2.py3-none-any.whl 使用方式
pip install py2neo-3.1.1-py2.py3-none-any.whl
产生什么错了呢,就是他告诉我有’py2neo.ext’,但是没有’py2neo.ext.gremlin’,心态有点崩了兄弟,但是在此搜索,发现’py2neo.ext.gremlin’在新版本中也去掉了,只有在py2neo2.X中才有
Traceback (most recent call last):
File "/usr/local/bin/joern-lookup", line 6, in <module>
exec(compile(open(__file__).read(), __file__, 'exec'))
File "/home/thicker/GNN/FIRST/joern-tools-master/tools/lowLevel/joern-lookup", line 3, in <module>
from joerntools.shelltool.LookupTool import LookupTool
File "/home/thicker/GNN/FIRST/joern-tools-master/joerntools/shelltool/LookupTool.py", line 4, in <module>
from .TraversalTool import TraversalTool
File "/home/thicker/GNN/FIRST/joern-tools-master/joerntools/shelltool/TraversalTool.py", line 3, in <module>
from joerntools.shelltool.JoernTool import JoernTool
File "/home/thicker/GNN/FIRST/joern-tools-master/joerntools/shelltool/JoernTool.py", line 3, in <module>
from joerntools.DBInterface import DBInterface
File "/home/thicker/GNN/FIRST/joern-tools-master/joerntools/DBInterface.py", line 2, in <module>
from joern.all import JoernSteps
File "/usr/local/lib/python3.8/dist-packages/joern-0.1-py3.8.egg/joern/all.py", line 2, in <module>
from py2neo.ext.gremlin import Gremlin
ModuleNotFoundError: No module named 'py2neo.ext.gremlin'
那就事不宜迟了,不想再拖了,我下载了py2neo2.x,资源在这喽,不是博主的偶,要是想要免费的话可以私信博主厚厚偶或者关注公众号私信偶
解压得到py2neo-py2neo-2.0.8.tar.gz
cmd切换到文件目录
执行pip install py2neo-py2neo-2.0.8.tar.gz 安装
并且后来运行成功发现在那个开源项目中也给出了py2neo2.x版本,但是博主没有用过,大家可以试一试好用告诉博主偶,最后按照步骤安装py2neo2.x,运行joern-lookup验证,成功,撒花撒花
8.使用joern
完成joern的安装后,进入joern的安装目录,我的安装目录在/home/linux用户名/joern-0.3.1
两种方法,根据填充的数据的大小来采用不同的方法
- 第一种:分析小型程序
// 模板
java -jar $JOERN/bin/joern.jar $CodeDirectory
$JOERN:joern安装目录,$CodeDirectory:待分析的程序目录
// 实际运行,示例
sudo java -jar /home/linux用户名/joern-0.3.1/bin/joern.jar /home/linux用户名/joern-0.3.1/testcode/
//joern-0.3.1文件夹内自带一个testcode文件夹,用于测试
该命令运行完后会在该目录(joern-0.3.1)下生成一个 .joernIndex的隐藏文件(ctrl+h可以查看)。注意,如果此目录已经存在,则joern.jar就会在其中添加代码,因此在每次你想要创建一个新的数据库之前需要删除.joernIndex,然后重复此步骤。
- 第二种:分析大型程序
// 模板
java -Xmx$SIZEg -jar $JOERN/bin/joern.jar $CodeDirectory
//$JOERN:joern安装目录,$CodeDirectory:待分析的程序目录,$SIZE:给jvm分配内存 (以GB为单位)
// 实际运行,实例Xmx1g,代表最大分配1G空间
sudo java -Xmx1g -jar /home/linux用户名/joern-0.3.1/bin/joern.jar /home/linux用户名/joern-0.3.
遇到两个警告,告诉我第一个是空间不足需要使用-Xmx参数扩大空间,看是要2G,加上参数-Xmx2g,还是空间不足,改成-Xmx3g成功消除了警告,再就是直接使用自带的testcode告诉无法获得,我就创建一个新的文件夹code在joern-0.3.1文件夹下并上传随意代码,再次运行警告消除。
所有的安装过程介绍完毕了,希望大家安装顺利偶,如果大家有什么问题,欢迎关注公众号“厚点编程”和博主进一步交流偶