modified-ICCBot——项目依赖升级

背景

在对移动应用进行安全分析的过程中,常常会需要用到静态分析技术,在不运行程序代码的情况下,通过对程序代码静态扫描的形式,实现对应用程序的分析,分析手段包括词法分析、语法分析、控制流分析等。

由于最近在做的课题需要自动化地对应用中跨组件通信(ICC)进行分析,参考了相关资料后,决定以基于Soot框架的开源ICC分析工具————ICCBot入手,进行自定义的修改与拓充。

本文主要讲述如何对ICCBot的项目依赖进行升级与改进。

项目依赖分析与修改

原版的ICCBot由中国科学院软件研究所的燕季薇博士维护。

原版开源地址:https://github.com/hanada31/ICCBot

简单来说,ICCBot是一个基于Soot框架,利用控制流与数据流分析对应用中ICC进行解析的工具,但其项目依赖中所用的Soot版本,以及用来生成CG的Flowdroid版本都年久失修,导致在实际使用的过程中会出现很多老问题。
因此需要对其项目依赖进行以下改良:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<!-- ICCBot版本号是1.0 -->
<modelVersion>4.0.0</modelVersion>
<groupId>ICCBot</groupId>
<artifactId>ICCBot</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<!-- 用于解析命令行参数的包,没啥要改的 -->
<dependencies>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.4</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  <!-- 这部分是原项目中打包好的Flowdroid jar包,解包后可发现版本仍停留在2.8 -->
<!-- <dependency>
<groupId>soot-infoflow-dummy</groupId>
<artifactId>soot-infoflow-dummy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/soot-infoflow-dummy.jar</systemPath>
</dependency> -->

<!-- 替换为最新的Flowdroid 2.11.0 ,此处是自己build后打包,带最新Soot 4.4.0依赖的jar包,仍放在项目lib目录下 -->
<dependency>
<groupId>soot-infoflow-cmd-jar-with-dependencies</groupId>
<artifactId>soot-infoflow-cmd-jar-with-dependencies</artifactId>
<version>2.11.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/soot-infoflow-cmd-jar-with-dependencies.jar</systemPath>
</dependency>

此处就出现了一个问题,由于原版ICCBot的Soot依赖是从远程soot-infoflows(即FlowDroid)的Maven仓库中进行获取,然而最新版FlowDroid并未在远程Maven仓库上进行同步。

因此如果按原始方法构建项目依赖的话,会导致所用的Flowdorid与Soot版本不同步(远程的Soot未更新)。需要自己手动地添加新版本Soot依赖,此处采用将其与FlowDroid合并打包的方式添加。

FlowDroid 2.10 :https://github.com/secure-software-engineering/FlowDroid/releases/tag/v2.10

选择soot-infoflow-cmd-jar-with-dependencies.jar,即带Soot依赖的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<!-- 原版的Soot依赖,版本还停留在FlowDroid 2.8 中所用的Soot 4.3.0-SNAPSHOT, 将其合并到了上一条依赖中-->
<!-- <dependency>
<groupId>de.tud.sse</groupId>
<artifactId>soot-infoflow</artifactId>
<version>2.8</version>
</dependency> -->

<!-- https://mvnrepository.com/artifact/com.microsoft.z3/java-jar -->
<dependency>
<groupId>z3</groupId>
<artifactId>z3</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/com.microsoft.z3_linux.jar</systemPath>
</dependency>
<!-- 原版所用的apktool版本,也一样换成了最新的2.7-->
<dependency>
<groupId>apktool</groupId>
<artifactId>apktool</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/apktool_2.7.0.jar</systemPath>
</dependency>
<dependency>
<groupId>gator</groupId>
<artifactId>gator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/sootandroid-1.0-SNAPSHOT-all.jar</systemPath>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>

<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
</dependencies>
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<configuration>
<mainClass>main.java.MainClass</mainClass>
<attachToBuild>true</attachToBuild>
<classifier>onejar</classifier>
<filename>ICCBot.jar</filename>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

新版本适配

修改后还需要替换原版ICCBot中,调起的FlowDroid分析接口:

src/main/java/client/cg/CgConstructor.java

1
2
3
//由原版ICCBot自构的runInfoflow_dummy()方法,改为新版本FlowDroid中功能相同的constructCallgraph()方法
//setupApplication.runInfoflow_dummy();
setupApplication.constructCallgraph();

修改后运行还是会存在不少报错,依旧是类似的适配思路:

首先参照报错的信息,定位到具体的代码,并对其所调用的新旧Soot/FlowDroid版本API,一一结合Github上的更新记录进行了对比与修改。

以此在保留代码原有功能的基础上进行了接口的升级。主要集中在Manifest、Call Graph等功能模块

具体的修改可参考:https://github.com/Canonize/modified-ICCBot/commit/d5c43afb2f6ffdb56e4ff0abb7cc61d778917fc5

新项目依赖构成

新项目开源地址:https://github.com/Canonize/modified-ICCBot

新版Flowdroid/IccTA :
modified-ICCBot/lib/soot-infoflow-cmd-jar-with-dependencies.jar

ICCBot <- 新版Flowdroid/IccTA 部分 :modified-ICCBot/src/main/java/client/cg/

部分参考资料:

原版ICCBot论文:https://hanada31.github.io/pdf/icse22_iccbot.pdf

远程FlowDroid及Soot依赖版本信息:https://mvnrepository.com/artifact/de.tud.sse/soot-infoflow/2.8

FlowDroid版本更新:https://github.com/Canonize/FlowDroid/commits/develop

Soot版本更新:https://github.com/soot-oss/soot/commits/develop