赵 兆
(江苏省电子产品质量监督检验研究院(江苏省信息安全测评中心),江苏 无锡 214073)
移动通信越来越受到重视,可以认为是继互联网之后最重要的技术发展之一。不幸的是,和互联网一样,安全性似乎是事后才想起来的事。近几年CVE,OSVDB,SecFocus公布的Andriod主要漏洞如图1所示[1]。
图1 andriod主要漏洞
针对漏洞,Andriod应用主要存在如下威胁:
(1)恶意代码数量呈倍数增长,并且出现了对抗分析、查杀、检测的技术。
(2)数字内容和应用软件的版权不断遭到侵害,软件破解、应用内付费破解、广告库修改和植入、软件篡改、恶意代码植入等现象普遍存在。
(3)官方系统、第三方定制系统和预装软件的漏洞不断被挖掘,对系统稳定与安全产生很大的威胁。
(4)应用软件本身的安全漏洞频繁出现在国内外互联网企业的产品中。
(5)移动设备正融入办公环境,但针对移动平台的攻击趋势日益明显。
(6)移动支付从概念逐步转为实践,而对算法和协议的攻击和通信技术的攻击时常发生。
应用程序是移动客户端上的最主要的攻击面[2]。毕竟,应用程序和移动操作系统是终端用户和其他软件的基本接触点,所以这也是所有问题发生的地方。应用程序可能造受如下攻击。
一个Android应用所能访问的资源是受到Android安全模型的限制的,它只能访问它自己拥有的文件,并且它只能访问在安装应用时它的mainfest文件中所申请的设备资源和功能。安全模型防止恶意应用执行非法操作和访问敏感数据。
但是如果一个应用能在root用户权限下运行的话,这套安全模型就失效了。运行在root用户权限下的应用能直接访问设备资源,绕过了通常要求的权限检查限制,这就给了该应用完全控制设备和设备上安装的所有其他应用的潜在能力。恶意应用使用此技术获得设备的控制权。如:GingreBreak(CVE-2011-1823),Ice Cream Sandwich触发chmod/chown漏洞
攻击者可能通过人工静态分析查找移动应用漏洞。一般攻击者不可能访问你的源代码,除非他碰巧破了你的源代码池,他们一般会通过逆向工程,反编译或反汇编将你的源代码转成smali汇编代码或者从字节码转化成Java代码。
在挖掘漏洞时,例如SQL注入或绕过Android应用与网络服务的后台交互认证,人们首先需要观察和操纵网络流。可以通过使用网络嗅探器(如tcpdump或wireshark)进行截获分析,操纵Android应用和它的终端之间的Http请求和响应。例如:利用burpsuite来截取Android应用和一个基于XML的Web服务器之间的网络流量。这项技术可以让你绕过那些可能阻止你绕过客户端验证,这类验证本来可以对通用Web服务漏洞的利用代码和客户端信任问题进行有效防护。
Intents是Android应用使用的主要的进程间通信(IPC)方法,应用可以发送Intents以启动力传递数据给内部部件,或发送Intents给其他的应用。
恶意应用可以使用Intents来激活其他应用(在一些情况下是获取恶意应用没有权限访问的功能),或者注入数据给其他应用。根据应用在接收Intents数据后的操作,恶意应用可能造成应用崩溃或执行无法预期的动作。如:命令注入。
NFC是Near Field Communication缩写,即近距离无线通信技术。NFC手机是指带有NFC模块的手机,可以应用在生活的很多方面,比如快速获取公交车站站点信息、公园地图等信息、门禁控制、本地支付等。NFC手机提供了一种简单触控式的解决方案,可以让用户简单直观地交换信息、访问内容和接受服务。
如果一个NFC标签包含一个指向恶意站点的URL,那么扫描了此标签的用户会发现他的设备将受到攻击。攻击者可以通过以下两种方法使用恶意NFC标签:攻击者可能制作外表具有说服力的海报并将恶意NFC标签附在上面;如果标签没有相应的写保护,攻击者可以重写标签。
Android应用可能无意中泄露敏感数据给攻击者,包括用户机密、个人信息或者详细的配置信息,之后,攻击者可以利用这些信息进行额外的攻击[3]。
通过内部文件泄露:系统通过分配每个应用程序独立的UID和GID,来限制一个应用访问其他应用的文件。但是一个应用可以通过MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE标志来创建全局可读或全局可写的文件。
通过外部存储泄露:任何文件若存储在可移动存储器之类的外部存储上,如SD卡,那么该文件相对同一移动设备上所有应用来说是全局可读和可写的。
针对上节提出的6类常见攻击,提出下安全防范措施:
(1)使用静态代码分析可以在不运行程序的前期下对程序存在的潜在问题进行分析,利用CheckStyle,Findbugs,PMD,Android Lint分析工具进行分析。静态代码分析可以避免一些低级的问题,与此同时可以规范代码书写、提高代码质量。
(2)如果应用的Service组件不必要导出,或者组件配置了intent filter标签,建议显示设置组件的“android:exported”属性为false。
(3)检查App所在的目录,其权限必须为不允许其他组成员读写。
(4)重要信息进行加密存储,由于加密算法加密后的数据为二进制数据,因此在保存时,为了防止出错,可以将数据转换成ASCII字符的形式。一般推荐使用Base 64;密钥由用户输入或程序随机产生,不能写在代码中。
(5)Apk签名校验,在应用内的关键功能入口增加校验签名的检测,如果发现应用签名非正版,则强制关闭应用或者限制用户使用。
(6)加壳保护,将核心业务逻辑代码放入加密的.jar或者.apk文件中,在需要调用时使用Native C/C++代码进行解密,同时完成对解密后文件的完整性校验。
随着Android应用在日常生活中越来越广泛,从日常娱乐、办公到日常消费。Android应用安全也更多地受到攻击者关注。建议应用开发者建立安全风险模型,在系统正式上线运行前进行代码审查和渗透测试。手机用户在上载Android应用,应选择正规的可靠的下载途径。