1 相关知识介绍
1.2 App编译流程
Figure1APK的构建,打包,签名
1.3 App发布
开发人员注册:向Android Market或者其他Market登记personal和credit信息,Market 检查信息并且依据你的信息注册。
Application注册:给Market发送已签名的apk文件,Market 检查app是否签名,并且包名没有与已注册app报名发生冲突。
Application发布:App注册后将直接发布给用户,用户根据需要是否下载。
App安装和签名验证:检查被安装app包名是否一致,并且签名是否与开发者的签名信息一致。这样,你就可以安装,更新或者取消安装。
1.4 重打包漏洞和重打包攻击
安全是各种计算环境中最重要的问题之一。逆向工程技术(Reverse engineering techniques)可以用来创建包含任意代码而被伪造的应用程序,这种漏洞是由运行在VM中的字节码的结构特性所致。字节码在目标文件中包含类名,方法名,变量名等。
例如:DEX文件中包含使用逆向工程攻击的代码信息,反编译的字节码与源码相似,并能够在DVM中运行。攻击者分析反编译的代码,植入恶意代码,然后重新编译成被伪造的DEX文件,重新打包和签名,发布。流程如下:
Figure2 利用重打包漏洞的伪造过程
分析Android代码的逆向工程主要是通过反编译DEX文件,有两种结果。
反编译成Java代码:使用undx和dex2jar工具将DVM字节码转换为JVM字节码,Java decompiler 将JVM字节码转换为Java代码。使用dx转换器优化生成高级语言的Java代码,反编译有一个缺点,并且与原源码不匹配,还要求开发环境相同,因此不适合在app中修改代码。
反编译成smali代码:生成的是低级语言的代码,DVM组件格式与DVM字节码一对一映射。并且不需要开发环境相同。
逆向过程如下:
step1 搜索修改点,包括activity信息、UI布局、应用程序的执行流程。Logcat收集信息,onCreate函数反编译后的UI信息、XML信息等。
step2 反编译,提取APK文件中的DEX文件,使用baksmali工具生成smali代码。
step3 插入修改代码,在修改点处插入任意DVM指令或者直接修改。
step4 签名,重打包签名。
2 例子
正常流程:
step1 防病毒检查
在app运行前检查anti-virus app是否运行,如果anti-virus app没有安装,则安装并且执行anti-virus app。
step2 APK完整性检查
这是检查app是否被伪造和修改的核心部分。首先,app计算原始apk文件的hash值,并且向服务器发送apk完整性检查请求报文(包含hash值,apk版本),然后,服务器在数据库中估计apk版本检索原始apk的hash值,并且返回响应报文给app。
step3 用户信息检查
step4 调用Service
异常流程:
step1 绕开防病毒检查
step2 发送正常app的hash值和版本值给服务器,不管接受到的响应报文,继续执行被篡改的app。
step3 执行Service,显示虚假信息,隐藏真实信息。
完整流程如下:
3 应对之策
3.1 自签名
该策略可以防止重打包攻击。将self-signing变为signed-by-market,没有market签名的App禁止发布。尽管这可以从根本上解决重打包攻击,但这却违背了Android的open policy,且app升级也会变得麻烦。此外,智能机上的所有软件被不支持自签名的软件所代替是不现实的。基于多签名的应用签名方案,可以简化这种变化并且便于升级。
3.2 代码模糊处理
模糊处理是一种用于使源代码或者机器代码的逆向工程更加困难的技术。虽然不能完全阻止逆向工程,这种技术却可以阻止攻击者分析app的逻辑或者代码。它有源代码模糊处理和二进制代码模糊处理两种形式。
3.3 认证码
Trusted Platform Module(TPM可信平台模块)是处理敏感数据的程序所依赖的最有效的安全措施之一。它是基于硬件的平台安全解决方案之一。TPM保证从bootloader到OS内核,库模块加载的安全引导。且应用程序间特权隔离、远程认证(远程检查平台完整性)。使用远程认证可以对二进制可执行代码的静态完整性检查,以及识别正在执行的恶意伪造应用程序。
4 总结
二进制代码模糊处理和基于硬件的认证码可以很好的处理重打包攻击。
注:
http://link.springer.com/article/10.1007/s11277-013-1258-x/fulltext.html#CR9