环境配置

跟着官方环境来,但是具体上又有点出入,所以记录一下详细步骤,官方文档:https://www.yuque.com/wh1t3p1g/tp0c1t/rmm0aimycci76ysm

首先官网下载tabby的zip文件:https://github.com/wh1t3p1g/tabby/releases/,里面所有需要的东西都包含了

数据库配置

这一步比较重要,文档里面要的apoc插件和tabby-path-finder插件都包含在官方的zip里面了

然后新建一个Neo4j项目来给tabby使用,同时创建一个DBMS

image-20241201012220397

里面有一个默认的neo4j数据库,用这个就好了

然后配置tabby的数据库账号密码,tabby >= 1.3.x 版本的数据库配置放置于 config/db.properties,我这里没有这个文件,所以手动创建了一个文件

# for docker
tabby.cache.isDockerImportPath = false

# db settings
tabby.neo4j.username = neo4j
tabby.neo4j.password = password
tabby.neo4j.url = bolt://127.0.0.1:7687

image-20241201012611132

然后配置一下我们刚新建的数据库

点这里进去

image-20241201012904191

image-20241201012920619

然后找到对应的配置项,修改下面这些内容,没有就自己创建

# 注释下面的配置,允许从本地任意位置载入csv文件
#server.directories.import=import

# 允许 apoc 扩展
dbms.security.procedures.unrestricted=jwt.security.*,apoc.*

# 修改内存相关配置
# 可以通过官方的neo4j-admin来推荐配置内存大小,https://neo4j.com/docs/operations-manual/current/tools/neo4j-admin/neo4j-admin-memrec/
dbms.memory.heap.initial_size=1G
dbms.memory.heap.max_size=4G
dbms.memory.pagecache.size=4G

然后就是配置apoc,先找到配置文件的目录

点击这里会直接打开当前项目的配置文件目录

image-20241201013409500

image-20241201013343735

新建apoc.conf文件,配置下面内容

apoc.import.file.enabled=true
apoc.import.file.use_neo4j_config=false

最后配置一下 apoc 和 tabby-path-finder 插件,打开 plugins 目录将对应的 jar 复制到该目录

image-20241201013423656

这里下载的两个插件版本有讲究,一开始漏看了,导致插件加载完数据库都起不来

关于 apoc 插件的版本选择方法:Neo4j 数据库版本的前两位对应 apoc 插件的版本
比如 我Neo4j 数据库版本为 v5.24.0,则选择 apoc 插件 v5.2.x 版本

我这里就选了两个5.24的

image-20241201020830325

上述步骤完成之后重启数据库

输入下面两个指令检查是否配置成功

CALL apoc.help('all')
CALL tabby.help('tabby')

image-20241201020937163

然后就是配置图数据库索引,这个是为了加快导入/删除的速度,提前对节点进行索引建立

执行下面的cypher语句

CREATE CONSTRAINT c1 IF NOT EXISTS FOR (c:Class) REQUIRE c.ID IS UNIQUE;
CREATE CONSTRAINT c2 IF NOT EXISTS FOR (c:Class) REQUIRE c.NAME IS UNIQUE;
CREATE CONSTRAINT c3 IF NOT EXISTS FOR (m:Method) REQUIRE m.ID IS UNIQUE;
CREATE CONSTRAINT c4 IF NOT EXISTS FOR (m:Method) REQUIRE m.SIGNATURE IS UNIQUE;
CREATE INDEX index1 IF NOT EXISTS FOR (m:Method) ON (m.NAME);
CREATE INDEX index2 IF NOT EXISTS FOR (m:Method) ON (m.CLASSNAME);
CREATE INDEX index3 IF NOT EXISTS FOR (m:Method) ON (m.NAME, m.CLASSNAME);
CREATE INDEX index4 IF NOT EXISTS FOR (m:Method) ON (m.NAME, m.NAME0);
CREATE INDEX index5 IF NOT EXISTS FOR (m:Method) ON (m.SIGNATURE);
CREATE INDEX index6 IF NOT EXISTS FOR (m:Method) ON (m.NAME0);
CREATE INDEX index7 IF NOT EXISTS FOR (m:Method) ON (m.NAME0, m.CLASSNAME);
:schema //查看表库
:sysinfo //查看数据库信息

image-20241201021159909

image-20241201021255464

这是删除所有约束的语句,有需要可以使用

DROP CONSTRAINT c1;
DROP CONSTRAINT c2;
DROP CONSTRAINT c3;
DROP CONSTRAINT c4;
DROP INDEX index1;
DROP INDEX index2;
DROP INDEX index3;
DROP INDEX index4;
DROP INDEX index5;
DROP INDEX index6;
DROP INDEX index7;

idea插件安装

该插件是用来加速我们的分析过程的,通常一次完整的tabby使用流程为下面几步:

  1. 生成代码属性图
  2. 导入图数据库neo4j
  3. 使用browser查询指定cypher语句
  4. 复制对应的classname等信息后在IDEA定位到对应代码进行人工确认

我们需要手动下载安装插件,插件地址:https://github.com/wh1t3p1g/tabby-intellij-plugin

下载好是一个zip文件,然后去idea的插件市场选择从磁盘安装插件

image-20241201021913952

直接选择我们的zip文件,下载好后可以在已安装插件中看到

image-20241201022205930

然后配置对应的数据源

image-20241201022319862

运行示例

这里在case目录里面放了一个cc3.2.1的依赖

然后下面命令开始分析生成数据

java -Xmx4g -jar tabby.jar

然后就会在output目录下生成一系列csv文件

image-20241201140610659

高版本需要使用tabby-vul-finder来手动导入生成的结果到图数据库中,文件地址:https://github.com/wh1t3p1g/tabby-vul-finder

java -jar tabby-vul-finder.jar load D:\CTF\Java\工具\tabby\output\dev

这样即可完成导入

image-20241201140654291

属性图的介绍在官方文档里有说明:https://www.yuque.com/wh1t3p1g/tp0c1t/pppuq72tfhmic3g4