基于Android安全容器的网络数据采集系统

2021-11-13 07:53朱晓宇牛少彰
新一代信息技术 2021年14期
关键词:拦截器网络通信应用程序

朱晓宇,牛少彰

(北京邮电大学 计算机学院,北京 100876)

0 引言

现如今 Android平台上的很多研究都是基于应用程序在网络通信过程中的交互数据而开展的。网络通信数据一旦离开设备发送到网络上,很难保证这些数据在传输过程中会发生什么。研究人员进行网络数据分析的目的主要有检测隐私泄露[1]、检测恶意软件[2-4]和对恶意加密流量进行标注[5]等。他们进行 Android应用程序网络流量数据采集的方式主要是通过第三方工具,常用的工具有tcpdump、Whistle、Fiddler等。本文先是分析了在 Android平台上使用这些工具进行网络数据采集的局限性。然后提出为了避免对移动终端设备进行root操作,本文将在Android安全容器[6-7]的基础上进行研究。接着根据安卓软件栈[8]的架构层级顺序依次分析,得到 Android应用程序在不同的层级上与网络通信相关的代码实现方式,在目标代码入口处使用Hook[9]的方式得到在移动终端设备网络通信过程中的数据采集结果,这有效地避免了之前数据采集不完整的局限性。最终本文将通过分析与比较,设计出一个具备实时性、准确性和完整性特点的网络数据采集系统。

1 Android平台网络数据采集现状

目前研究人员对 Android平台上大量的应用程序进行网络数据采集主要是通过第三方工具。从实现原理上来看,它们可归结为两类,分别是以Fiddler为代表的基于代理服务器原理的工具和以tcpdump为代表的基于底层驱动原理的工具。

1.1 基于代理服务器原理的网络数据采集

本文将以目前使用最为广泛的Fiddler来进行实验。实验结果显示,正常情况下用户的移动终端设备可以进行 HTTPS网络请求,但是在使用Fiddler工具时,终端设备进行 HTTPS请求是失败的。这是因为 Fiddler工具相当于一个 HTTP/HTTPS代理服务器(如图 1所示),其证书不在用户的安卓终端设备的受信任证书列表中(实验中进行网络数据采集的应用程序为 Android移动终端设备上任意可运行的应用程序)。

图1 Fiddler原理Fig.1 Fiddler Principle

1.2 基于底层驱动的网络数据采集

在 Android平台上,基于底层驱动的网络数据采集方式中最有代表性的是tcpdump工具。该工具相当于非图形界面的WireShark,其目的是监视流经网卡的数据,所以该工具可以捕获到除HTTP协议以外的其他类型的数据包。使用tcpdump工具的前提是安卓终端设备需要处于root的状态。实验结果表明,Http类型的数据包中的请求和响应数据是可以看到的,而 Https的数据包中的数据是经过加密的。

综上所述,现有的 Android平台上的网络数据采集方式的局限性包括两点,一是数据采集不完整,即采集不到 Https的数据;二是使用基于底层驱动的网络数据采集方式时,移动终端设备需要root权限。

2 网络数据采集的分层分析

Android软件栈可分为 Application层、Framework层、Native层和Linux Kernel层。在本节中将根据 Android软件栈自下而上的顺序,结合对 Android客户端网络通信原理的分析来找到可利用的 Hook点。在本文中实现的网络数据采集系统是建立在Android安全容器的基础上的,在安全容器中对应用程序进行网络数据采集可以避免对手机进行root这一操作。

2.1 Android安全容器分析

本文中的Android安全容器使用了VirtualApp框架,该框架基于插件化[7]的思想,利用了大量的反射和动态代理的技术。仅使用VirtualApp很难实现我们的目的,所以本网络数据采集系统在VirtualApp的基础上结合了Hook技术。我们可以在VirtualApp中安装将要进行网络数据采集的目标应用程序,然后通过在VirtualApp中使用Hook的方式拦截目标函数,实现打印通信过程中网络数据的目的。

2.2 Linux Kernel层网络通信分析

目前,Android客户端进行网络通信可使用4G和Wifi两种方式。4G网络与客户端中的调制解调器有关,其放置在基带芯片中,基带芯片是合成基带信号或对基带信号解码的硬件芯片。所以,4G网络是通过客户端中的基带模块实现无线网络通信。Wifi网络需借助路由器通过以太网实现通信,即Wifi网络是通过客户端中的以太网卡模块实现无线网络通信。这两种方式使用的链路层协议是不同的,但是与用户层的通信都要通过Socket接口。

如图 2所示,无论是客户端还是服务器端,Socket通信过程中的通信数据对应的字节数组都会经过Socket的读写到缓冲区的操作。本文将利用 OkHttp中 okio.Okio类的 sink方法来观察Socket读写到缓冲区操作的函数。通过分别测试HTTP和HTTPS通信并且结合分析JDK的源码得知,在网络通信的数据写入过程中,HTTP底部调用的为java.net.SocketOutputStream的socketWrite方法,HTTPS底部调用的为com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLOutputS-tream的 write方法。实验结果表明,通过 Hook这两个方法得到的HTTPS数据是密文。

图2 Linux内核中Socket通信过程中数据的传输流程Fig. 2 Data Transmission Process in the Socket Communication Process in the Linux Kernel

2.3 Native层网络通信分析

Native层与网络通信最为相关的模块为类库Libraries中的SSL模块。客户端与服务器在SSL连接的过程中协商的对称密钥将对通信数据进行加密和解密操作。在LeakDoctor[10]中提出对Android加密的API进行Hook,经分析可得知,客户端发送明文数据给服务器端时调用 libssl.so的 SSL_write方法,服务器端发送密文数据给客户端时调用 libssl.so的 SSL_read方法,所以需要分别在SSL_write方法执行之前和在SSL_read方法执行之后 Hook对应的方法得到数据信息。获取到的数据由于Content-Type的不同分别是不同形式编码的,图3是拦截SSL_write方法得到的部分数据,该数据片段是使用URL编码的。

图3 Native层获取到的数据片段Fig. 3 Data Fragments obtained by the Native layer

由于 Framework层没有针对网络通信的模块,所以跳过该层,接下来进行Application层网络通信分析。

2.4 Application层网络通信分析

本节提出了两种基于 Android容器的获取网络数据的方式,一种是将应用程序中证书检测的部分忽略掉,另一种对网络通信框架添加拦截器。

在客户端与服务器端的HTTPS通信过程中,对证书的校验首先是确认 CA身份的可信性,在确认了 CA身份的可信性后,客户端将通过对证书的验证[11]来确认服务器端是否合法。在这一部分包括对证书域名的匹配性验证和证书钉扎验证。如果在客户端的应用程序中没有使用证书钉扎验证的话,Hook掉应用程序代码中校验证书的部分,即可使用第三方工具进行数据包的捕获。通过拦com.android.org.conscrypt.ConscryptFileD-escriptorSocket类的verifyCertificateChain方法,使其不执行,这样我们就可以跳过证书验证的部分,通过Fiddler来抓包。实验表明,这时在Fiddler中展示的HTTPS数据是可见的明文数据。

在实际的业务场景中,针对不同的API规范需要进行不同形式的HTTP调用。从移动客户端开发人员的角度来看,如果手动写HTTP调用框架的话,不仅需要考虑到不同的API规范,而且需要考虑到实现HTTP协议的各个方面。所以大部分安卓客户端应用程序都会选择使用优秀的网络开源框架来实现网络通信。表1中展示了目前移动开发领域几种较为广泛使用的网络开源框架。其中OkHttp是目前使用最为广泛的框架,且其提供了拦截器的思想,我们可以通过在安全容器中对目标应用程序注入拦截器的方法来获取网络通信过程中客户端与服务器端的交互数据。

表1 网络开源框架Tab. 1 Network Open Source Framework

3 网络数据采集系统的设计与实现

根据第2节的分析可知,在Linux Kernel层与网络通信相关的上层接口的输入输出流的数据是经过加密的;在Native层的SSL模块中,拦截Native层的代码从而得到明文数据的方式可以在安全容器中使用,但是有些数据需要进一步分析;在Application层,我们通过分析HTTPS的连接过程得到两种采集数据的方式,但是将应用程序中证书检测的部分替换掉的方式自动化程度不高,对框架进行拦截的方式较为可行。所以,本文中的网络数据采集系统将结合拦截 Native层libssl.so和拦截 Application层网络通信框架这两种方式来实现。本文提到的网络数据采集系统的设计流程图如图4所示。

图4 网络数据采集系统的设计流程图Fig.4 Design Flow Chart of Network Data Collection System

在安全容器中运行目标应用程序,当目标应用程序启动时,可以得到该应用程序对应的类加载器。获取到类加载器之后,我们就可以利用反射的思想来获取到该目标应用程序中相关的类、方法以及属性字段。查找到这些类之后,首先,拦截构造OkHttpClient对象的函数,拦截构造函数的目的是为了给其添加日志拦截器。其次,在OkHttpClient中,添加的拦截器都会存储到 Interceptor类型的List列表中,所以将我们初始化的日志拦截器通过反射的方式添加到这个List列表中即可。如果目标应用程序中没有日志拦截器相关类,将把拦截器类合并到目标应用程序的 dex文件中。如果目标应用程序没有使用网络通信框架,那么我们将在安全容器中导入编译好的对native层函数进行拦截的so库,接着调用相应的native层函数。

在本文中,首先需要获取到该目标应用程序中所有包含okhttp和okio的类名,得到对应的类,然后将这些类添加到列表中。接着初始化列表中的这些类,因为Class对象是JVM在加载类时自动构造的,所以可以通过Class.forName来得到在目标应用程序中想要的 Class对象。在这一过程中,考虑到在目标应用程序中没有找到目标Class对象这一现象,这说明该目标应用程序对OkHttp相关的代码进行了混淆或者该应用在进行网络请求时没有使用OkHttp框架。如果经过了混淆,那么可以通过相应类的代码特性(比如说被声明为final类型的属性的数量等)来找到该应用中对应的类。在这一步中我们查找的为OkHttpClient类、Builder类、Interceptor类、HttpLoggingInterceptor类以及HttpLoggingInterceptor$Logger类。

当一个应用使用square公司在开源代码中提供的拦截器时,需要该应用程序的项目代码具有该拦截器代码的压缩包,这个一般是通过 gradle下载的。所以在这里需要分两种情况,第一种情况是目标应用程序中具有该拦截器代码相应的压缩包,这时我们就可以直接得到该类的 Class对象;第二种情况是目标应用程序中不具有该拦截器代码相应的压缩包,此时就需要考虑在本地计算机中下载该压缩包对应的jar包,接着将该jar包转换为 dex文件(使用本地计算机的 SDK的dx工具),然后将该dex文件注入到目标应用程序所在apk的dex文件中,这样在该目标应用程序启动时,就会加载我们想要的拦截器的代码文件。

在上述的第二种情况中,我们下载到本地计算机中的压缩包为okio-1.15.0.jar和logging-interceptor-3.12.0.jar,转换后的 dex文件对应的分别为 logging.jar和 okio.jar。

接下来会详细叙述一下针对第二种情况的操作步骤。第一步,将logging.jar和okio.jar放置到安全容器所在程序的Assets目录下,然后通过代码将其赋值到手机的“/data/data/安全容器包名/app_文件夹名/logging.dex3.jar”中(注意,此时的logging.dex3.jar本质上为一个dex文件)。第二步,在安全容器中从目标应用程序的ClassLoader对象中拿到属性 pathList,该属性是 DexPathList类型的,是从其父类BaseClassLoader中继承而来的,表示需要加载的dex列表。第三步,拿到第二步中得到的pathList属性所对应的DexPathList对象的Element类型的数组对象dexElements,即dex列表相当于是存储在数组dexElements中。第四步,使用DexClassLoader动态加载“/data/data/安全容器包名/app_文件夹名/logging.dex3.jar”路径中的dex文件,类似于步骤二和步骤三的操作,得到该ClassLoader中的Element类型的数组。然后将第三步和第四步中拿到的两个数组合并,最后将合并完的数组,通过反射设置到该目标应用程序的 ClassLoader对应的数组中去,这样就完成了合并dex的工作。本文中合并dex文件的入口点是在安全容器中安装的目标应用程序的首页启动时,在完成dex合并之后,我们会通过该目标应用程序的classLoader手动地去加载与拦截器相关的类。

经过上述步骤后,就可以在目标应用程序中初始化一个日志拦截器,来对网络交互的数据进行打印。

4 实验结果

实验过程中分批从安智市场下载了阅读类、音乐类、旅游出行类、社交类和办公类等近百个应用,为了避免混淆,在我们的网络数据采集系统中每次只对一个目标应用程序进行测试。在实验过程中发现,大部分应用都采用了OkHttp框架进行网络通信。图5展示的是通过我们的拦截器框架拿到的某购书类应用程序的部分 HTTPS网络数据交互的一部分数据片段。实验表明,我们的网络数据采集系统具有实时性、准确性和完整性的特点。

5 结论

本文按照 Android软件栈的层次对涉及到的网络通信技术依次进行分析,进而提出一个基于Android安全容器的网络数据采集系统。本论文的研究对 Android平台上的应用程序行为分析具有重要的意义,同时也将引起人们对网络通信过程中数据安全性的重视。

猜你喜欢
拦截器网络通信应用程序
多动能拦截器协同制导规律的研究及仿真
英国MARSS公司推出新型反无人机拦截器
以色列“天锁”公司展出新式反无人机拦截器
删除Win10中自带的应用程序
基于网络通信的智能照明系统设计
谷歌禁止加密货币应用程序
网络通信中信息隐藏技术的应用
基于网络通信的校园智能音箱设计
谈计算机网络通信常见问题及技术发展
三星电子将开设应用程序下载商店