前言:本文是《移动APP客户端安全笔记》系列原创文章中的第一篇,主要讲的是企业移动APP自动化漏洞检测平台建设,移动APP漏洞检测发展史与前沿技术,APP漏洞检测工具与平台,以及笔者的一些思考。希望能对移动App自动化漏洞检测感兴趣的同学有所帮助,限于笔者技术水平与文章篇幅,有些内容暂没有逐一详细分析,后续我争取多学习多分享,在此也欢迎大家指点和交流。
一、国内Android App漏洞检测发展简史
1.1石器时代 (2007-2011)
关键词:反编绎,人工审计
2007年11年,Google正式发布了Android操作系统,2011年12月,Google发布了Android 2.3版本,Android 应用市场App数量突破10万个,随着Android系统的完善及Android设备数量的增加,Android超过塞班成为主流智能手机操作系统。与此同时,一些安全研究人员已经敏感的嗅到了Android客户端安全可能会成为未来的安全热点之一,不少传统的二进制安全研究人员开始转战移动安全。
这个时间段国内对Android安全问题的关注主要集中在恶意App分析与检测,App逆向与破解以及Android系统Root。对于Android客户端安全问题刚主要集中在信息泄露,敏感权限使用的方面,通常使用反编绎工具分析APK源码,然后进行人工审计。
图1 使用JD-GUI分析APK反编绎后的Java代码
1.2农业时代 (2012-2014)
关键词:自动化审计、静态分析、动态分析
2012到2014年间,Google发布了Android4.0-5.0系统,此间爆出不了不少Android 相关漏洞,比如影响深远的Webview远程代码执行漏洞,HTTPS中间人漏洞,让越来越多的安全研究人员的焦点慢慢转向Android App客户端本身的安全漏洞挖掘上来。
国内一些厂商也开始研发自己Android App自动化审计系统,其中最早的对外发布的腾讯金刚审计系统算是国内这类产品的鼻祖之一,其早期版本在功能上实现了Android App自动化静态分析与简单的动态分析,审计点包括:明文保存敏感信息,文件权限问题,日志信息泄露,组件权限问题,明文传输,拒绝服务等。
此时遇到Android APP自动化审计遇到的主要问题有:1.静态分析主要依赖于关键词匹配,如果缺少上下文分析与可达性分析,开发者正好自定义了一个相同关键词的函数,或者存在漏洞的代码根本没有调用到,则会产生误报。2、大多Android App的代码与UI是紧密交互的,如果动态分析部分只进行了简单安装启动App与自动随机点击,无法覆盖App大部分界面与功能,则无法覆盖更多的应用执行路径,产生有效业务数据,容易导致漏报。
图2 金刚审计系统主界面
1.3工业时代 (2015-至今)
关键词:模糊测试、污点分析、通用脱壳、UI自动化遍历
从2015年开始,360捉虫猎手(现改名为360显微镜),阿里聚安全等开放的在线Android App漏洞检测平台的出现让开发者和安全研究者更加方便的进行漏洞审计,一些开源在线检测平台的出现(如MobSF)也降低了定制化APP漏洞审计系统的开发门槛。同时模糊测试,污点分析,通用脱壳,UI自动化遍历等学术界与工业界技术也开始被应用到移动App漏洞审计中。下面简单谈谈几种技术在Android App漏洞检测领域的应用,如果有读者感到兴趣的话后续再做详细分享。
1.3.1 Android App Fuzzing
一般而言Fuzzing技术常用于二进制漏洞挖掘,在移动安全领域常见于挖掘系统组件漏洞(如libstagefright),文件解析类应用漏洞(如adobe reader,视频播放器)及第三方组件漏洞,常使用的工具有:peach/afl/honggfuzz,以及DroidFuzzer(https://github.com/manfiS/droidfuzzer)/MFFA(https://github.com/fuzzing/MFFA)等框架,为了提升成功率,通常可将几种工具与框架组件使用,如AFL+PEACH+MFFA。除此之外,fuzzing技术同样可用于测试Android 进程间通信(IPC),比如intent fuzzer(https://github.com/MindMac/IntentFuzzer)可以直接检测App拒绝服务等漏洞。
图3 KCon2016上安全研究人员提出的组合fuzzing框架
1.3.2 Android App 污点分析
污点分析可分为静态污点分析与动态污点分析。静态污点分析不需要运行程序,以FlowDroid为例,目前主流的App静态污点分析技术主要包括如下步骤:
- 解析应用AndroidManifest.xml,Layout配置文件和相关Dex字节码,根据预先建模的Android LifeCycle Model生成超调用图 ,又称过程间控制流图(Inter-procedural control flow graph, ICFG);
- 根据定义的污点源和锚点(Source and Sink),将其转换为基于ICFG的后向或前向数据流问题进行求解;
- 根据求解结果,回答是否存在从某输入到输出的数据流流动路径,以显式Intent问题为例,FlowDroid会检测到一个以发送intent的sink方法到最后接收intent的source的路径存在。
动态污点分析则是在程序运行中过程,通过跟踪变量、内存及寄存器的值,依据执行流程跟踪污点数据的传播,最后达到跟踪攻击路径与获取漏洞信息的目的,以TaintDroid为例,需要对Android系统进行定制化修改以便对App运行过程中的污点数据进行跟踪,但由于Android设备或模拟器性能瓶颈问题,动态污点分析无法获取App所有可能的可执行路径。
以往污点分析常用于Android恶意App分析,信息泄露检测等问题,现在越来越多的厂商也应用于App漏洞检测上(如阿里聚安全使用的基于TaintDroid方案)。相比传统的App漏洞检测,污点分析可以跟踪污点数据的传播过程,确定漏洞是否在实际环境中可能被触发,检测能力更加强大。目前也有不少开源的Android污点分析方案与工具如:TaintDroid、FlowDroid、amadroid及CodeInspect,在此之上也发展出一些针对Android App漏洞 检测方面的工具,如腾讯科恩实验室Flanker之前开源的JAADS(https://github.com/flankerhqd/JAADAS)。
图4 Flowdroid运行流程
1.3.3Android App 通用脱壳
App二次打包,破解等问题的泛滥催生了App加固产业的发展,两者技术在也攻防中不断发展和进化,目前国内主流的加固方案有梆梆,爱加密,百度加固,360加固,阿里聚安全,腾讯御安全/乐固,通付盾,NAGA等,对于在线漏洞检测平台来说,如果没有通用的自动化脱壳方案就意味无法对应用市场中的很多App代码进行静态分析,甚至由于应用被加固无法运行于模拟器中或特定测试设备中,影响动态分析结果。
目前针对dex文件加固主流的脱壳方法有静态脱壳、内存dump、Dalvik虚拟机插桩,第一种方法需要针对厂商加密方案不断更新,基本不具备通用性,后面两者的开源代表作有:ZjDroid(https://github.com/halfkiss/ZjDroid)与DexHunter(https://github.com/zyq8709/DexHunter)。
图5 笔者整理的国内部分APP加固方案
1.3.4移动 AppUI自动化遍历
App UI自动化遍历常在App开发测试中用于检测App性能与兼容性,目前在App漏洞检测领域用的比较少(主要由于效率较低)。一般主流的App漏洞检测平台都包含动态分析,主要是安装App后自动运行App并监测App行为,通常使用的是Android Monkey test脚本或其它工具随机点击APP界面。
实际上,为了更深入的检测App敏感信息泄露与后端WEB接口漏洞,仅靠随机点击App界面进行动态分析是不够的(比如现在大部分App功能需要注册登录后才能使用),如果能更好的模拟正常用户使用App的过程,则可以扩展监测Logcat日志,本地文件存储,网络通信等数据审计能力。
目前APP UI测试框架按原理可分为黑盒与白盒两种,白盒测试需要在App开发时添加测试组件并调用,需要App完整源码,黑盒测试一般提取App界面的UI元素并根据算法进行遍历,无需App源码。笔者推荐的黑盒APP UI测试框架与工具主要有AndroidViewClient(https://github.com/dtmilano/AndroidViewClient)及国人基于Appium开发的appCrawler(https://testerhome.com/topics/5718)。
图6 appCrawler生成的APP测试报告
二、Android App漏洞检测
2.1 国内Android App在线漏洞检测平台
腾讯金刚审计系统 http://service.security.tencent.com/kingkong 免费 无限制
腾讯御安全 http://yaq.qq.com/ 免费 查看漏洞详情需认证
阿里聚安全 http://jaq.alibaba.com/ 免费 查看漏洞详情需认证
360显微镜 http://appscan.360.cn/ 免费 无限制
360APP漏洞扫描 http://dev.360.cn/html/vulscan/scanning.html 免费 无限制
百度MTC http://mtc.baidu.com 9.9元/次 无限制
梆梆 https://dev.bangcle.com 免费 无限制
爱内测 http://www.ineice.com/ 免费 无限制
通付盾 http://www.appfortify.cn/ 免费 无限制
NAGA http://www.nagain.com/appscan/ 免费 无限制
GES审计系统 http://01hackcode.com/ 免费 无限制
注:排名不分先后
2.2开源Android App漏洞检测工具
1.MobSF
Github:https://github.com/ajinabraham/Mobile-Security-Framework-MobSF
Mobile Security Framework(MobSF)是印度安全公司(http://opensecurity.in)开发的一个智能化、一体化的开放源代码的移动应用(Android / iOS)自动化测试框架,支持静态和动态分析,App后端Web API漏洞检测。
主要特点:基于Python Django的开源在线漏洞检测框架,前端UI完善,基础功能全面,安装布署方便,但总体来说审计点偏少,不适合实战,更适合辅助分析与二次开发,国内目前不少在线APP检测的平台都有这个框架的影子。
图7 MobSF生成的检测报告
2.Drozer
Github:https://github.com/mwrlabs/drozer
Drozer是MWR Labs开发的一个开源Android 安全测试框架,支持编写自定义模块。目前已经有不少介绍Drozer文章,这里就不多说了。
图8 Drozer运行界面
3.Marvin
Github:https://github.com/programa-stic/
Marvin是西班牙Programa STIC组织发布一个开源Android App漏洞检测框架,该框架主要分为四个项目:
(1)Marvin-Django
主要包含框架前端UI界面与数据库部分;
(2)Marvin static analyzer
一个主要基于Androguard 及Static Android Analysis Framework 的Android App静态分析引擎。
(3)Marvin Dynamic Analyzer
一个APP动态分析引擎,基于OpenNebula及Android-x86 模拟器,可搭建分布式分析系统,用于复现静态分析发布的漏洞与动态检测漏洞。
(4)Marvin toqueton
一个自动化遍历APP UI的工具,用于分析APP UI控件并进行自动化交互遍历,辅助动态分析。
主要特点:
笔者刚看到这个项目发布时研究了一番,主要特点有可直接搜索下载Google应用商店或者上传应用进行分析,可编写自定义静态分析脚本,使用动态引擎复查静态分析的结果提升准确性,使用本地应用去遍历APP UI等,但仔细实践后发现动态分析环境(ubuntu+openNebula+Android-X86)的布署很麻烦,多次尝试都未成功。
图9 Marvin主界面
4.Inspeckage
Github:https://github.com/ac-pm/Inspeckage
一个Xposed插件,用于调试分析Android App。
主要特点:
使用方便,自带WEB界面,装Xposed插件可以分分钟开始挖漏洞;2.功能全面:查看Manifest信息,监控本地文件读写,查看文件内容,查看Logcat日志,查看网络通信请求(支持SSL uncheck),监控IPC通信,查看加密操作,调用未导出组件等。
图10 Inspeckage主界面
三、IOS App漏洞检测
一般来说iOS App由于iOS系统安全限制(非越狱环境),且无法直接反编绎获取App源码,其在安全性上远高于Android App,但近两年前随着XcodeGhost(分析文章),iBackDoor,AFNetworking中间人等后门事件与漏洞的曝光,iOS App安全性也慢慢受到国内开发者与安全研究人员的关注。
3.1 常见IOS App漏洞测试工具
测试iOS App安全性离不开一台越狱过的iOS设备,以及一些测试利器。在此简单简介两个iOS App安全测试工具:
1.Idb
图11 Idb主界面
Github:https://github.com/dmayer/idb
Idb是一款开源的iOS App安全评估工具,作者是Danl A.Mayer。
主要功能:
1.查看应用以下信息:应用包名;注册的URL Schemes;SDK版本;应用数据文件夹位置;应用权限等,
2.查看/下载应用数据文件;
3.查看应用文件保护级别;
4.Dump iOS keychain;
5.检测应用是否加密;
6.检测应用编绎安全选项(ASLR/PIE, DEP, ARC);
7.查看应用的shared libraries;
8.提取应用binary中的字符串;
9.Class dump;
10.查看应用URL Handler;
11.Invoke and fuzz URL handlers;
12.查看系统剪切板
13.截屏
14.安装系统证书;
15.编辑 /etc/hosts文件;
16.查看系统日志;
2.Needle
图12 Needle主界面
Github:https://github.com/mwrlabs/needle
Needle是MWR Labs开发的一个开源iOS安全测试框架,同样支持开发自定义模块来扩展Needle的功能,目前主要功能包含对iOS应用数据存储,IPC,网络通信,静态代码分析,hooking及二进制文件防护等方面的安全审计。
与drozer类似,Needle提供了一个shell界面,基本idb有的功能needle都有或者说以后也会有(因为可以自己写模块),而Needle还同时支持Cycript与Frida两个hooking方案,可以方便的加载hook脚本与执行命令。
3.2 IOS App自动化漏洞检测
在很长一段时间内,iOS安全研究都主要集中在iOS系统安全漏洞挖掘中,由于iOS相对安全的系统机制保护与严格的审核机制,iOS App安全性一般比Android App要高不少,历史上出现的过一些iOS App漏洞也主要集中在iOS越狱环境下,但近年来XcodeGhost,AFNetworking框架中间人漏洞以及多个恶意SDK曝光也说明了iOS App安全性并没有我们想像的那么高,建设iOS App自动化漏洞审计平台对于拥有大量iOS App产品的企业来说还是很有必要的。
为了提升公司iOS App安全漏洞审计能力与应急能力,笔者与riusksk(林大夫)从2015年底开始一起研发iOS App漏洞审计系统(后续并入金刚),目前已经成功上线近半年,也辅助发现了一些iOS App业务安全漏洞,详情可参考文章:浅谈iOS应用安全自动化审计
此外360NirvanTeam(http://nirvan.360.cn)也上线了在线检测功能,开源方案MobSF也有iOS App在线审计功能。此类审计平台主要审计点有:BIN文件分析,第三方库漏洞检测,XCodeGhost检测,恶意SDK检测等。相对来说金刚更为全面,适合开发上线前自查与安全研究人员辅助分析,包含了私有API检测,开放端口检测,应用文件审计,网络通信数据审计,日志审计,classdump等功能,后续还会继续优化iOS App UI自动化遍历功能与URL scheme Fuzzing功能。
图13 TSRC iOS App漏洞审计报告部分内容
四、构建移动App漏洞检测平台
目前国内无论是3BAT,还是移动安全公司,都已经提供了移动APP漏洞检测产品,笔者平时也会对这些平台做一些深度体验,总体来说随着技术发展,构建APP漏洞检测平台门槛已经很低技术也很成熟了。
在移动互联网时代,不同的企业对于移动APP产品安全性要求是不一样的,如金融,支付,通信,游戏类APP产品对App客户端安全,业务安全,后端服务器安全都提出了很高要求,定制企业自已的移动APP漏洞检测平台还是很有必要的。
笔者仅从个人角度谈谈对如何构建移动App漏洞检测平台的几点看法:
(1)在平台建设之初可以参考业界优秀的同类产品与开源方案,目前大部分移动App漏洞检测平台后端基本功能都是使用Python/Java开发,便于快速开发迭代。
(2)移动APP安全威胁是不断变化的,漏洞审计规则也应该支持快速更新,同时企业移动App漏洞检测平台应该满足移动App产品正式上线前审计,上线后日常排查两个基本需求。
(3)很多开发人员和安全工程师对漏洞的理解是不一致的,在输出漏洞检测报告后,还需要提供详细的漏洞利用场景讲解与修复指引。
(4)多多关注学术界与工业界的新研究成果,如果能加入优化与利用,可以推动平台整个技术能力的进步。
(5)平台的主要建设者应该精通移动App漏洞挖掘实战,能够针对企业重点产品特性(如动态加载,热补丁等技术)提供专业的解决方案。
同时笔者提出了一个甲方/乙方企业通用的移动App漏洞检测平台架构,企业可以在此基础上直接接入Web漏洞扫描系统扫描App后端Web漏洞,也可以收集URL测试业务安全漏洞。
图14 移动App自动化漏洞检测平台架构(点击查看大图)
五、未来移动App漏洞检测平台发展方向
在Google最新发布的Android 7.0系统增加了不少安全特性,如APP开发者可以使用系统提供的接口自主配置信任的证书,默认也不再信任用户安装的第三方CA证书,此举可提升Android App网络通信的安全性。
可见未来移动APP安全问题还将不断变化,目前大部分移动APP漏洞检测平台最终的检测结果也需要专业的安全研究人员评估实际风险,历史上很多移动端严重漏洞也是需要结合业务场景的,所以说移动App漏洞检测平台也只是企业移动App安全建设中的一环,此外推动移动安全人才培养,移动App安全开发规范,应用加固,盗版监测等体系建设也同样重要。
笔者个人认为未来移动APP漏洞检测平台可发展的几个方向有:
1.机器学习
机器学习在网络安全领域常用于恶意软件检测,流量检测等方面,目前也已经出现一些利用机器学习进行Android恶意应用等方面的开源工具(https://github.com/mwleeds/android-malware-analysis)与研究,未来同样也可能应用于Android App漏洞检测。
2.威胁感知与大数据
如何从移动App中挖掘数据,并分析,整合进而利用于漏洞检测与威胁感知也是未来移动APP漏洞检测发展方向之一。目前部分漏洞检测平台已经开始支持采集应用市场所有移动APP源码及运行过程中产生的网络通信数据(如域名,IP,URL等),进行聚合分析与WEB接口漏洞检测。同时四维智创,梆梆等安全公司开始推广移动应用威胁感知产品,此类产品通过SDK收集应用的行为与网络数据,用于检测APT攻击,防刷单等场景。
3.社区化
目前国内已经有一些社区化的WEB漏洞检测平台,如Seebug,Tangscan等,盘古即将公测的Janus(http://appscan.io)也同样开始主打社区化,Janus支持社区用户自定义检测规则,后台结合海量全网应用数据,可用于全网应用快速漏洞扫描。同时社区化加入了安全研究员的人工审计流程,后续可以不断提升漏洞特征建模的细度与广度,提升平台检测能力。
文章纯属原创,转载请注明出处(Android安全中文站),同时感谢lake2,riusksk,Flanker,小荷才露尖尖角,瘦蛟舞的指点。
参考资料:
[1] http://www.ijcaonline.org/research/volume134/number7/dhavale-2016-ijca-907855.pdf
[3] https://loccs.sjtu.edu.cn/
[4] http://jaq.alibaba.com/community/index.htm
[6] https://blog.flanker017.me/