论文部分内容阅读
摘要:随着移动互联网的发展,Android手机平台内越来越多的APP具有移动支付功能。移动支付涉及到金融交易,支付信息安全显得尤为重要。本文分析了Android的Binder机制,通过将监控代码动态注入目标模块,对進程间的通信数据进行提取,通过比对既有信息,分析是否有恶意软件窃取目标APP的用户隐私信息。在支付环节之前将检测结果对用户给予提示,且对支付过程无较大影响,一定程度上保障了用户支付信息的安全。
关键词:Android系统;Binder;动态注入;信息提取
中图分类号:TN918.9
文献标志码:A
1 引 言
基于Android系统庞大的使用人群,各应用公司开发了各式各样的APP为人们的生活提供了便利。但随着Android应用数量的急剧上升,应用质量参差不齐,恶意软件严重威胁着终端用户的财产和隐私安全,也制约着移动终端应用的进一步发展[1][2]。根据360互联网安全中心发布的《2016年安卓恶意软件专题报告》,2016年全年,Android平台新增恶意程序样本1403.3万个,平均每天新增3.8万恶意程序样本。
随着手机支付功能的普遍化,恶意代码藏匿于普通应用程序盗取用户账户信息和密码的现象时有发生,恶意程序威胁着正常的支付功能,泄露了用户的敏感信息,对用户直接或间接造成经济损失[3]。手机支付越来越受到人们重视,使用的场景越来越多,但手机安全却阻碍其突破性发展。
目前应用市场上存在手机管家,手机安全卫士等安全应用来管理和保护用户的手机,但安装这些安全应用会对手机产生一定的额外开销,且针对特定APP中的敏感信息无法做到精准的保护[4]。本文针对这一现象,为Android系统中涉及支付功能的应用提出一种支付信息的保护方式,通过比对进程间的通信数据,找到获取隐私信息的恶意APP,提醒用户进行处理,以此保障用户的信息安全。
2 Binder通信机制
Android系统是由谷歌公司基于Linux内核开发的智能操作系统,在Linux系统中,进程间的通信机制有很多种,包括pipe(管道)通信,socket(套接字)通信,signal(信号)通信这些传统IPC(Inter Process Communication进程间通信)。Android为每个APP分配了一个区分进程身份的属性-UID,传统的IPC只能由用户在数据包里填入UID/PID[5-6],但这样容易被恶意程序所利用。由IPC机制在内核中添加的属性才是最可靠的。Binder的出现满足了Android对通信方式,传输性能和安全性的要求,与其他进程间通信方式相比,Binder通信机制更安全、简洁、高效、快速,消耗的内存资源更少。
Binder通信是Android系统的基础通信机制,转发应用之间的通信信息。Binder在完成本身转发信息的功能之外,在底层拷贝应用之间的通信信息,用户在使用手机过程中并不会察觉到。Binder在Android的各个版本中很少变动,因此基于Binder机制的方案便于移植到Android的各版本,具有很好的兼容性,可实现更多种类Android移动终端的覆盖。[7]
图1表示了Binder基于Client-Server的通信模式,传输过程只需一次拷贝,为发送方添加UID/PID身份,既支持实名Binder也支持匿名Binder,安全性高。Binder的CS架构由四大部分组成,分别是服务端、客户端、服务管理器和内核空间里的Binder驱动[8]。
服务端Server提供服务,一个或多个Client客户端向服务发起请求,通信过程由Binder接口实现,数据的交互与处理在Binder驱动中完成。服务需在服务管理器Service Manager中进行注册,Service Manager是Android系统中的守护进程,负责监听客户端的请求。
3 系统设计与实现
3.1 整体设计方案
本方案设计的支付信息保护模块依托于APP的支付功能,整体流程如图2所示。
当用户生成订单信息时,支付信息保护模块同时开始工作,从生成敏感信息时开始监控信息的流向。当用户发起支付时,客户端首先调用APP后台服务器接口,APP向后台接口传入等待付款的订单号,支付方式及一系列业务相关的参数,服务器收到请求后返回JSON格式数据。若请求成功,JSON数据里包括服务器根据订单号查询到的商品信息,交易的标题,订单金额等等。客户端收到成功的指令后,根据用户选择的支付方式准备调用相应的第三方支付平台的接口。根据支付平台的要求,需要传入JSON格式数据里的敏感信息。
在敏感信息的流动过程中,支付信息保护模块同步检测敏感信息是否被其他恶意应用窃取,支付环境是否安全,将检测结果在页面予以显示,告知用户。支付信息保护模块同步覆盖支付的整个流程。
3.2 代码注入
代码注入是Linux系统提供的Ptrace系统调用,在目标内存空间进行hook操作。Android的动态链接器为Linker[9],可以实现ELF格式链接库的加载与链接。Ptrace使用PTRACE—ATTACH模式跟踪正在运行的进程,使其变为可控子进程[10]。具体过程如下:
(1)调用Ptrace的PTRACE_ATTACH模式关联到目标进程;
(2)获取目标进程的子进程、内存及寄存器信息并保存;
(3)装载指定的共享库,将代码写入到目标进程上完成加载;
(4)将函数重定向,使用新函数。主要修改PLT表和GOT表;
(5)调用Ptrace的PTRACE_DETACH脱离目标进程。
当客户端生成订单信息时,系统同时调用支付信息保护模块,首先将监控代码注入到对应模块。当目标进程被动态注入后,执行ioctl函数(i/o通道控制函数)时会跳到共享库中对应的重定向函数hooked_ioctl位置上执行。利用栏截到的ioctl函数返回的数据对进程间通信的数据进行解析,从而提取出应用程序在运行时刻的行为参数,可以进行提前预判和管理。ioctl函数的调用方式为intioctl(int fd, int cmd, struct binder___ write_read*bwr),第一个参数是文件描述符;cmd是用户程序对设备的控制命令,一般分为GET(从内核读数据)、SET(向内核写数据)等命令;第三个参数为类型为binder_write_read结构的数据流指针。 由Binder通信机制,应用程序使用服务时会优先同Service Manager进程通信来获取相应服务信息。Service Manager的Binder进程间通信数据流采用结构体binder_transaction_data表示,保存在结构体binder_write_read中的write_buffer和read_buffer所指向的字节缓冲区域。在应用同Service Manager进行交互时,Service Manager用read_buffer记录应用的IPC数据。所以接下来要通过结构体binder_transaction_data来解析read_buffer中指向的缓冲区域的数据。
3.3 数据提取与比较
binder—transaction__ data包含成员变量target,target是一个联合体,表示一个目标Binder对象,Binder驱动根据其中的handle找到应该由哪个进程处理该事件;code是一个命令,它描述了Binder对象执行的操作,当应用程序需要ServiceManager来查询相应的服务时,code为GET—SERVICE—TRANSACTION; sender _pid和sender euid为发起请求进程的PID和UID,用于识别应用的身份;data是一个联合体,存放数据,data_size表示数据的大小,其结构体ptr中的buffer保存通信数据。下面的伪代码用于提取buffer中的数据。
//定义数据包保存提取的数据
typedef struct Packet{
pid__t sender__ pid;
uid_t sender_euid;
charservice_name;
)packet;
char*ptr;
//遍历read_buffer缓冲区存放进一个移动指针
for(i=O;1
关键词:Android系统;Binder;动态注入;信息提取
中图分类号:TN918.9
文献标志码:A
1 引 言
基于Android系统庞大的使用人群,各应用公司开发了各式各样的APP为人们的生活提供了便利。但随着Android应用数量的急剧上升,应用质量参差不齐,恶意软件严重威胁着终端用户的财产和隐私安全,也制约着移动终端应用的进一步发展[1][2]。根据360互联网安全中心发布的《2016年安卓恶意软件专题报告》,2016年全年,Android平台新增恶意程序样本1403.3万个,平均每天新增3.8万恶意程序样本。
随着手机支付功能的普遍化,恶意代码藏匿于普通应用程序盗取用户账户信息和密码的现象时有发生,恶意程序威胁着正常的支付功能,泄露了用户的敏感信息,对用户直接或间接造成经济损失[3]。手机支付越来越受到人们重视,使用的场景越来越多,但手机安全却阻碍其突破性发展。
目前应用市场上存在手机管家,手机安全卫士等安全应用来管理和保护用户的手机,但安装这些安全应用会对手机产生一定的额外开销,且针对特定APP中的敏感信息无法做到精准的保护[4]。本文针对这一现象,为Android系统中涉及支付功能的应用提出一种支付信息的保护方式,通过比对进程间的通信数据,找到获取隐私信息的恶意APP,提醒用户进行处理,以此保障用户的信息安全。
2 Binder通信机制
Android系统是由谷歌公司基于Linux内核开发的智能操作系统,在Linux系统中,进程间的通信机制有很多种,包括pipe(管道)通信,socket(套接字)通信,signal(信号)通信这些传统IPC(Inter Process Communication进程间通信)。Android为每个APP分配了一个区分进程身份的属性-UID,传统的IPC只能由用户在数据包里填入UID/PID[5-6],但这样容易被恶意程序所利用。由IPC机制在内核中添加的属性才是最可靠的。Binder的出现满足了Android对通信方式,传输性能和安全性的要求,与其他进程间通信方式相比,Binder通信机制更安全、简洁、高效、快速,消耗的内存资源更少。
Binder通信是Android系统的基础通信机制,转发应用之间的通信信息。Binder在完成本身转发信息的功能之外,在底层拷贝应用之间的通信信息,用户在使用手机过程中并不会察觉到。Binder在Android的各个版本中很少变动,因此基于Binder机制的方案便于移植到Android的各版本,具有很好的兼容性,可实现更多种类Android移动终端的覆盖。[7]
图1表示了Binder基于Client-Server的通信模式,传输过程只需一次拷贝,为发送方添加UID/PID身份,既支持实名Binder也支持匿名Binder,安全性高。Binder的CS架构由四大部分组成,分别是服务端、客户端、服务管理器和内核空间里的Binder驱动[8]。
服务端Server提供服务,一个或多个Client客户端向服务发起请求,通信过程由Binder接口实现,数据的交互与处理在Binder驱动中完成。服务需在服务管理器Service Manager中进行注册,Service Manager是Android系统中的守护进程,负责监听客户端的请求。
3 系统设计与实现
3.1 整体设计方案
本方案设计的支付信息保护模块依托于APP的支付功能,整体流程如图2所示。
当用户生成订单信息时,支付信息保护模块同时开始工作,从生成敏感信息时开始监控信息的流向。当用户发起支付时,客户端首先调用APP后台服务器接口,APP向后台接口传入等待付款的订单号,支付方式及一系列业务相关的参数,服务器收到请求后返回JSON格式数据。若请求成功,JSON数据里包括服务器根据订单号查询到的商品信息,交易的标题,订单金额等等。客户端收到成功的指令后,根据用户选择的支付方式准备调用相应的第三方支付平台的接口。根据支付平台的要求,需要传入JSON格式数据里的敏感信息。
在敏感信息的流动过程中,支付信息保护模块同步检测敏感信息是否被其他恶意应用窃取,支付环境是否安全,将检测结果在页面予以显示,告知用户。支付信息保护模块同步覆盖支付的整个流程。
3.2 代码注入
代码注入是Linux系统提供的Ptrace系统调用,在目标内存空间进行hook操作。Android的动态链接器为Linker[9],可以实现ELF格式链接库的加载与链接。Ptrace使用PTRACE—ATTACH模式跟踪正在运行的进程,使其变为可控子进程[10]。具体过程如下:
(1)调用Ptrace的PTRACE_ATTACH模式关联到目标进程;
(2)获取目标进程的子进程、内存及寄存器信息并保存;
(3)装载指定的共享库,将代码写入到目标进程上完成加载;
(4)将函数重定向,使用新函数。主要修改PLT表和GOT表;
(5)调用Ptrace的PTRACE_DETACH脱离目标进程。
当客户端生成订单信息时,系统同时调用支付信息保护模块,首先将监控代码注入到对应模块。当目标进程被动态注入后,执行ioctl函数(i/o通道控制函数)时会跳到共享库中对应的重定向函数hooked_ioctl位置上执行。利用栏截到的ioctl函数返回的数据对进程间通信的数据进行解析,从而提取出应用程序在运行时刻的行为参数,可以进行提前预判和管理。ioctl函数的调用方式为intioctl(int fd, int cmd, struct binder___ write_read*bwr),第一个参数是文件描述符;cmd是用户程序对设备的控制命令,一般分为GET(从内核读数据)、SET(向内核写数据)等命令;第三个参数为类型为binder_write_read结构的数据流指针。 由Binder通信机制,应用程序使用服务时会优先同Service Manager进程通信来获取相应服务信息。Service Manager的Binder进程间通信数据流采用结构体binder_transaction_data表示,保存在结构体binder_write_read中的write_buffer和read_buffer所指向的字节缓冲区域。在应用同Service Manager进行交互时,Service Manager用read_buffer记录应用的IPC数据。所以接下来要通过结构体binder_transaction_data来解析read_buffer中指向的缓冲区域的数据。
3.3 数据提取与比较
binder—transaction__ data包含成员变量target,target是一个联合体,表示一个目标Binder对象,Binder驱动根据其中的handle找到应该由哪个进程处理该事件;code是一个命令,它描述了Binder对象执行的操作,当应用程序需要ServiceManager来查询相应的服务时,code为GET—SERVICE—TRANSACTION; sender _pid和sender euid为发起请求进程的PID和UID,用于识别应用的身份;data是一个联合体,存放数据,data_size表示数据的大小,其结构体ptr中的buffer保存通信数据。下面的伪代码用于提取buffer中的数据。
//定义数据包保存提取的数据
typedef struct Packet{
pid__t sender__ pid;
uid_t sender_euid;
charservice_name;
)packet;
char*ptr;
//遍历read_buffer缓冲区存放进一个移动指针
for(i=O;1