Android手机软件进程代码注入攻击与防御研究
2018-09-18周凡
周凡
摘 要 在Android手机广泛普及的今天,其被恶意程序攻击、病毒感染、信息复制等事件频频发生。Android应用安全问题自然也引起人们的更多关注。结合Android体系架构的特点,本文主要是通过ptrace注入的方式对Android手机软件进程代码注入攻击与防御进行研究,从而提高Android应用的安全性。
关键词 Android系统 ptrace注入
现在Android手机应用已有案例遭到代码注入攻击:由于应用是通常运行在Dalvik虚拟机上的,其底层依然是C和C++环境。攻击者进程通常伪装成gdb调试器对指定进程进行调试,然后远程调用dlopen使指定进程加载预先写好的恶意SO代码,从而窃取相关关键信息。
1 ptrace原理
程序員的任务就是写程序,写完程序就是调程序,估计没人敢说自己写程序不用调试的,尤其是程序规模庞大了之后更是如此,第一个实现调试器的是一个伟大的人,个人见解:ptrace就是为gdb而生的,ptrace应该算是gdb的核心了。
2 Android下的ptrace注入
ptrace让调试变得方便,也让程序变得不安全。
对于每一个Android应用,都对应一个Dalvik虚拟机,其上层是JAVA实现,下层又有支持C、C++的JNI环境 ,按照上述ptrace原理,可以在JNI环境下使用ptrace通过注入的方式使一个Android应用执行我们自己写的JAR包。由于是执行在指定Android应用的进程空间中,我们的JAR包可以很方便的修改、获取该应用中的数据。
2.1时序图原理
时序图的基本流程如下:
(1)通过Shell指令执行Inject,Aseck在执行时必须拥有root权限。
(2)可执行文件Inject的流程非常通用,arm平台上无需更改。
(3)加载的libJavaLoader.so文件流程也是通用的,无需更改。
(4)加载的Jar包中必须保证有一个无参构造函数和一个execInject函数,至于execInject函数的逻辑可以按需随意更改。
2.2进程注入过程的主要依赖关系介绍
(1)在ndk环境下使用ndk-build命令编译jni文件夹中的内容。
(2)Invader是一个lib项目,也就是将要注入的jar包,首先生成temp.jar,然后执行dx-dex-output=invader.jar temp.jar生成dex包,将生成的invader.jar放在assets/dexjar文件夹下。
2.3基于ptrace的执行详细流程
(1)首先启动Aseck程序,在adb中PS出想要注入的进程pid,输入之,Aseck会根据pid找到对应的processName,然后将inject和libJavaLoader.so拷贝至本地进程所属文件夹,将invader.jar拷贝到pid进程所属文件夹。
(2)Aseck获取root权限,使用shell执行inject程序。
(3)执行Inject详细流程:
①ptrace attach挂起指定pid进程。
②保存进程2程序执行上下文。
③计算进程2中dlopen、dlsym、mmap等函数首地址。
④使用ptrace_call在进程2中调用mmap函数开内存用于存放待注入的汇编指令。
3手机软件进程代码注入防御
经过测试,现阶段Arm平台上的手机软件,绝大部分应用都可以注入成功(危险),当前有以下五种防御方案:
第一种是TraceMe,此方案的缺点是,一旦开启此状态就不能关闭,但现阶段是最优化的解决方案。
第二种是比较父进程ID,实测在内核版本较高的系统上,此方法已不在有效;
第三种是查看/proc/pid/status文件,当进程被注入时,此文件中会有一项TracerPID标识出注入进程ID;但如果检查的不够频繁可能由于外部进程注入时间过短而错过。
第四种是查看/proc/pid/fdinfo下的所有fd信息,当进程被注入时,需要打开so文件,因而增加了新的fd,此方式的局限性在于文件描述符的控制上,假如当前应用正要打开某个文件,那也势必会增加新的fd。
第五种方案,修改ld动态库的符号库,不过实现可能会对其他代码产生影响。
4外部进程函数地址计算
linux的每个执行中的进程在内存中都映射了一个文件/proc/self/maps,内容大致如下:
左边是某进程中的逻辑地址,右边是对应加载动态库名,以dlopen函数为例,如果知道本进程内的函数地址,知道本进程内其所属库/system/bin/linker(/lib/ld-2.8.so) 的起始加载地址,再知道该库在指定pid进程内的起始加载地址,就可以推算出dlopen在指定pid进程内的函数地址。
5结束语
Android手机平台由于其开源性和免费所带来的安全缺陷导致其应用在架构层次上存在一些根本性的安全问题。结合Android自身的特点,通过ptrace注入的方式对Android手机软件进程代码注入攻击与防御进行研究,能够大大地提高Android手机应用的安全性,这种方法具有很好的推广性,值得进一步深入研究。
参考文献
[1] 姚华.4大隐患威胁手机支付安全[N].城市快报,2015.
[2] 李光.360携合作伙伴解决发起手机支付安全+行动[N].光明网IT频道,2015.
[3] 史成浩.Android平台应用软件保护技术研究与实现[D].2012.