在Android平台上审计对私有数据的访问
维沙尔·马拉尔、纳奇凯特·特里韦迪和马尼克·拉尔·达斯(B)
印度信息技术与设计学院(DA‐IICT),甘地讷格尔,印度{vishalmaral, natchkeet.trivedi, maniklal.das}@daiict.ac.in
摘要
基于应用的实用服务在现代数字社会中取得了巨大成功。尽管移动平台上的基于应用的服务为生活带来了便利,但安装在手机上的应用所引发的安全和隐私问题对手机用户构成了潜在威胁。用户在手机上安装应用时,通常不会过多关注在手机屏幕上显示的隐私条款便直接接受。本文提出了一种安全监控器,这是一种用户级工具,用于检测移动应用对敏感数据的访问事件,并在出现可疑数据访问时向用户发出警报。该安全监控器无需安卓root权限即可在移动平台上运行,而是依赖于在字节码级别向应用程序包中添加钩子来实现。实验结果表明,提出的安全监控器能够有效检测应用对私有或敏感数据的访问,且几乎不会对手机的功耗和应用性能造成开销。
关键词 :安全监控器 · Security漏洞 · Android应用 · 隐私
1 引言
现代信息与通信技术使手机资源丰富,配备了智能传感技术,可用于银行、购物、公共服务、视频会议等各种应用程序。此外,除了实用应用程序外,Android应用市场还充斥着钓鱼和侵犯隐私的应用程序。这使得手机用户成为网络犯罪分子的潜在目标,因为用户的手机中存储了用户的个人信息,如金融数据、医疗数据和行为数据(通话记录、浏览历史等)。许多安卓应用会向用户设备请求权限和访问资源,从而收集数据用于营销和广告目的。恶意软件数量增加了50%,并出现了SilverPush等新的恶意软件技术[1]。SilverPush除了获取国际移动设备识别码(IMEI)、操作系统版本、位置和用户身份等移动设备信息外,还会通过麦克风监听电视、广播和网络广告中的近超声波声音,以了解用户观看或收听的广告类型。
安卓采用基于权限的模型来规范对特权数据和资源的访问。应用程序需要请求权限才能访问这些数据和资源,而用户通常倾向于跳过权限列表。即使用户接受了隐私条款并允许资源访问,他也很难在授权后获得有关资源如何被使用的任何信息。然而,仅根据用户接受的隐私条款将某个应用标记为可疑,并不可靠也不完整。从用户的角度来看,访问特定信息是否合理,取决于该信息所依赖的上下文环境。例如,社交网络应用若要为用户提供分享其访问地点的功能,则可能需要用户的地理位置信息;但当用户仅浏览帖子时,该信息则极不可能被需要。因此,从最终用户的角度来看,敏感数据被访问的“时间”非常重要。
本文中,我们提出了一种安全监控器——一种用户级工具,用于帮助检测安卓应用程序内的敏感数据访问事件。该提出的安全监控器无需安卓root权限即可在移动平台上运行,而是依赖于在字节码级别对应用程序包添加钩子。我们的方法包括:(i)向应用程序二进制文件添加报告代码补丁以跟踪数据访问,以及(ii)以非侵入性方式向用户发送警报消息,使其了解相关事件。我们对提出的安全监控器进行了实验,发现其在不增加应用程序性能开销的情况下,有效检测了应用的敏感数据访问。
本文其余部分组织如下。第2节介绍安卓应用安全分析的相关背景和工作。第3节提出安全监控器。第4节提供所提出工作的实验结果。我们在第5节总结全文。
2 背景与相关工作
2.1 安卓安全机制内部原理
安卓主要依靠权限机制来实现安全执行。如果一个应用想要使用敏感数据资源,开发者需要在应用的清单文件(AndroidManifest.xml)中进行声明。受保护的系统资源通过应用程序编程接口进行访问。每个敏感API都被分配了一个权限标签,即一个唯一的安全标签。作为安卓包一部分的清单文件会在安装过程中被安卓操作系统解析,并将权限列表呈现给用户。
安卓的软件架构由四层组成:Linux内核、本地用户空间、应用框架和应用程序。经过若干自定义修改的Linux内核是安卓的核心。本地用户空间和应用框架层统称为安卓中间件。硬件抽象层为上层用于与硬件层交互的API提供实现。应用程序在安卓操作系统中通过安卓运行时执行,而安卓运行时是基于寄存器的运行dex格式并支持Dalvik字节码规范的虚拟机。安卓的一些组件和服务,如媒体框架、SQLite,是使用原生代码构建的,构成了安卓的原生库部分。Android框架指的是Java API,用于访问整个软件栈提供的功能集。
2.2 相关工作
2012年,谷歌公布了其部署的一项名为Bouncer的服务,该服务可自动扫描提交至Google Play商店的应用,以检测是否存在恶意行为。奥伯海德[2]通过实验证明,Bouncer会在模拟的Android环境中对提交的应用程序进行特定时间的动态运行时分析,如果应用执行了攻击性活动(例如扫描系统密码、频繁执行系统调用等),则会被标记。乌莱哈[3]开展的调查也表明,Bouncer执行的安全测试主要集中于对AndroidManifest.xml的检查和动态运行时分析,且容易被绕过。这表明Bouncer的主要目的并非检测侵犯隐私的应用,而是检测恶意应用。
静态分析
列昂尼德等人 [4]提出了一种方法,该方法对反编译后的应用进行静态分析,并将检测结果生成用户可读且易于理解的报告。司源等人 [6]扩展了静态分析,通过构建调用流图来实现过程间分析。陈等人 [7]建议在构建调用流图之前,先将Dalvik字节码转换为Java字节码。苏莱曼等人 [8]采用了贝叶斯分类,因其计算开销较低,并且能够相对容易地对已训练和未充分训练的系统进行建模。萨斯和汗[9]使用仅从良性样本中训练出的单类SVM模型。赵等人 [10]利用良性与恶意应用程序数据集构建基于 SVM的分类器,用于基于签名的恶意软件检测。
动态分析
恩克等人 [11]修改了安卓操作系统的DVM解释器以实现变量级跟踪。罗尚德尔等人 [12]修改了Android操作系统的ContentObserver类,以监控通过内容URI(如联系人、书签、媒体等)访问的数据。贾等人 [13]建议修改原生层以拦截Binder IPC调用,从而监控应用的隐私数据访问行为。贝尔托姆等人 [14]提出对应用程序重新打包,注入一小段代码作为审计报告器。全等人 [5]结合静态分析与动态分析方法,提出了一种混合模型:首先使用权限组合矩阵识别潜在风险应用,然后由动态监控模块跟踪那些经权限分析发现可疑的应用程序对敏感API的运行时调用。
位置隐私
Montjoye 等人 [15]表明,在150万人的位置数据中,仅通过四个随机选择的位置点就可识别出多达95%的用户。Fu 等人 [16]提出了一种启发式方法来检测安卓应用对位置的访问,该方法基于以下考虑:只有当任何应用接收到位置更新时,getLastKnownLocation()的返回值才会发生变化。Fawaz 等人 [17]提出了LP‐Doctor,该工具允许用户在应用间歇性访问用户位置数据的同时缓解画像威胁,并保持应用所需功能。使用LP‐Doctor的困难在于它并非真正的用户级工具,它需要开发者权限才能使用dumpsys工具,而该权限只能通过Android开发工具授予。
网络监控
拦截网络流量以分析通过网络发送的数据是识别泄露的另一种主要方法。Arora 等人[18]建议通过分析网络流量进行恶意软件检测,其中借助决策树分类器将恶意流量与合法流量区分开来。Song 和 Hengartner [19]提出了PrivacyGuard,用于拦截安卓应用的网络流量,其利用了安卓提供的 VPNService API。PrivacyGuard使用字符串匹配来检测泄露,因此只有在数据以明文格式发送时才有效。
3 提出的安全监控器
提出的安全监控器的工作原理分为两个阶段。在第一阶段(主动阶段),每当安装新应用时,监控器会获取应用程序包,反编译它,在字节码中添加报告模块,并重新打包应用。第二阶段(监听阶段)包括在引入的补丁生成通知时,向用户告知敏感数据访问。
安卓广播
android.intent.action.PACKAGE_ADDED
意图 (Intent[20] 是响应事件提供运行时绑定的对象,其中包含发生动作或事件的名称以及相关数据) 每当新应用安装时。安全监控器监听这些意图并开始运行。首先,通过 PackageManager 的帮助复制已安装应用的 apk。一旦获取了 apk,就借助 Apktool 对其进行反编译。然后,在反编译步骤中,将 apk 中包含的 Dex 字节码转换为可读的 Smali 代码。反编译后,Reporter 类被添加到应用中(以 Smali 格式),该类包含一个 report 方法,该方法生成一个带有位置访问动作的意图,并附加数据包含应用名称和访问时间。此方法用于在运行时发出通知。
为了获取上下文,initContext 方法被放置在启动活动中,以保存应用上下文实例。
算法 1. 安全监控器的重新打包过程
1: 反编译 APK
2: 从 Manifest 文件中确定启动器活动
3:向包中添加 Reporter 类
4:在启动活动中向 Reporter 类的 initContext() 方法添加调用,以保存 ApplicationContext
5: 对于包中的每个 Smali 文件执行以下操作
6: 扫描 Smali 文件以检测敏感数据访问
7: 在访问敏感数据的任何位置添加对 Reporter 类 report() 方法的调用
8: 编译成 APK
9: 签名 APK
10:安装新创建的 APK
通过扫描 Smali 代码检测针对敏感用户数据的操作。然后可以通过将参数传递给方法 getLastKnownLocation,使用 LocationManager 检索可用的位置坐标。如果应用希望接收连续的位置更新,它可以通过调用方法 requestLocationUpdates 来实现。监控器的 Smali 解析器会在反编译得到的 smali 文件中搜索此类调用。当发现此类调用时,会在该处添加对 report 方法的调用,该方法属于 Reporter。修改后的 Smali 代码库随后被重新组装,并且生成的 APK 使用我们自己的证书进行数字签名。在运行时,每当访问位置时,就会调用 report 方法,最终生成一个 Intent。算法 1 反映了监控器的运行逻辑。
在操作的第二阶段,监控器监听报告器生成的意图并记录访问尝试。生成一条吐司消息以通知用户哪个应用访问了位置。
4 结果与分析
我们在联想 A6000 设备上测试了安全监控器,该设备运行安卓 5.1 系统,配备 2GB 内存、1.2GHz 四核 CPU 和 2300mAh 电池。我们测试了 25 个请求位置访问权限的谷歌应用商店应用,这些应用声称可为用户提供各种基于位置的功能。
我们提出的方法成功重新打包了所有应用程序,除了“mcdeliveryonline”应用,且安全监控器能够接收到访问通知。对于“mcdeliveryonline”应用,注入失败,原因是监控器无法定位入口方法。我们运行注入后的应用长达 24 小时。
图1中的观测结果表明,应用在后台最长可达1.5小时持续访问位置信息,最多可达432次。对于5–10MB大小的APK,电池消耗约为2%,这表明由于监控器的操作,CPU并未承受较大负载。为了评估因注入而导致的重新打包应用操作开销,我们通过记录操作前后的时间戳来确定所产生的延迟。
调用报告函数。观察到的值表明,注入引起的延迟微乎其微,仅为2到5毫秒。
5 结论
我们提出了一种用户级工具,用于检测应用程序的敏感数据访问,并在出现可疑数据访问时向用户发出警报。为了审计安卓应用程序的私有数据访问事件,我们采用了重新打包方法。该安全监控器无需安卓root权限即可在移动平台上运行,而是依赖于在字节码级别对应用程序包添加钩子。通过对26个应用程序的实验结果表明,提出的安全监控器能够检测88%应用程序的敏感数据访问,且对功耗和应用性能几乎无开销。
Android私有数据访问监控方案
40

被折叠的 条评论
为什么被折叠?



