赞
踩
随着移动互联网的发展,移动终端安全也越来越受到关注。特别是Android系统的崛起,互联网上的各类Andriod软件数量迅速上升。因Android系统是开源的,导致各种android恶意软件迅猛增加,成为手机系统的最大受害者。与此同时,android系统和软件本身的漏洞也进一步危害到用户的隐私安全。本文主要针对Android软件安全进行审计,提供一些常见的安全检测点,并借此实现自动化审计工具,最后评估下业界常见android软件安全的现状。
敏感信息明文保存
敏感信息明文保存一直是Andriod软件常容易出现的,这些敏感信息包括用户密码、住址、姓名等等内容,特别是密码问题。有些支持“记住密码”功能的软件常常将密码明文保存在软件目录下的某xml文件中,若手机中毒或者被其它恶意软件利用,直接读取xml文件中的明文密码然后远程发送给攻击者,这将会严重影响到用户帐号安全。以下是用于检测敏感信息的关键代码:
- foreach $msg (@msgs) {
- my $base64msg = encode_base64($msg);
- my $md5msg = md5_hex($msg);
- if(/$msg/)
- {
- print "[高危]:$curfile: 行 $lines: 发现明文敏感信息:$msg !!!\n";
- $SearchStrResult .= "[高危]:$curfile: 行 $lines: 发现明文敏感信息:$msg !!!\n";
- push (@risk_level,4);
- $highnum++;
- }
-
- if(/$base64msg/)
- {
- print "[高危]:$curfile: 行 $lines: 发现 Base64 敏感信息:$base64msg !!!\n";
- $SearchStrResult .= "[高危]:$curfile: 行 $lines: 发现 Base64 敏感信息:$base64msg !!!\n";
- push (@risk_level,4);
- $highnum++;
- }
-
- if(/$md5msg/)
- {
- print "[安全]:$curfile: 行 $lines: 发现 MD5 加密信息:$md5msg !!!\n";
- $SearchStrResult .= "[安全]:$curfile:行 $lines:发现 MD5 加密信息:$md5msg !!!\n";
- push (@risk_level,1);
- $secnum++;
- }
- }
以下是当检测到明文密码时的输出结果(已过滤掉包名):
[高危]:data/data/com.***.v7/shared_prefs/rem_password.xml: 行 3: 发现明文敏感信息:passwd123 !!!
程序文件及进程权限问题
如果我们限制程序目录的权限,禁止其它第三方软件访问,也能够在一定程度上防止明文密码泄露,除非软件已获得root权限,而软件一般无需root权限,大多是一些恶意软件或者杀毒软件才会用到,对于普通软件应该遵循“最低授权原则”,尽量以最低权限来完成所需操作,避免权限被恶意滥用。因此也可将程序目录权限和进程是否为root权限作为一个检测点,以下是DroidAppAuditter检测到问题时的输出结果:
[低危]:-rw-rw--w- :data/data/com.snda.cloudary/shared_prefs/UserInfo.xml [低危]:存在Root权限 !
网络数据明文传输
在2012年2月UCWEB浏览器被爆存在明文密码网络传输漏洞,若开启“云端加速”功能,在登录一些SSL站点时,它会将用户发送的WEB请求会转发到UC的代理服务器上,并且未进行任何加密处理,可能导致用户密码泄露。最初UC不承认此问题,后来在微博上确认存在此漏洞。对于存在明文网络传输的软件,若结合中间人攻击就极有可能造成密码泄露,特别是在KFC、麦当劳等公共场所。在Android中本身自带有tcpdump可用于网络抓包,再借助perl模块去解析cap,或者利用wireshark的命令行工具来解析也是可行的(以下为示例代码,不考虑命令注入问题):
- print "[*] 捕获网络数据包......\n\n";
-
- system("adb shell tcpdump -p -vv -s 0 -c 500 -w /sdcard/$targetfile.cap");
-
-
-
- print "\n[*] 提取cap文件至PC端分析......\n\n";
-
- system("adb pull sdcard/$targetfile.cap $cwd/TestSoft/$targetfile/$targetfile.cap");
-
-
-
- print "\n[*] 解析cap数据包......\n\n";
-
- system("$cwd/tshark/tshark.exe -r $cwd/TestSoft/$targetfile/$targetfile.cap -V > $cwd/TestSoft/$targetfile/$targetfile.
以下是检测到明文敏感信息网络传输时的输出结果:
[中危]:存在明文传输内容: password=passwd123&provider=sdo&login=13613****** [低危]:存在 IMEI(国际移动设备身份码)隐私信息窃取行为、IP地址隐私信息窃取行为、SIM序列号隐私信息窃取行为: channel=6666&model=sdk&ip=10.0.2.15&mac=&sim=89014103211118510720&imei=000000000000000&size=480*800&os=2.2&platform=Android&vers
组件权限安全问题
在Android中存在多种组件,比如Content Provider、Broadcast Receiver等等,这些组件可能因权限设置不当导致信息泄露或者钓鱼欺骗等攻击。在2011年,香港理工大学的安全研究人员陆续报告了许多android软件中存在的Content Provider信息泄露漏洞(参见链接:http://www4.comp.polyu.edu.hk/~appsec/),由于程序对Provider的权限设置不当,导致第三方软件可读取Content Provider提供的信息,其危害程度取决于Content Provider提供的信息内容,比如联系人、电话、短信等隐私信息就可能包含其中。默认情况下,Content Provider的权限为android:protectionLevel=”normal”,最好的权限设置应为signature或者signatureOrSystem,进而避免被第三方恶意软件利用。下面是DroidAppAuditter中用于检测Content Provider权限的关键代码:
- while(index($cont[$line],"<permission android:name=\"$ProviderName\"") == -1){
-
- if ($line <= $linecount) {
-
- $line++;
-
- }else{
-
- print "[中危]:Content Provider:$ProviderName 默认设置为\“normal\”权限,可能导致敏感信息泄露!\n";
-
- $CheckComponentResult .= "[中危]:Content Provider:$ProviderName 默认设置为\“normal\”权限,可能导致敏感信息泄露,建议修改为\“signature\”或者\“signatureOrSystem\”!\n";
-
- ……省略……
-
- last;
-
- }
-
- }
-
- if(index($cont[$line],"android:protectionLevel=\"normal\"") > -1){
-
- print "[中危]:Content Provider:$ProviderName 权限为\“normal\”,可能导致敏感信息泄露!\n";
-
- $CheckComponentResult .= "[中危]:Content Provider:$ProviderName 为\“normal\”权限,可能导致敏感信息泄露,建议修改为\“signature\”或者\“signatureOrSystem\”!\n";
-
- ……省略……
-
- }
除protectionLevel权限问题外,<grant-uri-permission>权限问题也可作为一个检测点,若设为true,可被其它程序通过URL访问到content provider的内容,容易造成信息泄露。
2011年盛大的安全研究人员DoDo在其博客写一系列关于Android安全的文章,其中有篇就提到关于Broadcast Receiver的问题,链接见:http://www.sectop.com/?p=128,这个依然是组件权限控制的问题,由于Broadcast Receiver被允许外部调用,可能被第三方恶意软件标记相关action给正常应用发送broadcast,那么正常应用就会对此进行响应处理,其危害程度也是取决于正常应用对广播接收采取的操作,比如发送短信、任务栏通知等操作,就有可能被用于钓鱼欺骗。防御此问题最简单的方法就是通过android:exproted来关闭receiver对外部应用的响应,但可能在同一公司开发的一些产品之间需要进行相互广播通讯,此时就可采取DoDo在文中提到的另一种方法:在receiver方的androidmanifest.xml中增加<permission>自定义权限项,并在sendbroadcast方得androidmanifest.xml中增加<uses-permission>匹配此权限。下面是DroidAppAuditter用于检测Broadcast Receiver权限的部分检测代码:
- if(index($cont[$line],"android:exported=\"flase\"") > -1){
-
- print "[安全]:Broadcast Receiver:$Receiver 禁止被外部调用!\n";
-
- $CheckComponentResult .= "[安全]:$Receiver 禁止被外部调用!\n";
-
- }
-
- elsif(index($cont[$line],"android:permission=") == -1){
-
- print "[低危]:Broadcast Receiver:$Receiver 可被外部调用,可能造成钓鱼欺骗,建议添加 android:exported=\"flase\"!\n";
-
- $CheckComponentResult .= "[低危]:Brodcat Receiver:$Receiver 可被外部调用,可能造成钓鱼欺骗,建议添加 android:exported=\"flase\"!\n";
-
- ……省略……
-
- }
除receiver和content provider的权限问题外,其它组件如service和activies也可能存在权限安全问题,亦可将其列入检测范围。其它
除上文中提到的各个安全检查点之外,读者还可进行扩充,比如其它组件权限、XSS、SQL注入检测、内存泄露、intent fuzzing等多个方向进行分析,DoDo’s Blog上面也有一些安全文章可作为参考,大家如果有什么好的思路或检测点也可邮件与本人交流:riusksk@qq.com。
对于业务量较大的公司,Android软件产品可能会很多,若一一通过手工检测,就会影响到效率,因此实现一款自动化审计工具是非常有必要的,至少可以减轻工作量,以腾出更多的时间出来看片……笔者将此审计工具命名为DroidAppAuditter,主要用Perl语言编写的,支持Android模拟器和实体机,可自动安装apk文件并运行软件,然后实现动态自动化检测,并图文并茂地输出分析报告。最后这里附上一份输出的完整分析报告,如下图所示,报告中的漏洞已于2011年修复:
业界Android软件安全现状
2011年我们借助自动化审计工具DroidAppAuditter,对业界各个主流Android软件进行安全审计,共审计了29个国内流行的Android软件,其中存在明文保存密码的有10个,其它XSS漏洞、明文传输,以及隐私窃取的行为共有12个,所有被审计的软件有超过一半是存在安全漏洞的。由此可见,目前android软件安全还未受到业界重视,但这也将成为今后发展的趋势。最后附上审计结果的部分截图,如下图所示:
本文主要探讨了Android软件的一些常用安全检测点,并通过代码实现自动化审计工具,希望对各位有所帮助,如果你有更好的检测方案,也可与本人探讨。至于审计工具,由于各种原因就不公开了,因为我相信:“授人以鱼不如授人以渔”。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。