原文地址:
http://wetest.qq.com/lab/view/138.html?from=ads_test2_qqtips&sessionUserType=BFT.PARAMS.196734.TASKID&ADUIN=286513245&ADSESSION=1470806885&ADTAG=CLIENT.QQ.5485_.0&ADPUBNO=26602
本文由腾讯WeTest授权发布,禁止任何形式转载!
作者:anglia,腾讯资深系统测试工程师
引言
作为Android手机用户中的一枚残粉,假如突然手机掉了,脑电波蹦出的第一个念想是见鬼,还是您的支付宝或者微信上的钱不安全呢?
假如最新下载的app,进去时不仅弹出各种无聊广告,而且通知栏还会冒出意想不到的推送,您会想到这可能是钓鱼推送,马上卸载app?
假如百度全家桶事件,您卸载了所有的百度app,但乌云暴漏的百度WormHole事件,无论是wifi或3G/4G蜂窝网络,只要手机在联网状态都有可能受到攻击,你是否会考虑换掉Android手机呢?
Mi粉狂热已经冷却,华为手机开始跟着Android生态发展攻陷全球,物美价廉的Android手机走入寻常百姓家。面对Android安全漏洞认知不足的用户,如何保证我们的app给用户安心的体验?Android生态安全漏洞有哪些?Android安全测试技术探新在哪儿?如何将安全常规测试流程化?
Android常见安全漏洞汇总
首先,Android操作系统拥有开源的开发红利,也暗藏着后天发展的安全畸形,如:Android系统设计了沙箱系统(即虚拟机),但是底层却出现一个又一个漏洞让恶意程序(或工具)获取root权限以打破沙箱的限制。如同pc时代,没有绝对安全的pc操作系统,移动互联网时代,也没有有绝对安全的移动操作系统。Android开源生态的安全隐患,就像染血的警钟,敲击在每位Android开发者的心里。
其次,Android APP/SDK开发过程中的安全隐患就像未知黑洞,永远都不知道安全对抗的终点在哪,攻击者是谁,终结者又是谁,如何防御。
最后,用户层面,常见的、可识别的安全行为漏洞有哪些表现。
以上三个维度的已知安全漏洞总结如下:
无论是Android App,还是SDK,或多或少都有安全漏洞的死角。说不定某天你的应用就遭到以上的某种安全漏洞呢。恰巧,前段时间测试一款Android版SDK时,发现一种跟Android应用组件相关的安全漏洞。借此实例化地总结了Android SDK安全测试方法、技术和流程。
应用Android版安全测试实例
漏洞原因概述
某款应用(后面简称应用)Android版SDK的一个可选组件,在本地开启了一个随机端口,用于监控java层service是否存活,但java层跟组件通讯时,未对输入参数做严格检验,导致在调用linux系统“system()”函数时,有被填充攻击代码,恶意攻击的可能性。
如下截图是模拟端口被攻击后,在应用组件intent进行通信过程中,修改了url内容,webview显示乱码的情况:
漏洞潜在安全危害
Android APP的四大应用组件:Activity、Receiver、Service和Content provider,以及应用组件通过intent进行IPC通信等安全角色,暂不发散详述。借助于上述案例中应用的组件相关漏洞,展示终端APP侧相关的攻击维度如下图:
由于Android APP本地应用环境,网络socket先天缺乏细粒度的认证授权机制,因此,如果把Android客户端当做服务器,利用逆向代码搜索应用的本地随机端口号,主动向端口发送攻击,就潜伏着如下安全危害:
1.本地命令执行:当嵌入应用的Packagename指定为应用自身,Componentname指定为应用的activity时,可以启动该应用的任意activity,包括受保护的未导出activity,从而造成安全危害。如,通过HTTP请求,逐一启动若干未导出的activity,可以发现拒绝服务漏洞。
2.命令控制修改应用权限:通过开放socket端口传入启动Android应用组件的intent,然后以被攻击应用的权限执行启动activity、发送广播等操作。由于通过socket传入的intent,无法对发送者的身份和权限进行细粒度检查,绕过了Android提供的对应用组件的权限保护,能启动未导出的和受权限保护的应用组件,对安全造成危害
3.敏感信息泄露,控制手机:本地某service打开UDP的端口监听,接收特定的命令字后,可返回手机的敏感信息。如百度手机管家,远程管理手机的secretKey,进而未授权的攻击者可通过网络完全管理手机。
应用Android安全测试执行
应用Android安全加固版本优化点
1.Native层和Java层增加对系统命令检查,特殊字符检查过滤
2.JNI Watchdog守护进程 socket通信加密
3.本地通知功能,添加url、intent、activity的特性验证,防止点击通知后,跳转到恶意链接
4.修改Packagename在应用本地的存储位置
5.增加在线配置功能
以上是此次安全加固优化的重要需求点。
专项安全点测试
如果按照常规的系统测试或者性能测试,只需要根据变动需求,进行正向的测试便可,但对于安全测试,保证SDK安全的健壮性需要进行逆向专项测试,模拟各种安全攻击手段,针对修改点发散测试用例。
Android常规的安全流程回归测试
1.隐私数据:外部存储安全和内部存储安全;用户名、密码、聊天记录、配置信息等隐私信息是否被保存在本地,是否加密保存;使用数据前都判断信息是否被篡改;
2.权限攻击:检查App所在的目录,其权限必须为不允许其他组成员读写;检查系统权限是否收到攻击;
3.Android组件权限保护:禁止App内部组件被任意第三方程序调用:禁止Activity被任意第三方程序调用,禁止Activity劫持;Broadcast的接收和发送安全,只能接收本程序发出的广播,发送的内容不想让第三方获得;禁止恶意的启动或者停止service;Content provider的操作权限;若需要供外部调用的组件,应检查对调用者是否做了签名限制;
4.升级:检查是否对升级包的完整性、合法性进行了校验,避免升级包被劫持;
5.3rd库:如果使用了第三方库,需要跟进第三方库的更新并且检查第三方库的安全性;
6.ROM安全:使用官方ROM或者权威团队提供的ROM,避免ROM中被添加了植入广告、木马等;
7.对抗反破解:对抗反编译,即无法通过反编译工具对其进行反编译,或者反编译之后无法得到正确的反汇编代码;对抗静态分析,采用代码混淆技术,代码加密;对抗动态调试,在软件中加入检测调试器和模拟器的代码;防止重编译,检查签名、校验编译之后dex文件的Hash值。
安全专项测试和常规流程测试完后,针对应用现有的功能、新旧版本兼容性、以及不同Android操作系统版本的兼容性,进行滚动回归测试。
Android安全测试总结
相对于普通的性能和系统功能测试用例,安全测试用例需要更全面的理解Android生态系统,如:用例需要覆盖到用户安全表象层面、应用系统本地和远程攻击层面、以及操作系统本身漏洞层面,且更多的需要设计逆向攻击思维的测试用例。
如果说开发的出发点是安全对抗防御,那么测试的出发点却是黑客攻击的思维,如何设计攻击场景的测试用例,攻击测试的技术如何实现,决定了SDK安全的健壮性。
相关参考文献和案例