当前位置:首页 期刊杂志

安卓应用中的信息泄露问题探究

时间:2024-09-03

◆吴中超 许国祥 王 瑜

(信息工程大学 河南 450001)

安卓应用中的信息泄露问题探究

◆吴中超 许国祥 王 瑜

(信息工程大学 河南 450001)

作为当今世界最流行的新兴移动操作系统,安卓系统的应用安全重要性日益提高。安卓应用通信架构由服务器、客户端两部分构成,均存在敏感信息泄露的安全隐患。本文从这两方面入手,分析安卓应用生态目前出现较多的信息泄露问题及导致危害,并分别探讨了针对主要漏洞类型的应对手段。

安卓系统;移动互联网;应用安全;信息泄露

0 引言

移动操作系统的生态链正从智能手机拓展到诸如平板电脑、智能家居、可穿戴智能设备、车联网、嵌入式系统等多种衍生产品中,日益驱动着互联网技术的改变和发展。作为移动互联网时代的突出标志之一,移动应用 APP聚集了大量的高附加值信息和资源。这些信息和资源不仅包含个人手机信息、身份信息、经纬度地理位置等,还包含了多个应用或网站的账号密码信息、个人电子邮件、隐私文件等诸多信息。

在过去的2016年中,国内个人信息泄露事件频发。中国互联网协会2016年发布的《中国网民权益保护调查报告》中指出,在整个2016年,中国网民因个人信息泄露、垃圾信息、诈骗信息等现象导致总体损失约915亿元。其中,78.2%的网民个人身份信息被泄露过,包括网民的姓名、学历、家庭住址、身份证号及工作单位等;63.4%的网民个人网上活动信息被泄露过,包括通话记录、网购记录、网站浏览痕迹、IP地址、软件使用痕迹及地理位置等。在个人信息泄露带来的不良影响上,82.3%的网民亲身感受到了个人信息泄露对日常生活造成的影响。近年爆发的多个安卓系统漏洞,其影响力动辄覆盖过亿安卓手机用户,造成大量用户隐私泄露风险。

面对移动互联网用户隐私保护的严峻形势,隐私泄露的检测和保护近年来颇受关注。本文结合本人在清华大学网络与信息安全实验室参与的安卓APP渗透测试项目、全国高校校园网 APP测试项目及正在进行的研究工作,揭示了移动应用隐私泄露检测和防护的总体进展,并针对影响范围较广的典型问题给出针对性修复方案。

1 安卓应用app客户端的信息泄露问题

1.1 应用敏感数据明文存储在本地文件中

Android应用程序运行中必然涉及数据的输入、输出。例如应用程序各个参数设置、程序运行中的状态等数据都需要保存到外部存储器上,否则系统关机之后数据将会丢失。

若应用程序中需要保存的数据较少,且数据格式简单(字符串、整型值等),可使用 SharedPreferences进行保存。若应用程序有大量数据需要存储、访问,就需要用到数据库。如果SharedPreferences创建时模式设为可读可写,则文件中内容极易被其他应用获取。如果文件中内容为明文或明文编码(base64等),则会造成敏感信息泄露。

例如,在某app中,应用会将使用过的用户信息(包括用户资料、id等)以明文的形式存储在SharedPreferences文件中(如图1所示),内容可直接被获取。

改进方式:避免使用 MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE模式创建Shared Preferences文件;避免把密码等敏感数据信息明文存放在 Shared Preferences文件中。

图1 SharedPreferences文件内容

1.2 content provider 访问控制缺失

在安卓系统中,content Provider用来提供数据的统一访问方式。如果某个应用中有数据需要提供给其他应用访问,无论数据存储在数据库中,还是在文件甚至在网络中,都可以通过content provider提供的接口来访问。

如果在 AndroidManifest文件中将某个 Content Provider的exported属性设置为true,则可在外界任意位置直接访问其数据。如果此 Content Provider的实现有问题,则可能产生任意数据访问、SQL注入、目录遍历等风险。

例如,在某校园网图书馆app中,利用drozer查询应用中的provider信息,可发现该应用中有两个content provider组件,继续查询其中设计的 provider uri;逐个进行查询尝试,发现其中存储密码值的uri可不需权限,直接查询得到结果,如图2所示。

图2 用户名、登录密码、邮箱等敏感信息

改进措施:对于需要开放的组件应设置合理的权限,如果只需要对同一个签名的其它开放 content provider,则可以设置signature级别的权限。

1.3 本地sql语句非法拼接导致注入隐患

SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。它可以通过在Web表单中输入恶意SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

若应用对传入的查询参数不做处理或检验,而直接拼接进sql查询语句,则可能导致SQL注入。攻击者可根据表中实际情况进行手动或编写脚本自动化遍历,以获取数据库中当前权限允许查询的所有内容。

例如,某款app均存在sql不规范查询(如图3所示),可能导致注入攻击。

图3 不规范的sql查询

对app中的sql不规范查询点进行逐个注入尝试,可获取其中某应用的数据库内容,如图4所示。

图4 数据库内容

改进措施:在查询代码中使用参数化查询,杜绝用户参数直接拼接入SQL语句,以防止SQL注入攻击的产生。

2 安卓应用服务端的信息泄露问题

2.1 cookie 管理不当

服务器通过操作Cookie类对象对客户端Cookie进行操作。通过request.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回),通过 response.addCookie(Cookiecookie)向客户端设置Cookie。

HTTP协议不仅是无状态的,而且是不安全的。使用 HTTP协议的数据不经过任何加密就直接在网络上传播,有被截获的可能。使用HTTP协议传输机密内容是不合理的。如果不希望Cookie在HTTP等非安全协议中传输,可以设置Cookie的secure属性为true。浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性。

结合webview控件中对敏感字符过滤存在问题,导致xss问题的出现。攻击者可以获取受害者cookie等敏感信息,达到仿冒登录等目的。

2.2 服务器异常响应未封装为统一页面

发生意外事件时,许多web应用程序返回详尽的错误信息。从仅仅披露错误类型的简单内置消息到泄露许多应用程序状态细节的详细调试信息都涵盖在错误消息中。

如果在解释型web脚本语言中出现错误,应用程序通常会返回一条简单的错误消息以揭示错误本质,还可能会有发生错误的文件的行号。大多数Web应用程序的语言编写,例如Java、C#和 VB.NET等语言中如果出现无法处理的错误时,报错信息中往往会显示完整的栈追踪。另外,数据库、邮件服务器或SOAP服务器等后端组件也会返回详尽的错误消息。

例如,在某app webview控件中,访问服务器端提供web页面时,查询参数直接列在url中。若攻击者没有此项查询权限,尝试该查询url使得缺失某项参数时,服务器会自动给出提示,提示如图5所示。

图5 服务器给出的提示

这实际上是暴露了服务器端数据库中对应表中的表项名称。攻击者只需补齐服务器提示的这项参数,服务器就会再次提示下一参数,如此反复,最终给出服务器所需的所有参数。这给攻击者带来很大便利,能够容易地掌握数据库中各表项名称,为 sql注入攻击提供很大参考价值。

改进方式:只要有可能,应该禁止应用程序公布对攻击者有用的信息;如果某些用户需要访问这些信息,应使用访问控制对它们进行有效保护,并且只有在完全必要时才提供这些信息;如果必须向授权用户透露敏感信息,那么在不必要时也不得披露现有数据。

2.3 sql 注入攻击

SQL注入发生时,攻击者将SQL代码插入或添加到应用的输入参数中,之后再将这些参数传递给后台的SQL服务器加以解析并执行。如果应用未对SQL语句使用的参数进行正确性审查,未过滤其中的非法字符或敏感字等,尤其是如果直接将用户输入拼接到SQL语句执行,而非执行参数化查询,则很可能会导致注入攻击的产生。

例如,某app服务器存在sql注入漏洞,可构造注入脚本进行查询。编写脚本,对数据库中相应表做遍历,可以得到数据库中所有用户名称及密码等敏感信息,如图6所示。

图6 泄露的用户名

改进方式:在SQL查询语句中,应始终将用户输入作为潜在威胁数据,对其敏感操作符、敏感词进行严格校验,并防止用户输入直接拼接入sql语句,而应采用参数化查询方式。

2.4 目录遍历漏洞导致任意文件读写

目录遍历是Http所存在的一个安全漏洞,它使得攻击者能够访问受限制的目录,并在服务器的根目录以外执行命令。这个漏洞可能存在于服务器软件本身,也可能存在于应用程序的代码之中。利用目录遍历漏洞,攻击者能够跳出服务器的预定目录,从而访问到文件系统的其他部分,譬如攻击者能够看到一些受限制的文件,或者更危险的,攻击者能够执行一些造成整个系统崩溃的指令。

如果目录遍历漏洞与文件下载相结合,可以导致任意文件下载漏洞,使得系统密码、关键配置等文件被盗取。如果目录遍历漏洞与文件上传相结合,可以导致任意文件上传漏洞,使得攻击者可上传任意脚本,可能导致任意代码执行等。

例如,某app服务器中直接将用户名称拼接进用户文件夹路径,且未对用户名称做合法性校验。我们可以发包手动构造一个名为../../../LY的用户,则通过路径拼接与跳转可以访问本来无权限访问的文件。

手动ajax发包内容如图7所示。

图7 手动ajax发包内容

执行完成后得到异常用户名。访问系统中规定的下载文件链接 DownloadZip.do?folderName=LY&zipFileName= 通 过zipFileName 进行目录跳转从而实现任意文件读。

zipFileName=../../../../../etc/passwd时,可以获得记录系统用户密码的关键文件:/etc/passwd

改进方式:对用户输入进行严格校验,杜绝目录跳转字符拼接入目录所在字符串。

3 总结与展望

目前的研究主要通过手工借助逆向分析或网络抓包工具实现,人工梳理应用的代码实现逻辑,再结合威胁模型,挖掘潜在的漏洞并实施攻击。没有尝试漏洞挖掘的自动化实现方案,目前无法实现对大量Android应用的安全性分析。接下来的工作,可以结合手动漏洞挖掘过程发现的漏洞特征,采用一些程序分析的方法,开发一款针对Android应用登录过程的自动化分析工具,实现对Android应用的批量扫描,再结合扫描结果进行针对性的人工分析,将大大提高漏洞挖掘效率。

[1]C.Gibler,J. Crussell, J. Erickson , and H. Chen.AndroidLeaks: Automatically Detecting Potential Privacy Leaks in Android Applications on a Large Scale, on International Conference on Trust & Trustworthy Computing,2012.

[2]E Chin,AP Felt ,K Greenwood ,D Wagner:Analyzing inter-application communication in Android,on International Conference on Mobile Systems,2011.

[3]Z Yang,M Yang:LeakMiner:Detect Information Leakage on Android with Static Taint Analysis,on Software Engineering,2013.

[4]L Lu,Z Li,Z Wu,W Lee,G Jiang:CHEX:statically vetting Android apps for component hijacking vulnerabilities,on Acm Conference on Computer & Communications Security,2012.

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!