一种Android应用软件用户隐私信息泄露检测方法与流程

文档序号:11407985阅读:427来源:国知局
本发明涉及移动终端应用安全领域,更具体地涉及一种android应用软件用户隐私信息泄露检测方法。
背景技术
::目前,随着移动终端和移动4g网络的快速普及,移动终端应用数量呈爆发式增长,o2o服务、手机购物和移动支付等业务快速发展,越来越多的用户信息通过互联网上传给各类应用服务商,网民的手机信息安全环境日趋复杂。然而移动应用的安全问题也随之更加严重,被植入恶意代码,不良广告的恶意应用在用户人群中广泛传播,恶意代码将获取并泄露用户存储在手机上的密码账户等敏感数据信息,通过窃取用户信息给用户带来直接或间接经济损失的安全问题越来越隐蔽。比如通过手机病毒盗取用户银行账号密码、话费或流量等安全事件,大多数用户在遭受这类不法侵害后难以感知,等到发现经济损失后再采取应对措施则为时已晚。与此同时,一些移动终端应用的开发者并没有考虑到用户输入信息的安全性,将用户输入的隐私信息以明文形式存放在数据库或文件当中,甚至将用户输入的隐私信息通过明文的形式进行http的传播,给广大用户的财产和隐私安全带来了极大的威胁。android平台是目前最流行的移动终端平台,android应用的数量也占据着移动终端应用市场的绝大部分,所以提出一种检测android软件是否存在用户输入的隐私信息泄露的方法显得非常重要,这将有效地保护android移动终端持有者的个人隐私数据和财产安全。当前很多android应用程序都将用户输入的信息以文件、数据库的形式存放在手机当中,也会将用户的输入的信息通过网络发送到服务器端来达到数据更新、保存的目标。为了有效地保护用户输入的隐私信息,开发者需要在进行数据的存储和发送之前将数据进行有效地加密处理。但是市场中的很多应用是将用户的输入通过明文的形式进行网络传输和存储,给用户的隐私造成了很大的威胁。传统的检测android应用隐私泄露的方法是将一些敏感的android系统api设置为源头,然后通过数据流跟踪的方法跟踪这些敏感api数据数据传输路径,通过传输路径来判断应用是否存在泄露用户隐私的行为。这种方法存在以下两个方面的问题,首先,传统方案并不能针对用户输入的隐私信息进行跟踪从而判断是否将隐私信息泄露。然而判断用户的输入信息是否泄漏是进行隐私信息泄露检测的重中之重。其次是性能方面的问题,传统的方案将所有的android隐私api设置为源头,这使得针对应用分析的工作量很大,将导致针对一个普通的android应用软件的分析在很大程度上依赖于硬件资源,且非常耗时,难以实现对android应用软件的大批量检测。技术实现要素:由于检测用户输入的信息是否泄漏是隐私信息泄露检测的重中之重,针对上述问题,本发明的目的在于提供一种android应用软件用户隐私信息泄露检测方法,以检测用户输入的隐私信息是否存在泄露。根据以上目的,实现本发明的技术方案是:一种检测android应用软件用户隐私信息泄露的方法,其步骤为:1)将android应用软件进行反编译,提取出应用软件的所有用户输入点以及用户输入点的属性信息;2)根据预定义好的隐私数据字典从所有用户输入点中过滤出涉及隐私的用户输入点;3)对涉及隐私的用户输入点进行数据流跟踪,跟踪并记录用户输入的隐私信息的传播路径;4)根据用户输入的隐私信息的传播路径,检测android应用软件是否存在泄露用户隐私信息的行为。进一步地,步骤1)中,通过静态分析方法对android应用软件的apk安装包进行反编译,得到android应用软件的布局文件(xml格式)和smali代码(其中布局文件是android软件安装包中用来描述用户界面的文件,smali代码是android代码反编译后的中间代码),通过对布局文件进行分析,得到所有用户输入点以及用户输入点的属性信息。进一步地,步骤1)中,所述用户输入点的属性信息包括标识符id,输入框的提示字符串,输入框的密码属性等。进一步地,如果一个用户输入点的输入框指定的属性值包括textpassword、phone或textemailaddress,则该用户输入点是一个涉及隐私的用户输入点;如果输入框没有指定密码属性,则当用户输入点的android:id属性值在隐私数据字典中时,该用户输入点是一个涉及隐私的用户输入点;如果用户输入点的输入框没有指定密码属性,并且其android:id属性值不在隐私数据字典中,如果该用户输入点存在android:hint属性,则当用户输入点的android:hint属性在隐私数据字典中时,该用户输入点是一个涉及隐私的用户输入点。进一步地,步骤2)中,所述预定义的隐私数据字典是收集有涉及用户隐私的关键词的字典,所述关键词包括username,password,bankcard,gender,age等。进一步地,步骤2)中将步骤1)中提取出的所有用户输入点的属性信息与隐私数据字典中的关键词进行匹配,判断用户输入点是否涉及用户隐私。进一步地,步骤3)中,所述数据流跟踪为静态数据流跟踪,具体步骤包括:3‐1)对android应用软件进行分析生成其对应的调用流程图;3‐2)在调用流程图的基础上定义所有数据流跟踪的源头和终点;3‐3)从源头开始沿着调用流程图一步步进行跟踪,如果发现从源头到终点的路径,则保存该路径,即用户输入的隐私信息的传播路径。进一步地,所述数据流跟踪的源头包括获取用户输入点内容的api(也就是android.app.activity:android.view.viewfindviewbyid(int)以及其余类似的findviewbyidapi)以及根据需要设置非用户输入的隐私信息的源头api;所述数据流跟踪的终点包括读写文件,读写数据库和网络数据的发送。进一步地,步骤4)具体包括:在步骤3)获取到的隐私信息的传播路径的基础上,分析隐私信息传播的过程,判断在传播过程中android应用软件是否对用户输入的隐私信息进行编码以及加密处理,如果隐私信息存在以明文的形式进行传播的现象,则可认为该android应用软件存在泄露用户隐私信息的行为。与现有技术相比,本发明的有益效果为:本发明不仅能够检测非用户输入的隐私信息的泄露,包括地理位置信息和移动终端基本信息等,还包括了对用户输入的隐私信息泄露情况进行检测,将检测android应用软件隐私泄露的重点放在了用户的输入数据上,整个检测分为获取应用程序的用户输入点,对应用程序的用户输入点进行筛选,数据流跟踪,以及数据流跟踪结果的分析四个过程,保证了检测用户输入的隐私信息是否泄露的准确性。本发明的优点也包括对android应用各个组件的生命周期进行分析后,对传统android应用数据流跟踪方案进行了改进,大大加快了分析的速度并减少了对数据流跟踪对硬件资源的依赖。本发明可以有效地判断用户的输入是不是涉及隐私,并跟踪涉及隐私的用户输入的传播过程,最终判断应用是否将用户的隐私进行了泄露。由于本发明过滤掉了大部分不涉及隐私的用户输入,以及根据android应用组件生命周期特征对数据流跟踪方案进行的改进,故使得检测效率得到大幅度提高,具有很强的实用性。附图说明图1为针对android软件检测用户输入隐私信息泄露的总体流程图。图2为针对涉及隐私的用户输入点的数据流分析流程图。图3为函数调用图实例。具体实施方式下面通过具体实例和附图,对本发明做进一步详细说明。图1是本发明方法的总体流程图。首先分析android应用程序的apk安装包,得到了所有布局文件和代码,然后对布局文件和代码进行分析,将整个检测过程分为了获取应用程序的用户输入点,对应用程序的用户输入点进行筛选,数据流跟踪,以及数据流跟踪结果的分析。下面具体说明各个步骤。1)获取android应用程序的用户输入点首先反编译apk文件,得到所有的布局文件和smali代码,遍历所有的布局文件,提取所有的用户输入点,例如通常的用户输入是通过edittext元素(输入文本框)进行输入,以及开发者自定义的输入控件,这些控件继承edittext元素。收集提取到的所有用户输入点的属性,包括标识符id,输入框的提示字符串,输入框的密码属性等。例如,布局文件一般是由各种各样的控件组成,一般的用户输入点直接就是edittext元素,通过对布局文件的分析,将获得布局文件中所有的edittext元素以及属性信息。特殊情况下,如果控件不是标准的控件,是开发者自定义的控件,那么将通过定位自定义控件的实现代码,从而定位到自定义控件继承了哪种标准控件。如果开发者自定义的控件继承自edittext,那么也收集这个自定义控件的各个属性。2)进一步对应用程序的用户输入点进行筛选首先构建一个预定义的隐私数据字典,包括username,password,bankcard,gender,age等。通过将步骤1)中收集到所有用户输入点的属性信息与隐私数据字典的匹配,判断用户输入点是否涉及隐私。例如,如果一个用户输入点的android:inputtype是textpassword(比如,输入框指定android:inputtype="textpassword"或者android:password="true")、phone、textemailaddress等属性值的话,则这个用户输入点是一个涉及隐私的用户输入点;其次,当android:inputtype没有指明的时候,将获得用户输入点的android:id属性值,android:id属性是输入点的唯一标识符,通常android:id指明了输入点的输入内容,将该输入内容与隐私数据字典的关键词进行匹配,如果android:id包括了某个涉及隐私信息的关键词(比如,android:id="@+id/password"),那这个用户输入点是一个涉及隐私的用户输入点;最后,当用户输入点存在android:hint属性,android:hint属性指明了输入点的输入内容的性质,将该性质与隐私数据字典的关键词进行匹配,如果android:hint包括了某个涉及隐私信息的关键词,那这个用户输入点是一个涉及隐私的用户输入点。3)从涉及隐私的用户输入点进行数据流跟踪。i.定义数据流跟踪的源头和终点。数据流跟踪的源头是获取用户输入点内容的api,也就是android.app.activity:android.view.viewfindviewbyid(int)以及其余类似的findviewbyidapi。除了获取用户输入点内容的api外,还可以根据需要设置非用户输入的隐私信息源头api。数据流跟踪的终点包括读写文件,读写数据库和网络数据的发送。包括如表1所述的api(列出部分api):表1:部分敏感api列表java.io.outputstream:voidwrite(byte[])java.io.fileoutputstream:voidwrite(byte[])android.content.sharedpreferences$editor:booleancommit()org.apache.http.client.methods.httpget:void<init>(java.net.uri)android.database.sqlite.sqlitedatabase:voidexecsql(java.lang.string)ii.生成android应用的调用流程图,图3为函数调用图实例。函数调用流程图在数据流分析的过程中起着关键的作用,包括在代码里寻找源头和终点以及数据流跟踪的具体细节。activity、service、broadcastreceiver以及contentprovider组成了android应用的四大组件。不像传统的java程序,android应用里不含有单一的入口函数,无法简单地像分析java程序一样找到程序的入口和出口来勾画控制流图,但安卓应用的每个组件都有函数来反应此组件的生命周期,可以依托组件的生命周期来画出程序的控制流图。通过对各个组件的生命周期的分析,发现的特征包括:对用户输入的获取和处理多在存在于activity的生命周期当中等,根据这些特征对传统的调用流程图的生成进行了优化。对android应用的各个组件进行分析,生成android应用的函数调用图。如图2中,可以看到获取用户的输入是在onclickt函数中,这是用户界面中上一个按钮的点击响应处理函数。用户界面对应的是android当中的activity组件。iii.根据android应用的函数调用图,从代码中寻找源头和终点进行过滤并进行数据流跟踪。从函数调用图能到达的所有函数中,依次进行分析,从中寻找源头和终点,并根据步骤2)中产生的涉及隐私的用户输入点进行过滤。程序在从隐私输入点获取用户输入的第一步是通过findviewbyid系统函数获取到该用户输入点,findviewbyid的参数就是用户输入点android:id对应的数值,由于在2)中已经确定了隐私输入点而且可以获得android:id对应的数值,所以在代码中对findviewbyid的参数进行过滤,就可以确定数据流跟踪的源头。从过滤后的源头开始,对隐私输入点中输入的敏感数据进行跟踪,一旦存在从源头到终点的路径,将路径进行保存。4)数据流跟踪结果的分析对所有得到的敏感数据传播路径进行分析。根据已知的数据编码规则和常见数据加密方法,构建一个加密字典,字典里保存常见的对数据进行编码、加密的方法。收集的部分编码加密方法包括:base64、dataencryptionstandard、advancedencryptionstandard、rot13、rc4、idea等等。传播路径中包括了针对敏感数据进行的每一次操作,针对对敏感数据的操作,从字典找查找是否存在相应的编码与加密方式,如果存在,则证明对敏感数据进行了处理,从而可认为敏感数据的传播是安全的。如果在传播路径中没有对敏感数据进行编码和加密,则认为敏感数据存在被泄露的风险。图2是本发明关于隐私输入点数据流分析的流程图。例如,一段信息泄露的代码如下,在onclikckt函数中,将用户输入的敏感信息通过http发送出去。在android应用的界面布局文件中,通过分析edittext的android:id属性,可以确定该edittext是一个用户密码的输入框。并根据资源文件中public.xml确定该edittext的表示为213147414,所以确定213147414对应的用户输入点是涉及用户隐私的输入点。<edittextandroid:id="@id/passwordedit"android:inputtype="textpersonname"android:layout_margintop="16.0dip"/>在代码中,根据通过过滤findviewbyid的参数,可以确定在onclickt中findviewbyid(2131427414)的返回值就是敏感数据源的源头,从这里开始数据流跟踪,可以跟踪到隐私数据通过http发送出去。本发明方法得到的从源头到终点的一条路径如下:$r1=virtualinvoke$r0.<cn.ac.iie.myapplication.mainactivity:android.view.viewfindviewbyid(int)>(2131427414),$r2=(android.widget.edittext)$r1,$r3=virtualinvoke$r2.<android.widget.edittext:android.text.editablegettext()>(),$r4=virtualinvoke$r3.<java.lang.object:java.lang.stringtostring()>(),virtualinvoke$r0.<cn.ac.iie.myapplication.mainactivity:inttransfer(java.lang.string)>($r4),$r6=virtualinvoke$r1.<java.lang.string:byte[]getbytes()>(),virtualinvoke$r7.<java.io.outputstream:voidwrite(byte[],int,int)>($r6,0,$i0)可以看到路径中包括了对用户输入的数据的每一次操作,在这里是getbytes()和write()操作,通过与加密方法字典进行对比发现没有对输入进行加密和编码处理,所以该段代码存在隐私数据泄露风险。以上对本发明所提供的针对android应用软件的用户输入隐私信息泄露的检测方法进行了详细介绍,应用具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1