目前Android上的流行的软件广泛存在着安全缺陷与安全漏洞,漏洞产生的缘由可能有不少,例如如下几种。安全
一、Android提供了一种开放的环境,在得到了灵活性和能够知足各类定制需求的同时,也损失了部分安全性。服务器
二、开发团队一般将精力集中在产品设计、功能实现、用户体验和系统等方面,而不多考虑安全问题网络
三、Android提供的安全机制比较复杂,开发者须要理解它们,并对攻击思路和攻击方法有所了解,才能有效的保护软件。ide
四、目前不多出现对特定的移动软件安全漏洞的大规模针对性攻击,在真实的攻击出现以前,许多人并不重视。工具
数据存储ui
一、将隐私数据明文保存在外部存储,这样并不安全。编码
攻击者写的软件能够将其读取出来,并传输到指定的服务器,形成隐私信息泄露。较好的作法是对这些数据进行加密,密码保存在内部存储,由系统托管或者用户使用时输入。加密
二、将系统数据明文保存在外部存储,这样并不安全。设计
恶意软件能够读取它们,有可能用户展开进一步的攻击。接口
三、将软件运行时依赖的数据保存在外部存储。
若是软件将配置文件存储在SD卡上,而后在运行期间读取这些配置文件,并使用其中的数据决定如何工做,也可能产生问题。攻击者编写的软件能够修改这些配置文件,从而控制这些软件的运行。对于这种配置文件,较安全的方法是保存到内部存储;若是必须存储到SD卡上,则应该在每次使用以前判断它是否被篡改,命名于预先保存的内部的文件哈希值进行比较。
四、将软件安装包或者二进制代码保存在外部存储。
如今不少软件都推荐用户下载并安装其余软件,用户点击后,会从互联网下载另外一个软件的安装包,保存到SD上而后安装。也有一些软件为了实现功能扩展,选择动态加载并执行二进制代码。若是安装或者加载前,软件没有对SD卡的文件进行完整性验证,判断其是否可能被篡改和伪造,就可能出现安全问题。所以,软件应该在安装或加载位于SD的任何文件以前,对其完整性作验证,判断其与实现保存在内部存储中的(或从服务器下载下载的)哈希值是否一致。
五、全局可读写的内部文件。
若是要跨应用比较好的方法是实现各Content Provider组件,提供数据的读写接口并为读写操做分别设置一个自定义的权限。
六、内部敏感文件被root权限软件读写。
这个问题并无通用的解决方法,开发者可能须要根据实际状况寻找方案,并在可用性与安全性之间作出恰当的选择。
网络通讯
Android软件一般使用WiFi网络与服务器进行通讯。WiFi并不是老是可靠的,例如开放的网络或者弱加密网络中,介入者能够监听网络流量。攻击者可能本身设置WiFi网络进行钓鱼。此外,在得到root权限后,还能够在Android系统中监听网络数据。
一、不加密的明文传输敏感数据。
最危险的是直接使用HTTP协议登陆帐户或交换数据,这类问题的解决方案很显然:对敏感数据采用基于SSL/TLS的HTTPS的数据传输。
二、SSL通讯不检查证书有效性。
在SSL/TLS通讯中,客户端经过数据证书判断服务器是否可信,并采用证书的公钥与服务器进行加密通讯。这种作法可能致使的问题是中间人攻击。
三、使用短信注册帐户或接收密码。
有些软件使用短信进行通讯,例如自动发送短信来注册、用短信接收初始密码、用短信接收用户重置密码等。短信并非一种安全的通讯方式,恶意软件只要申明了SEND_SMS、RECEIVE_SMS和READ_SMS这些权限,就能够经过系统提供的API向任意号码发送任意短信、接收指定号码发来的短信并读取其内容,甚至拦截短信。所以,这种经过短信注册或接收密码的方法,可能引发假冒注册、恶意密码重置、密码窃取等攻击。此外,这种与手机号关联的帐号还可能产生增值服务、危险更大。较好的实现方式仍是走Intent。
密码和认证策略
一、明文存储和编码存储密码。
许多软件有“记住密码”的功能,若是开发者依字面含义将密码存储在本地,可能致使泄露。
另外,有的软件不是直接保存密码,而是使用Base6四、固定本身或者字符、ProtoBuf等方法对密码存储在本地,可是这些编码也不会增长密码的安全性,采用smail、dex2jar、jd-gui、IDA Pro等工具,攻击者能够对Android软件进行反编译。
较好的作法是,使用基于凭据而不是密码的协议知足这种资源持久访问的需求,例如OAuth等。
二、对外服务器的弱密码或固定密码
使用IMEI或者IMSI做为惟一认证凭据
IMEI、IMSI是用于标识手机设备、手机卡的惟一编号。若是使用IMSI或者IMEI做为用户的惟一凭据、可能致使假冒用户的攻击。