目前,Android应用程序市场的发展速度飞快,不少开发者为了追求开发速度而忽视应用程序的安全。但由于Android系统的开源性及其Java编写的特殊性,各类Android App经常被爆出漏洞,有的Android开发者只是对App进行混淆代码或是防二次打包,对于源码的保护并不到位,同时也不清楚其中所隐藏的漏洞。
一、门户大开:常见漏洞攻击的3个入口
1)导出组件
导出组件,是Android上最常见,门槛最低的攻击入口,如manifest中组件设置不当的话,就存在被任意调用的可能,最常见的是拒绝服务攻击。
示例:
防护措施:对外暴露的组件要做到“最小化”输出,发布前做好安全检测分析,提前发现风险。
2)端口开放
应用通过监听固定接口,使用socket来实现本地IPC、远程网络通信。这种监听固定端口的方式很容易被局域网内攻击程序探测到,这些暴露的socket如果没有协议加密、没有权限控制的话,就很容被利用,作为攻击入口,轻者拒绝服务,重者远程代码执行。
示例:固定端口的监控扫描
Socket实现,如果不做访问控制,协议安全性又比较弱,那后果就严重了。
防护措施:端口随机化,访问要控制,协议要加密。
3)插件加载
插件加载设计很普遍, so加载、dex加载…..但因为插件存储不安全,很容易被人篡改和替换,如果没有在加载过程做校验的话,那就有可能被人用伪造的插件来进行任意代码执行。
示例:公共目录存储的插件
Dex加载没校验,存在任意代码执行的风险…
用System.load来进行so加载,如无校验,存在被替换、篡改的风险。
防护措施:存储要安全,别让别人碰。加载要校验,我的地盘我做主。
二、偷梁换柱:常见漏洞攻击的2种手段
1)伪造通信
常见伪造通信类型有:进程内组件间的Intent通信、远程Service通信、Socket的IPC通信等,如果没有严格的通信校验,攻击者通过伪造通信数据,达到不可告人的目的。
示例:通过暴露的远程service,伪造通信数据,实现应用程序远程下载和安装。
伪造socket通信数据,实现应用特定指令执行,盗取敏感数据。
防护措施:协议数据要加密,通信访问要验证。
2)伪造文件
文件权限和校验的失控,让攻击者有机可乘。代码文件存放在公共目录,程序没有对文件进行完整性校验,就很容易造成应用的代码被劫持,从而进行注入。
示例:sdcard公共目录下的so文件
应用程序的进程信息:
代码注入:
、
防护措施:注意插件存储安全,尽量避免公共目录存储;同时插件加载要校验,以免被劫持注入。
APP作为通向海量用户信息的入口,涉及到直接的金钱交易或个人隐私相关的应用的重要性是不言而喻的。而Android应用市场对app的审核相对iOS来说也比较宽泛,为很多漏洞提供了可乘之机。