当我第一次开发移动应用时,曾怀疑过是否要把移动应用的安全独立出来。因为移动应用和桌面应用没有什么区别,都存在着相同的漏洞:栈和堆的溢出、格式化字符串漏洞、内存被释放后又重新利用,以及其他一些代码执行问题。这些漏洞也存在于iOS之中,毕竟都是从C语言的角度出发的系统。但是移动设备的安全焦点不在于软件的稳定性,而在于用户隐私、数据窃取以及进程间的恶意通讯方面。
移动应用不该具备哪些能力
人们从早期的桌面操作系统的错误设计里吸取了经验(Windows的错误设计,不同程序的文件可以放在同一个文件夹里,而且运行任意桌面程序都可以访问全部的用户数据,设置控制整台电脑),当前主流的移动操作系统都把应用程序相互隔离。由于应用间的沙盒隔离和iOS平台的日益完善,用户其实对安全的要求越来越高。
1、导致其他应用程序行为异常
一个应用程序不应该让其他应用程序崩溃。在过去的“黑暗”年代,你不仅可以读取其他程序的数据,还可以修改和删除数据,甚至能把整个系统文件删除。随着时间的推移,桌面系统通过进程间的相互独立使这个状况得以改善,但是他们这么做的原因仅仅是为了提高系统稳定性。毕竟删除一个文件就导致整个系统崩溃的问题确实很让人崩溃。
在移动操作系统中解决了这些问题,但是,既要满足用户应用程序之间的必要操作(最简单的例子,访问本机保存的图片),又要使所有进程完全隔离,这是不现实的。应用程序之间总要留一些窗口来做交换。这就需要开发者来确保他们的应用不会做坏事,并采取一切谨慎的措施来保障数据安全,防止其他恶意程序的侵袭。
2、拒绝为用户服务
iOS就是为手机而生的操作系统,这决定了当用户需要紧急呼叫时,所有的应用程序不能阻拦,而且这个请求的优先级最高。很多地方的法律都有相关规定,这也是攻击者不能篡改底层操作系统的原因。
3、盗取用户数据
一个应用程序不应该读取来自其他应用程序或本地操作系统的数据,更不能将其发送给第三方(比如照片云同步功能)。操作系统可以组织一个应用直接读取另一个应用的数据,但是开发者需要自己防范其他的数据盗取手段,仔细研究发送和接收数据所用到的IPC机制。
4、恶意扣费
在没有得到用户批准的情况下,应用程序不应该产生费用。许多手机恶意软件普遍存在让用户订阅第三方服务,这些服务产生的费用又要由机主来买单(当年移动梦网的各种恶心服务)。因此应用内购买项目和功能要明确的向用户说明,并且购买行为要得到用户的完全确认。
移动应用安全威胁分类
1、取证攻击
取证攻击者一旦有权访问设备或者它的备份,就会尝试获取设备的机密。最常见的做法就是访问设备的物理区域。相比计算机,手机或者平板设备更容易被盗,因此大部分攻击都是取证攻击。
取证攻击者可以由一个抱着碰运气心态的陌生人或者熟练掌握定向攻击的黑客发起。对于一个碰运气的陌生人来说,窃取信息就是偷(或捡到)一部没有任何PIN保护的手机,然后他们就能看到相册的图片,QQ或者微信的聊天记录,短信和通话记录,淘宝天猫等购物信息。一切的文字和可以通过正常途径访问到的数据都能被他们掌握。如果用户开启了两步验证,陌生人也可以很轻易的得到这些验证码。
如果攻击者是一个有着专业知识的职业黑客,攻击者知道某种技术可以用来实现来临时越狱,破解简单的PIN,然后访问设备中的数据。这些数据部分来自系统层,部分来自应用层。因此攻击者不但可以获取UI所展示的数据,可能得到系统底层的缓存数据(直接进入沙盒目录查看文件)。这些缓存数据可能包括截图,按键记录,Web请求中缓存的敏感数据,App内的log日志(这个如果被黑客看到可是很危险的,不但你的所有数据结构暴露在他们眼皮下,还有所有的服务器API),以及应用的本地数据库。
2、代码执行攻击
远程代码执行攻击会在设备上执行一段代码来破坏整个设备和数据,这个过程不需要拿到实际的设备。这种攻击的渠道主要有:网络,二维码(这是相当危险的,特别是地铁上的迷之二维码)、NFC、恶意文件解析,以及连接感染病毒的外接设备。一旦设备执行了远程攻击代码,就可以执行取证攻击,从而获取用户的机密信息,有几种经常出现的代码执行攻击,他们东欧利用了底层编程语言的漏洞(格式化字符串、缓冲区溢出、整数溢出)。
3、Web攻击
基于Web的远程代码执行攻击主要使用恶意的HTML和JavaScript来误导用户或窃取数据。远程攻击者可以操控一个恶意网站或者合法网站,也可以简单地将恶意代码发布到公共论坛。
这些攻击可以从HTML5的数据库或本地存储中窃取数据,还能修改或窃取存储在SQLite中的数据,读取会话cookie或植入一个虚假登录表单来盗取用户的凭据(假的银行网站、假的领奖网站)。
4、网络攻击
基于网络执行的代码攻击,通常会通过网络注入一些可执行代码,从而控制相关的应用程序或整个系统。比如你可以修改设备的网络请求内容,也可以使用漏洞利用程序来破解系统服务或者内核。如果被攻击的目标具有比较高的权限,那么攻击成功之后,攻击者不仅可以获取某个特定应用程序的数据,还能获得设备中全部的数据。他们不仅可以监控设备的运行状态,还能植入后门应用程序方便再次访问。
5、物理攻击
通过物理手段供给设备,往往要用到NFC或者USB接口。这种类型的攻击常常被用在设备的越狱或者Root上,但也可以通过短暂的物理接触供给设备。大部分攻击都是针对操作系统的。