编译运行FlowDroid

Reading time ~5 minutes

Contents

FlowDroid

代码结构

’14论文主页-源码分为两部分:

  • soot-infoflow:通用的污点分析
  • soot-infoflow-android:建模安卓组件生命周期等

依赖Soot和Heros:

  • Soot:起初是Java优化框架,现常被用于Java和安卓应用的分析、插桩、优化、可视化等(Call-graph construction, Def/use chain…)
  • Heros - IFDS框架:将函数间的数据流分析问题转化为图可达问题

context-, flow-, field- and object-sensitive

数据流分析的分类(General)

  • 程序路径分析的精度
    • 流不敏感分析(flow insensitive):程序路径的物理位置从上往下
    • 流敏感分析(flow sensitive):考虑语句可能的执行顺序(常要利用CFG)
    • 路径敏感分析(path sensitive):不仅考虑语句的先后顺序,还对程序执行路径条件加以判断
  • 程序路径分析的深度
    • 过程内分析(intra-procedure):只针对函数内部的代码。CFG
    • 过程间分析(inter-procedure):考虑函数之间的数据流,即需跟踪分析目标数据在函数之间的传递过程。Call Graph, ICFG
      • 上下文不敏感(context-insensitive):将每个调用或返回看作一个’goto‘,忽略调用位置和函数参数取值等函数调用的相关信息
      • 上下文敏感(context-sensitive):对不同调用位置调用的同一函数加以区分

object-sensitive

面向对象的编程语言,如Java:contain aliasing and virtual dispatch constructs。安卓往往包含更深的aliasing(别名)relationships.

field-sensitive

关乎敏感信息的来源。例:用户对象包含了用户名和密码两个字段,分析时只有后者应被视作private value。对于用户界面上返回该字段内容的API,还需要结合manifest和layout的XML文件中的附加信息。

用Maven构建Flowdroid

  1. 下载apache-maven-3.6.3.zip并解压,将其下bin文件的路径添加到环境变量。
  2. git clone到本地后,使用命令mvn -DskipTests install
  3. 编译好的jar包在soot-infoflowsoot-infoflow-android下的target目录下。其中apidocs是Javadoc根据代码里的注释规范生成的(宝藏!)。

主要问题和解决方法

  • Maven下载过慢:apache-maven-3.6.3\conf\settings.xml下配置镜像。阿里云的很快。我的镜像配置长下面这样,放在mirrors标签中。

      <mirror>
          <id>nexus-aliyun</id>
          <name>Nexus aliyun</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          <mirrorOf>central</mirrorOf>
      </mirror>
      <!-- 中央仓库1 -->
      <mirror>
          <id>repo1</id>
          <mirrorOf>central</mirrorOf>
          <name>Human Readable Name for this Mirror.</name>
          <url>http://repo1.maven.org/maven2/</url>
      </mirror>
      <!-- 中央仓库2 -->
      <mirror>
          <id>repo2</id>
          <mirrorOf>central</mirrorOf>
          <name>Human Readable Name for this Mirror.</name>
          <url>http://repo2.maven.org/maven2/</url>
      </mirror>
    
  • 有的jar包仍然下载很慢甚至失败。参考下节的方法先下载jar包到本地再Maven安装。

  • 出现以下信息,大概是说失败记录缓存在本地了,在一段时间里都不会重试。可以直接在命令后加-U,或者是在settings.xml中修改updatePolicy

    xxx was cached in the local repository, resolution will not be reattempted until the update interval of xx has elapsed or updates are forced -> [Help 1]
    
  • 构建soot-infoflow-android时出的错,pom.xml中AXMLPrinter的repository地址好像访问不了了,挂梯子也不行。这个包的主要作用是对Android的二进制格式的Androidmanifest.xml进行解析。

    我到开头说的那个搜索jar包的网上找dependency中对应的版本,有一个artifactId是AXMLPrinter2的repository,但下载链接也是无效的,感觉是很早的工具可能很久没维护了。

    最后我用的是com.android的AXMLPrinter的1.0.0,然后把repository的url修改一下。在FlowDroid项目的issues里自问自答了一下…见下

    I did the following two steps, and it worked for me.

    • use the jar file here, and modify the dependency:
    <dependency>
    	<groupId>com.google.protobuf</groupId>
    	<artifactId>protobuf-java</artifactId>
    	<version>3.4.0</version>
    </dependency>
    
    • modify the repositories like this:
    <repositories>
    	<repository>
    		<id>soot-snapshot</id>
    		<name>Soot snapshot server</name>
    		<url>http://dev.91xmy.com/nexus/content/repositories/releases/</url>
    	</repository>
    	<!-- <repository>
    		<id>soot-release</id>
    		<name>Soot release server</name>
    		<url>https://soot-build.cs.uni-paderborn.de/nexus/repository/soot-release/</url>
    	</repository> -->
    </repositories>
    

    Build Success. Hope there would be no problems in the future.😄

Maven 手动添加 JAR 包到本地仓库

MVNRepository 搜索可用的 JAR 包信息并下载

以spring-context-support为例,pom.xml中可用的Maven信息如下。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>3.1.0.RELEASE</version>
</dependency>

Maven安装本地jar包命令:mvn install:install-file -Dfile=jar包的位置 -DgroupId=groupId -DartifactId=artifactId -Dversion=version -Dpackaging=jar。用上面的例子即

mvn install:install-file -Dfile=spring-context-support-3.1.0.RELEASE.jar -DgroupId=org.springframework -DartifactId=spring-context-support -Dversion=3.1.0.RELEASE -Dpackaging=jar

使用jar包运行Flowdroid

若不需要修改源码,推荐此方式:只要在Release页面下载soot-infoflow-cmd-jar-with-dependencies.jar即可。使用的示例可参考:https://github.com/E0HYL/CallGraph-Flowdroid

在soot中,函数的signature就是由该函数的类名,函数名,参数类型,以及返回值类型组成的字符串

SHAP源码之GradientExplainer

Published on January 01, 2022

可解释方法LIME和SHAP代码实战

Published on November 29, 2021