APP安全漏洞学习笔记

APP安全漏洞学习笔记

        本文首先明确了APP安全的目标,然后对常见的APP漏洞进行了整理分析,并研究学习了APK的静态分析与动态分析技术,最后介绍了安卓的渗透测试技术和常见的安全评估工具。附录处整理了2014年和2015年的OWASP移动风险Top10.

1.安卓APP安全的目标

1.1保护用户的数据

        用户在使用APP时通常不得不交付一些敏感数据给APP,如文献[[1]][[2]]所介绍的用户输入隐私,这些隐私包含了用户凭证、财务信息、医疗信息等,只要愿意,APP可以把这些敏感数据都缓存下来,因此APP需要采取一些强制措施来保护用户的数据安全,需要确保其机密性、完整性、可用性、不可否认性、可认证性。

        而用户数据又分为两类,一类是操作系统预定义的敏感API,如设备标识符(电话号码,IMEI等)、位置信息、通讯录、日历、浏览器信息等,对这些数据的保护主要采取了权限保护的手段。这些的确是非常重要的用户隐私,但是并没有覆盖所有的用户隐私和敏感数据。还有一类则是用户输入的敏感信息,这些敏感数据在APP的用户敏感数据中占了很大的比重,值得进一步的研究学习。文献[1][2]中研究了如何识别用户输入隐私,在安全评估的工作中,可以借鉴这两篇文献中的方法,识别出用户输入隐私,并分析APP是否对这些隐私进行了足够的保护,以此来对APP的安全等级做出评分。

1.2APP间的保护(隔离与权限分离)

        APP是由安卓沙箱保护的,Android“沙箱”的本质是为了实现不同应用程序和进程之间的互相隔离,即在默认情况 下,应用程序没有权限访问系统资源或其它应用程序的资源。每个APP和系统进程都被分配唯一并且固定的User Id,这个uid与内核层进程的uid对应。每个APP在各自独立的Dalvik虚拟机中运行,拥有独立的地址空间和资源。运行于Dalvik虚拟机中的 进程必须依托内核层Linux进程而存在,因此Android使用Dalvik虚拟机和Linux的文件访问控制来实现沙箱机制,任何应用程序如果想要访 问系统资源或者其它应用程序的资源必须在自己的manifest文件中进行声明权限或者共享uid。

        APP间的保护主要工作在操作系统层面,不在本文的研究范围内,因此不做深入讨论。

1.3保护敏感信息的通信

        仅仅保护APP存储的数据是远远不够的,APP几乎都包含了通信——网络通信、与其他APP的通信以及与其他设备的通信(NFC、蓝牙、GMS、Wifi等),假设一个APP很好的保存了用户的信息,但却在网络中用HTTP进行明文的纯文本传输,那么再好的保护了用户信息的存储也毫无意义,故而通信安全也十分关键。

        同样,在通信中,要确保数据的机密性、完整性、可用性、不可否认性、可认证性。

2.安卓APP漏洞整理

2.1安卓漏洞现状

        文献[[3]]整理了2008年-2015年NVD(National VulnerabilityDatabase)中的安卓漏洞数量变化,如图1所示。可以看到,2014年有一个异常明显的高峰,这主要是由于SSL协议类库出现了多个影响范围非常大的漏洞,导致大量应用受到波及,此类漏洞占到2014年总漏洞的92%(1401/1518)除此之外,

2014年还出现FakeID代码注入漏洞、TowelRoot本地提权漏洞和WebView组件UXSS漏洞等多个严重级别系统漏洞,也引起了人们的重视。

扫描二维码关注公众号,回复: 8790202 查看本文章

图1 2008年-2015年NVD中的安卓漏洞数量变化

        随着AOSP(Android Open Source Project)代码质量的提高,系统漏洞的数量在不断减少,但随着安卓应用市场的繁荣,应用漏洞的数量却在不断攀升。

        资料[[4]]中给出了多种流行的恶意软件,这些恶意软件很多都是通过恶意篡改APP代码,使原本不具有危害性的APP成为恶意软件。例如流量消耗木马,该木马通过重打包方式内嵌在第三方流行应用中,流量消耗木马运行后第一时间动态加载附带的恶意子包,该恶意子包通过自动化模拟点击广告获取利益,这会消耗大量用户流量。木马还会定期请求远端服务器获取最新恶意子包,目前最新版本恶意子包增加了利用设备漏洞获取root权限的功能,获取Root权限后,恶意子包会安装附带的AndroidRTService.apk为系统程序(防止用户卸载)。还有刷榜木马,现在App营销和推广的难度越来越大,刷榜被普遍认为是一种应用推广的最佳捷径,它能够在短期内大幅提高下载量和用户量,进而提高应用的曝光率。该木马内嵌于正常应用中,当用户安装此类应用后,用户设备即成为刷榜僵尸,该木马会消耗用户大量的流量。还有关机窃听病毒,该病毒通过Hook系统shutdown方法实现关机拦截,当用户关机时弹出自定义黑色界面,使手机处于“假关机”状态,然后在后台窃取用户短信、联系人、通话记录、位置信息、通话录音,上传到服务器。

2.2安卓漏洞利用

        这一部分的漏洞利用涵盖了安卓开发的四大组件:activity,service, broadcast receiver和content provider。还有另外一个重要的组件intent。来自资料[[5]]

(1)收集logcat泄漏的信息

        安卓APP可能由于自身固有问题导致泄漏敏感信息,如果发生了,则被称为一个“信息泄漏”漏洞。而通过检查安卓的logcat,可以检查一个APP是否有泄漏敏感信息的潜在可能。相应的,黑客也可以通过logcat来寻找信息泄漏漏洞。

        使用ADB工具,可以通过正则表达式来找出一些日志文件泄漏的与登录或验证令牌相关的字符串:

        adblogcat | grep –i “[\w\s_-]*token[\w\s_-]*”

(2)通过activity manager被动嗅探intent

        监听APP内部的通信是大量获取APP及其组件的相关信息的一个好办法。一种途径就是从activity manager那里获取关于最近使用的intent的信息。Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。这可以通过drozer来完成,drozer是一个著名的安卓安全评估工具,会在本文的第五部分重点介绍。

        Intent嗅探脚本首先调用一个Context.getSystemService()函数,并传给它一个ACTIVITY_SERVICE标志的标识符,该函数反悔一个ActivityManager类的实例,它使得该脚本能够与activity manager进行交互,并通过这个对象调用ActivityManager.getRecentTasks()方法。最后把intent相关的信息格式化成字符串返回出来。

(3)攻击service

        Service(服务)是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service与之交互(IPC机制),例如,一个service可能会处理网络操作,播放音乐,操作文件I/O或者与内容提供者(content provider)交互,所有这些活动都是在后台进行。从表面上看service并不具备危害性,但实际上service可以在后台执行一些敏感的操作。

(4)攻击broadcast receiver

        Broadcastreceiver响应各个软件/硬件级事件。broadcast receiver执行一些敏感操作时,会通过intent来传递这些信息,这种传递数据的方式是容易被恶意攻击的。在发掘broadcastreceiver中的漏洞时,最大的问题是确定输入是否可信,以及破坏性有多强。

        以下面这段代码为例(有缩略):

        <receiver

android:name=”.broadcastreceivers.SendSMSNowReceiver”

android:label=”Send SMS”>

        …………

                 <actionandroid:name=”org.owasp.goatdroid.SOCIAL_SMS” />

        …………

        <uses-permissionandroid:name=”android.permission.SEND_SMS”/>

        …………

        在上面这段代码中,滥用了一个没有进行适当权限保护的broadcastreceiver,由于这个组件缺乏权限保护,使得攻击者可以在没有发送短信权限的情况下发送短信,这个漏洞的危害在于,攻击者可以在用户不知情的情况下发送短信去订购一个付费服务,或者泄漏设备中的信息。

(5)枚举有漏洞的content provider

        Contentprovider中通常都含有大量有价值的信息,比如用的电话号码或者社交帐号登录口令,而确认一个content provider是否有能被攻击的漏洞的最好的办法,就是尝试攻击它一下。

        可以用drozer来寻找一些不需要权限的content provider:

        dz>run app.provider.info –permission null

        这条命令能列出所有不需要任何读写权限的content provider,然后找到相对应的包,去访问给定包存放在它的content provider中的数据,下一部分讨论如何提取这些数据。

(6)从有漏洞的content provider中提取数据

        如果一些content provider的URI不需要读权限,那就可以通过drozer工具提取其中的数据。在某些情况下,设置和执行读写权限不当,也会将content provider中的数据暴露给攻击者。然后是提取的具体步骤。

        除了提取数据,对于写权限管理不当的content provider还可以向其中写入数据,使得攻击者可以将恶意数据插入到数据库中。

(7)枚举有SQL注入漏洞的contentprovider

        和Web漏洞类似,安卓APP也要使用数据库,那就也有可能存在SQL注入漏洞。主要有两类,第一类是SQL语句中的查询条件子语句是可注入的,第二类是投影操作子句是可注入的。使用drozer可以很容易的找出查询条件子句可注入的content provider。

        dz>run app.provider.query [URI] –selection “1=1”

        也可以使用其他恒为真的值,例如”1-1=0”,”0=0”等等。

        如果APP存在SQL注入漏洞,那么输入这行指令后就会返回数据库中的整张表。

(8)利用可调试的APP

        APP可以被标记为可调试,这就允许在APP执行的过程中设置断点,这对于开发而言十分方便。但应用商店中一些APP仍然被标记为可调试,这就存在着很大的安全隐患,攻击者可以非常容易的访问到APP中的一些敏感数据。尽管这一漏洞十分简单,但确是千真万确存在着的。

        首先要确定APP是否可调试,这直接取决于APP的Manifest,依旧使用drozer来枚举可调试的APP。

        dz>run app.package.debuggable

        这条命令会列出所有被设为可调试的package,以及他们被赋予的权限。

(9)对APP做中间人攻击

        使用Ettercap进行中间人攻击,该实验在kali linux相关的实验中已经完成,此处不再研究。

3.APK静态分析技术

        本节内容来自资料[[6]],主要是对APK文件进行逆向攻击,实现代码篡改,并没有涉及静态分析代码的安全性。静态分析代码安全性的学习将在下周进行。书中还谈到了二进制文件的处理,难度实在太大,暂时搁置。

3.1什么是静态分析

        应用程序静态分析是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。在安卓平台上,代码静态分析主要是指分析APK文件。

3.2常用工具

(1)资源逆向工具AXMLPrinter2

APK文件中的资源都是经过压缩的,以AXML格式存在,需要用工具将其转化为可读的XML文件,AXMLPrinter2就是完成这一工作的。

(2)查看源码工具dex2jar,jd-GUI

        dex2jar是用来将安卓的Dalvik Executable(.dex)格式文件转化为Java类文件的工具,jd-GUI则是查看Java源代码的图形化工具,可以使得jar文件中的代码、结构、字段都变成Java文件,方便直接阅读查看。

(3)APK逆向工具APKTool

        用于反编译。

(4)Android逆向助手

        集成了多种逆向工具,只能在Windows平台上运行。

3.3篡改代码

        篡改代码是指使用第三方工具,在未经开发者同意的情况下,在程序中修改、删除或增加某一特定的代码,在2.1中就介绍了一些篡改代码的恶意软件。在附录中的OWASP移动风险TOP10中可以看到,代码注入、代码篡改、逆向工程一直都是严峻的安全风险。

        篡改代码的思路并不复杂,首先使用APKTool对应用的APK文件进行反编译,拿到代码.smali文件与资源.xml文件,接下来定位到具体的代码和资源处,确定要添加的内容并进行关键代码注入,然后编译为APK文件,重签名,最后验证是否注入成功。

        通常情况下代码篡改都是为了植入广告,这只需要在反编译出来的代码中插入广告相关代码即可。还有就是破解应用的收费限制,大多数应用的功能已经继承进入了APK文件中,开发者只是加入了一个收费来限制对这些功能的使用,通过代码篡改,删除相关的逻辑代码,即可破解应用的收费限制。

4.APK动态分析技术

4.1什么是动态分析

        应用程序动态分析是针对静态分析而言的,动态的意思就是指通过在真实或模拟环境中执行程序进行分析的方法,多用于性能测试、功能测试、内存泄漏测试等方面。安卓平台上的动态分析主要是指使用一些调试工具,如DDMS、emulator、Andbug、IDAPRO等仿真模拟工具,调试分析APP中的Log、文件、内存和通信信息等。

5.安卓渗透测试及安全评估工具

5.1Santoku系统

Santoku是一个移动安全渗透测试系统,这个系统基于ubuntu12.04-64bit,里面有很多常用的渗透测试工具,类似于Kali Linux,这个系统具有以下特点:

l  集成了大量主流的Android程序分析工具,比如apktool、dex2jar、androguard、baksmali等,为分析人员节省分析环境配置所需的时间。

l  集成渗透测试工具。比如Burpsuite、nmap、mercury。

l  集成网络数据分析工具。比如wireshark。

具体集成的工具清单如下:

(1)开发工具

Android SDK Manager,AXMLPrinter2,Fastboot,Heimdall (src | howto),Heimdall (GUI) (src | howto),SBF Flash。

(2)渗透测试工具

Burp Suite,Ettercap,Mercury,nmap,OWASP ZAP,SSL Strip,w3af (Console),w3af (GUI),Zenmap (As Root)。

(3)无线分析工具

Chaosreader,dnschef,DSniff,TCPDUMP,Wireshark,Wireshark (As Root)。

(4)设备取证工具

AFLogical Open Source Edition (src | howto),Android Brute Force Encryption (src | howto)

ExifTool,iPhone Backup Analyzer (GUI) (src | howto),libimobiledevice (src | howto),scalpel,Sleuth Kit。

5.2drozer

drozer是一款针对Android系统的安全测试框架。堪称目前最好的安卓安全测试工具。drozer可以帮助Android app和设备变得更安全,其提供了很多Android平台下的渗透测试exploit供你使用和分享。对于远程的exploit,它可以生成shellcode帮助你进行远程设备管理。Drozer有以下特点:

l  更快的Android安全评估

drozer可以大大缩减Android安全评估的耗时,通过攻击测试暴露Android APP的漏洞。

l  基于真机的测试

drozer运行在Android模拟器和真实设备上,它不需要USB调试或其他开发即可使用。

l  自动化和扩展

drozer有很多扩展模块,你可以找到他们进行测试以发现Android安全问题。

附录:OWASP移动风险Top10

(1)2014年OWASP移动风险Top10

M1:薄弱的服务器端控制(Weak Server Side Controls)。

M2:不安全的数据存储(Insecure Data Storage)。

M3:传输层保护不充分(Insufficient TransportLayer Protection)。

M4:非预期的数据泄漏(Unintended Data Leakage)。

M5:较差的授权和身份认证(Poor Authorization andAuthentication)。

M6:被破译的加密(Broken Cryptography)。

M7:客户端注入(Client Side Injection)。

M8:通过不被信任的输入做出的安全决策(Security DecisionsVia Untrusted Inputs)。

M9:不正确的会话处理(Improper Session Handling)。

M10:缺少对二进制文件的保护(Lack of BinaryProtections)。

(2)2015年OWASP移动风险Top10

M1:平台使用不当(Improper Platform Usage)。

M2:不安全的数据存储(Insecure Data)。

M3:不安全的通信(Insecure Communication)。

M4:不安全的身份认证(Insecure Authentication)。

M5:加密不足(Insufficient Cryptography)。

M6:不安全的授权(Insecure Authorization)。

M7:客户端代码质量问题(Client Code QualityIssues)。

M8:代码篡改(Code Tampering)。

M9:逆向工程(Reverse Engineering)。

M10:无关的功能(Extraneous Functionality)。

参考文献


[1]HuangJ, Li Z, Xiao X, et al. Supor: Precise and scalable sensitive user inputdetection for android apps[C]. 24th USENIX Security Symposium (USENIX Security15). 2015: 977-992.

[2] Nan Y, Yang M, Yang Z, et al. Uipicker: User-inputprivacy identification in mobile applications[C]. 24th USENIX SecuritySymposium (USENIX Security 15). 2015: 993-1008.

[3] 张玉清, 方喆君, 王凯,等.Android安全漏洞挖掘技术综述[J]. 计算机研究与发展, 2015,52(10):2167-2177.

[4]]Android手机病毒分析及研究[EB/OL]. [2016-10-31]. http://blog.csdn.net/androidsecurity.

[5]Keith Makan. Android安全攻防实战[M]. 电子工业出版社, 2015:98-145.

[6] 周圣韬.Android安全技术揭秘与防范[M]. 人民邮电出版社, 2015:69-103. 

发布了24 篇原创文章 · 获赞 39 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/shayuchaor/article/details/53914355