Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

Grab 'N Run: Secure and Practical Dynamic Code Loading for Android Applications

论文下载:https://www.cs.ucsb.edu/~vigna/publications/2015_ACSAC_GrabNRun.pdf

ABSTRACT && INTRODUCTION

作者提出了一个针对Android上动态加载代码(dynamic code loading, DCL)安全问题的解决方案 DCL不安全可能会导致代码注入,现有的解决方案的缺点

  • 修改framework,可行性不高
  • 只能保护远程取回代码的安全,不能保护从本地(例如SD卡)取回代码的安全

解决的问题:

  • 设计了一种DCL的实现框架,完整实现了原来API的功能,并在其基础之上加入了校验过程,保证了动态加载的外部代码没有被修改
  • 该框架简单易用,作者通过实验证明了他提供的API不会给开发者带来不便,并且他的框架也没有修改Android底层代码,可行性高
  • 为了方便开发者过度到他的框架,提供了一个自动化修改APK的工具,解包,定位,pacth,全套服务……

Dynamic Code Loading

正常应用需要DCL的场景:

  • 提高启动时的反应速度,一些不必要的代码需要时再加载
  • 可扩展性,比如游戏中需要付费才能开启的功能
  • 升级,如果广告插件自我升级不希望和APP挂钩,并且,一些频繁的小的更新希望静默完成,不通过Android的升级机制

实现过程中的步骤以及出现的问题:

  • 代码取回阶段,通常使用HTTP,会被中间人攻击
  • 代码存储阶段,通常放在SD卡上,会被恶意软件修改
  • 代码校验及加载阶段,做完整性校验很困难,Android没有提供相关机制,所以大多数开发者不做校验

Threat Model

假设攻击者不能获得root权限,不能对HTTPS进行中间人攻击不能解密HTTPS流量,不能劫持存有证书的服务器

Grab ‘n Run Overview

Fig

Grab ‘n run一共分5步:

  1. 代码取回步骤——允许使用HTTP
  2. 代码储存步骤——要放在私有目录下
  3. 证书存放服务器地址生成步骤——根据不同包名来计算使用的证书地址,作者推荐使用的是静态map,在威胁模型里假定攻击者不能修改APK静态组件
  4. 证书取回步骤——强制使用HTTPS,防止中间人攻击,为了提高效率将所有证书放在本地,并在APK安装之后一次性取回所有证书
  5. 签名校验步骤——检查动态加载的每个组件的完整性,只验证一次,提高性能

重打包工具的结构: 解包 → 更新Manifest → 定位DCL → 修改代码 → 打包

Grab ‘n Run Implementation

实现部分: 只有一个API,DexClassLoader,封装了一个SecureDexClassLoader

Fig

Fig

Fig

重打包工具 使用apktool,申请了网络权限,增加新的类,对原来的调用方法做了patch

Evaluation & Limitations

找了12个开发者,要求有一定的开发经验。首先让他们用Android的API实现DCL的功能,然后,让他们用作者的框架实现同样的功能,提醒他们注意实现的安全性。让这些开发者填问卷,谈谈两种API的区别。

作者发现的问题: 75%的人采用了http获得代码,用自带API的人没有一个进行校验,因为测试前提醒过安全问题,所以没有人将取回的代码放在SD卡里,但是Android官方文档里并没有提示。

从调查问卷中看出:

  • 所有的开发者觉得引入的开销很小
  • 83%的开发者觉得作者的API更加简单易懂容易掌握
  • 91%的开发者认为作者的API更加安全
  • 对比了开发时间,第一次平均时间139分钟,第二次平均时间37分钟

实际测验的开销很小

Fig

缺点:

  • 不允许同时加载两个同名的包
  • 只覆盖了一种DCL的调用方法
  • 没有解决不同应用之间代码共享的问题