分享Android App安全加固行业分析报告【图】
鉴于当前Android App安全加固市场火爆,特整合一个当前行业内较流行的安全加固厂商的安全加固产品介绍,希望能为大家拨开迷雾,见安全加固之真章!
UXSS是一种利用浏览器或者浏览器扩展漏洞来制造产生XSS的条件并执行代码的一种攻击类型,本文我们来看看Android UXSS阶段性小结及自动化测试。0x00 科普
WebView(网络视图)android中加载显示网页的重要组件,可以将其视为一个浏览器。在kitkat(android 4.4)以前使用WebKit渲染引擎加载显示网页,在kitkat之后使用谷歌自家内核chromium。
Uxss(Universal Cross-Site Scripting通用型XSS)UXSS是一种利用浏览器或者浏览器扩展漏洞来制造产生XSS的条件并执行代码的一种攻击类型。可以到达浏览器全局远程执行命令、绕过同源策略、窃取用户资料以及劫持用户的严重危害。
同源策略所谓同源是指,域名,协议,端口相同,浏览器或者浏览器扩展共同遵循的安全策略。详见: http://drops.wooyun.org/tips/151
0x01 事件
近段时间android UXSS漏洞持续性爆发涉及android应用包括主手机流浏览器、聊天软件等。下面截取几个案例。
WooYun: 搜狗手机浏览器跨域脚本执行漏洞之一
WooYun: 手机QQ安卓版两处跨域问题
WooYun: 猎豹/360/欧鹏/百度/遨游等手机浏览器安卓客户端UXSS(影响android4.4以下版本)
WooYun: UC浏览器Android最新版(4.4)跨域漏洞(不受系统版本限制)
引用某厂商对此漏洞的回应
非常感谢您的报告,此问题属于andriod webkit的漏洞,请尽量使用最新版的andriod系统。
的确漏洞产生的原因是因为kitkat(android 4.4)之前webview组件使用webview内核而遗留的漏洞。使用最新的android系统当然安全性要更高而且运行更流畅,但是有多少人能升级或者使用到相对安全的android版本了。下图来自谷歌官方2014.09.09的统计数据。
看起来情况不是太糟糕,有24.5%的android用户是处于相对安全的版本下。但是官方数据的是来google play明显和大陆水土不服。国内就只能使用相对靠谱的本土第三方统计了。下图是umeng八月的统计情况
能使用到相对安全的android系统的用户不到8%,那么问题来了~我要换一个什么的样的手机了。忘记我是个?潘苛耍?剖只?薹ㄉ?兜 kitkat也没钱换手机。那就只能选择使用相对安全的应用来尽量避免我受到攻击。于是我们收集了一些命中率较高的POC来验证到底哪些app更靠谱一些。
https://code.google.com/p/chromium/issues/detail?id=37383
https://code.google.com/p/chromium/issues/detail?id=90222
https://code.google.com/p/chromium/issues/detail?id=98053
https://code.google.com/p/chromium/issues/detail?id=117550
https://code.google.com/p/chromium/issues/detail?id=143437
https://code.google.com/p/chromium/issues/detail?id=143439
CVE-2014-6041
为了方便大家也能够方便测试其他应用我们尝试写出一个自动化的脚本来完成此项工作。
0x02 测试
http://zone.wooyun.org/content/15792
下图为360浏览器在android 4.2.2下的测试结果
下图为搜狗浏览器在android 4.4.3下的测试结果
测试代码将放入github供大家参考,欢迎大神来修改
代码地址: https://github.com/click1/uxss
在线测试地址: http://uxss.sinaapp.com/index.php
0x03 对比
我们对主流手机浏览器进行了横向对比,测试对象包括:UC浏览器、搜狗浏览器、百度浏览器、360安全浏览器、欧鹏浏览器、遨游云浏览器、猎豹浏览器。测试结果见下图。
0x04 建议
厂商(仅供参考):
1、服务端禁止iframe嵌套 X-FRAME-OPTIONS:DENY 。详见:http://drops.wooyun.org/papers/104
2、客户端使用 setAllowFileAccess(flase) 方法禁止webview访问本地域。详见: setAllowFileAccess(boolean)
3、客户端使用onPageStarted (WebView view, String url, Bitmap favicon) 方法在跳转钱进行跨域判断。详见[onPageStarted (WebView view, String url, Bitmap favicon)][8]
4、客户端对iframe object标签属性进行过滤。
用户:
1、使用漏洞较少的app,及时更新app。
2、不要随意打开一些莫名其妙的链接。
3、有钱你就买新手机吧,android L马上出来了。(可以通过google play推送安全补丁,呵呵)
手机开发中地图应用是相当广范的,现在我们来看看Android开发中如何获取google Map API Key的方法。地图应用使用com.google.android.maps这个包。通过MapView控件使用。但是之前需要申请一个用于开发的API Key,这个key会和当前的计算机用户绑定。然后通过这个key去官方申请就可以拿到一个开发用的api key了
<1>首先找到用户的debug.keystore文件,可以再”运行“里面搜debug.keystore;如:c:usersAdministrator.androiddebug.keystore
<2>接下来获取MD5指纹,网上很多说的有误。貌似新版默认是出现sha1加密的。通过添加-v 参数会显示所有。
首先运行cmd,在dos界面里,输入
keytool -list -v -keystore c:usersBystander.androiddebug.keystore
命令,然后会让你输入keystore密码,
输入:android,之后,会出现指纹认证MD5,如下:
<3>去官方生成真正的api key
访问 Sign Up for the Android Maps API 输入那串值,同意条款,确定后要求用Google帐号登录。然后会拿到一个key。ok
TexturePacker是一款把若干资源图片拼接为一张大图的工具,现在我们来看看如何用TexturePacker软件实现*.pvr.ccz和png格式图片互转。这两天在看一个安卓游戏,资源挺不错的,解压后发现animation里的图片格式全是pvr.ccz,查了下,这是做2D游戏spirit图打包后的格式,用的软件是TexturePacker,知道了软件那就知道如何解回去了。
下载TexturePacker
安装TexturePacker
将如下代码存成批处理
@echo off
path %path%;"C:Program Files (x86)TexturePackerbin"
for /f "usebackq tokens=*" %%d in (`dir /s /b *.pvr *.pvr.ccz *.pvr.gz`)
do (TexturePacker.exe "%%d" --sheet "%%~dpnd.png" --data "%%~dpnd.plist"
--opt RGBA8888 --allow-free-size --algorithm Basic --no-trim --dither-fs)
pause
将上面的批处理放在你的文件夹目录下,运行即可(支持遍历子目录)
将图片打包成pvr.czz,同样是需要一个批处理
@echo off
path %path%;"C:Program Files (x86)CodeAndWebTexturePackerbin"
for /f "usebackq tokens=*" %%d in (`dir /s /b *.png`) do (
TexturePacker.exe "%%d" --sheet "%%~dpnd.pvr" --data "%%~dpnd.plist"
--opt PVRTC4 --allow-free-size --algorithm Basic --no-trim --dither-fs
)
pause
利用这个工具,我们来下载游戏资源图片就方便多啦,虽然此工具是商业收费的,不过也有免费版。
不知道有多少Android开发着对Android虚拟机的那悲剧的性能有意见,反正我的看法是:那速度实在是太坑爹了!
为什么Android虚拟机比iOS和WP7的虚拟机要慢很多呢?原因如下:
1. Android 模拟器模拟的是 ARM 的体系结构(arm-eabi),而 iOS 和 WP7 的模拟器的目标体系结构都是 x86 的,另外 iOS 的模拟器中运行的 App 也是编译为 x86 的。这样一来 Android 模拟器需要做一些额外的二进制翻译工作。
2. Android 模拟器用的是 QEMU 的全系统模式(full system),也就说它模拟时需要启动整个 GUEST 系统,初始化各种模拟设备。相反的,iOS 和 WP7 的模拟器只是 user-mode 的模拟。
3. 在 Android 模拟器之中还需要跑一个 Dalvik VM,用以执行 Android 应用的 bytecodes。
综上所述,慢的一个主要原因就是虚拟机不是跑在x86上而是模拟的ARM,有没有办法弄个x86的Android呢?
答案是当然有———开源项目Android-x86,这个牛B的开源项目将Android移植到了x86平台,系统运行的时候不再需要模拟成ARM,这样就能直接将Android装在PC或虚拟机上流畅的运行了。
万事俱备,只欠东风了,下面我就来讲一下我使用Android-X86和VirtualBox打造手机开发模拟器的整个流程
1.下载Android-x86系统镜像文件
首先下载android-x86-2.2-generic.iso(直接点击该链接),镜像文件大约82MB
2.在VirtualBox上创建虚拟机
操作系统选择Linux,版本选择Linux 2.6
内存建议为512MB
硬盘默认8GB即可,因为是开发用,8GB绰绰有余了
虚拟机创建好之后,还需要修改一些配置
首先是调整网卡,连接方式建议选择bridged adapter这样虚拟机在局域网中有独立IP可以方便访问,然后控制芯片要选择为PCnet-PCI II,否则Android-x86无法识别网卡
如果你想有声音的话需要在声音设置面板将控制芯片设置为soundblaser 16
把虚拟机的光驱设置为我们刚才下载的Android-x86 iso之后,启动虚拟机
思想之地原创文章,谢绝转载
3.安装Android-x86到虚拟机
虚拟机启动后,你可以看到下面的画面
第一和第二的项目是让你不用安装体验高、中DPI的Android-x86,有兴趣的话可以先运行体验一下x86的速度
我们要安装Android到硬盘,选择最后一项后回车
Installation – Install Android-x86 to harddisk
接下来我们会进入安装界面,界面效果如下
我们选择Create/Modify partitions来创建分区
首先我们选择new来创建新分区
选择Primary创建主分区
分区大小采用默认大小即可
然后我们设定该分区可以引导(选中Bootable后回车),这是分区的flag会显示boot,然后我们再选择write将修改写入到硬盘(选择write之后还需要输入yes来确认)
分区完毕后再选择quit即可退出,退出后,我们就能看到刚才分配的新分区被识别出来了
按下回车选择该分区,这时会询问采用什么分区格式格式化分区,建议选择ext3
选择好格式后系统会再跟你确认一遍,输入yes安装就会开始了
安装中途会询问你是否安装Grub,这里一定要选择YES,因为我们后需要Grub来自定义启动Android
安装Grub的时候会询问你是否将/system目录安装为读写模式(设为读写可以更方便的debug,但是会占用更多的空间和安装时间),选择yes
回车后安装就会开始了
安装结束后,会弹出一个菜单
三个选项分别是
运行Android
创建一个虚拟SD卡
重启
因为我们开发肯定会用到SD卡,所以在此我们创建一个虚拟SD卡
创建时会询问SD卡的大小,根据你的需要设定即可,我在此设定的是128MB
回车后安装程序就会开始初始化sd卡了
格式完毕后,会提示重启,此时退出虚拟机光驱中的系统盘后重启,重启后就能进入Android系统了
注意使用在Android系统中使用鼠标的时候需要设置Virtual Box禁止自动鼠标独占,否则鼠标在Android中无法正常使用
Android-x86运行截图:
思想之地原创文章,谢绝转载
4.自定义虚拟机分辨率
我们在开发时肯定需要测试不同的分辨率,那么如何自定义Android虚拟机的分辨率呢?
首先我们需要从Virtual Box的设定入手
打开cmd,进入Virtual Box的下你创建的虚拟机的目录,我创建的虚拟机叫Android-x86,我的账户是Administrator,在我Windows XP上的路径是
C:Documents and SettingsAdministratorVirtualBox VMsAndroid-x86
注意:
1.在不同操作系统下路径会有一些不同,请根据操作系统的实际情况寻找,原则上都是在你当前用户的个人文件夹里
2.Android-x86是我创建的虚拟机的名称,如果你的和我的不同,请修改为你创建的虚拟机的名称
在这里我们需要使用VirtualBox提供的命令行工具来给你的虚拟机添加一个自定义分辨率,例如我想添加一个现在流行的手机屏幕分辨率 480×800,那么我们输入的命令如下
“C:Program FilesOracleVirtualBoxVBoxManage.exe” setextradata “Android-x86” “CustomVideoMode1″ “480x800x16“
上面的命令中,加粗的部分是要根据你自己电脑上的情况进行修改的,相关解释如下:
“C:Program FilesOracleVirtualBoxVBoxManage.exe”
是Virtual Box命令行工具VBoxManage.exe的完整路径,请根据你电脑上安装的VirtualBox的实际路径修改
注意:如果路径中含有空格请使用双引号将整个路径包起来
Android-x86
这个是虚拟机的名称
480x800x16
这个是自定义的分辨率,请根据自己的需要修改,后面的16指的是16位颜色,请勿修改
如果你想增加更多的分辨率,请修改参数后多次运行该命令即可
修改完毕之后,启动虚拟机,在Android的启动画面选中选项后按两次e键编辑内核启动参数,增加一个参数 vga=ask,具体流程如下
启动画面按e键
进入新画面后再按一次e键
这时进入内核参数编辑状态,增加参数 vga=ask
编辑完毕后按回车保存修改结果,这时会回到上一个页面,此时按下b键启动
此时系统会提示你按回车进入分辨率选择界面,我们按回车继续
进入页面之后,你可以看到所有系统支持的分辨率,这时请寻找你刚才设定的分辨率,在下图中,可以找到在先前设定的 480×800的分辨率,注意其前面的16进制代码360,如果想以该分辨率启动虚拟机,我们就输入360再回车即可
回车后Android就会按照你设定的分辨率来启动了,下图是以480×800分辨率启动的Android-x86虚拟机截图
注意:
如果你需要系统采用你指定的分辨率启动,需要在每次Android虚拟机启动的时候执行上面步骤的操作来修改内核参数启动Android
如果你想Android在启动的时候就默认进入分辨率选择画面或者默认采用你指定的分辨率启动虚拟机,那么可以参考以下步骤
1. 进入android虚拟机后按alt+F1进入命令行
2. 输入mkdir /data/fs
3. 挂载硬盘,使用下列命令
mount -t 硬盘格式 /dev/block/硬盘名称 /data/fs
硬盘格式为你虚拟机硬盘的格式,我这里是ext3 硬盘名称则是你虚拟机的
硬盘名称我这默认是sda1,表示第一个sata硬盘, linx下具体的硬盘命名规则请自行Google之
mount -t ext3 /dev/block/sda1 /data/fs
将硬盘挂在到 /data/fs文件夹上
4. vi /data/fs/grub/menu.list 编辑启动菜单列表 (vi这个命令行编辑器怎么用请自行Google之)
5. 和刚才启动时一样,在第一个kernel那一行的末尾增加 vga=ask 后保存
6. 重启虚拟机,这时候你就会发现每次Android启动的时候就会询问分辨率了
5.使用eclipse ADT在虚拟机上远程调试开发
现在虚拟机已经配置完成,下面来讲解如何使用eclipse来在上面运行和调试Android应用程序
在前面设定虚拟机的时候我把虚拟机的网卡设置成了bridged adapter,这样虚拟机在局域网中相当于一台独立电脑,你可以给它设置一个ip或者讲其网卡设置为dhcp状态来自动获取ip,我下面只讲解一下在 dhcp状态下如何查看android虚拟机ip的方法:
进入android虚拟机,按alt+F1进入命令,输入netcfg命令来查看网络状态,参考界面如下
其中eth0就是当前的网卡,后面的ip地址就是通过dhcp获得的ip地址
弄清楚之后再按alt+F7返回图形界面
此时我们打开eclipse,进入android开发插件的设定界面,选择ddms,勾选 Use ado host, 并在ADT host value 一栏填写虚拟机的ip地址,具体界面请参看下图
选择ok保存后,在ddms界面的device菜单上选择重启adb服务,重启后,就能看到ddms连接上虚拟机了
接下来就能和平常一样在虚拟上运行和测试你的Android程序了,enjoy~
最后总结一下这个环境的优缺点:
优点:
1.高速,相比Android SDK的虚拟机,无论是启动还是运行,本虚拟机要快上很多很多,让你可以流畅的运行测试你的Android应用,当然,也能舒服的在电脑上体验到Android系统:)
2.可以模拟平板电脑的环境
缺点:
1.硬件支持还是悲剧,像打电话,短信,重力感应,GPS摄像头什么的你还是得去弄台真机器调试(不过这些东西本来就不是模拟器能做的)
另外补充一下虚拟机中主页、返回、关机、菜单对应的键盘按键
Home键 -> Win键
返回键 -> ESC键
挂机键 -> alt+F4
菜单键 -> 键盘菜单键,一般在右边win键和ctrl键中间
相关文章
- 下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
- 作为前端,一直以来都知道HTTP劫持与XSS跨站脚本、CSRF跨站请求伪造。防御这些劫持最好的方法是从后端入手,前端能做的太少。而且由于源码的暴露,攻击者很容易绕过防御手段。但这不代表我们去了解这块的相关知识是没意义的,本文的许多方法,用在其他方面也是大有作用。...2021-05-24
Android开发中findViewById()函数用法与简化
findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20- 如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
- 夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
- 为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
- 如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
- 深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
- 下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
- java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
- TextView默认是横着显示了,今天我们一起来看看Android设置TextView竖着显示如何来实现吧,今天我们就一起来看看操作细节,具体的如下所示。 在开发Android程序的时候,...2016-10-02
android.os.BinderProxy cannot be cast to com解决办法
本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20- 这篇文章主要介绍了Android 实现钉钉自动打卡功能的步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下...2021-03-15
- 下面我们来看一篇关于Android 开发之布局细节对比:RTL模式 ,希望这篇文章对各位同学会带来帮助,具体的细节如下介绍。 前言 讲真,好久没写博客了,2016都过了一半了,赶紧...2016-10-02
- 普通关闭 我的mysql是自己下载的tar包,自己设定安装目录来安装的。停止mysql服务,说来简单,但不知道的话,还真是挠头。在这和mysql入门的同学们共享:)正确方法是,进入mysql的bin目录下,然后执行./mysqladmin -uroot -p shut...2015-11-24
- 首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置: 在AndroidManifest.xml中加入访问SDCard的权限如下: <!--...2016-09-20
- 下面来给各位简单的介绍一下关于Android开发之PhoneGap打包及错误解决办法,希望碰到此类问题的同学可进入参考一下哦。 在我安装、配置好PhoneGap项目的所有依赖...2016-09-20
用Intel HAXM给Android模拟器Emulator加速
Android 模拟器 Emulator 速度真心不给力,, 现在我们来介绍使用 Intel HAXM 技术为 Android 模拟器加速,使模拟器运行度与真机比肩。 周末试玩了一下在Eclipse中使...2016-09-20- 在安卓开发时我碰到一个问题就是需要实现全屏,但又需要我们来判断出用户是使用了全屏或非全屏了,下面我分别找了两段代码,大家可参考。 先来看一个android屏幕全屏实...2016-09-20
Android开发中布局中的onClick简单完成多控件时的监听的利与弊
本文章来为各位介绍一篇关于Android开发中布局中的onClick简单完成多控件时的监听的利与弊的例子,希望这个例子能够帮助到各位朋友. 首先在一个控件加上这么一句:and...2016-09-20