首页
社区
课程
招聘
[原创]Android Webview UXSS 漏洞攻防
发表于: 2014-10-10 09:35 8998

[原创]Android Webview UXSS 漏洞攻防

2014-10-10 09:35
8998

【标题】Android Webview UXSS 漏洞攻防
【作者】riusksk
【团队】腾讯安全应急响应中心
【时间】2014年9月23日

“前事之不忘,后事之师”        —— 《战国策•赵策》

【开篇:前车之鉴】

        随着移动互联网的发展,很多PC端的安全问题也在移动端逐步出现。比如,使用WebKit内核的Chrome浏览器此前就出现过各种通用型的XSS(即UXSS,见文末附注)【如图1】,现在Android上也出现同类漏洞。Google把WebKit移植到了Android上,并将其作为WebView组件封装在SDK中,但官方忘记了“前车之鉴”,导致曾经在WebKit出现过的漏洞,在Android系统上再一次重现,即使该漏洞在PC版Chrome上已修复过。


图1 :Chrome UXSS漏洞列表

        目前,许多Android应用是直接使用系统自带的WebView,进而导致系统上安装的各类应用可能受到WebView漏洞的影响,这就进一步将漏洞影响范围扩大化,使得各种主流应用都受其影响,一场未见销烟的血雨腥风就此展开。

【中篇:血雨腥风】

        从2011年开始,Google的chromium项目的Bug列表就陆续被报告webkit存在一些UXSS漏洞。比如CVE-2011-3881 WebKit HTMLObjectElement UXSS漏洞,其对应的PoC代码【如图2】:


图2:CVE-2011-3881 PoC代码

该漏洞主要由于HTMLPlugInImageElement::allowedToLoadFrameURL函数中对Javascript URL地址校验不足导致的跨域问题。查看下修复前后的代码对比【如图3】,可以发现修复代码对使用Javascript伪协议的URL增加了安全检测,只有当前域与内嵌ifame域的serucityOrigin安全信息(比如protocol、domain、host、port等等)在许可范围内才能互相访问,即浏览器的“同源策略“。


图3:补丁代码对比

补丁代码是调用securityOrigin::canAccess来检测是否同源,对应代码【如图4】。该函数主要执行以下操作:
1.        先判断两个securityOrigin信息是否相同,是否具备唯一性,相同时则返回真,不相同时又会根据是否设置document.domain进行不同的检测;
2.        当两者均未设置document.domain时,则检测URL中的scheme、host、port是否相同,相同则返回真;
3.        当均设置document.domain时,则检测URL的domain与scheme是否相同,相同则返回真;
4.        若是打开本地文件,则执行其它文件安全检查。


图4:SecurityOrigin::canAccess函数代码

其它很多UXSS漏洞也是对源检测不全导致的跨域问题,虽然在Chrome浏览器上修复了,但由于Android系统引用了同一套WebKit,导致曾被修复的漏洞再次重现。
        2013年底,国内安全人员就开始陆续将这类Android UXSS爆光在网上,也有不少人到乌云平台上刷分。之后,各种主流IT资讯站点、漏洞平台、自媒体上纷纷可以见到Android上各种弹框框的场面,尤为火爆。
        此前,腾讯安全中心终端安全团队也对Android UXSS漏洞进行过研究,发现此类UXSS漏洞危害还是比较大的,且影响到许多主流的Android应用,特别是涉及金融交易、个人通讯等敏感功能的应用,很容易导致资金被窃、帐号被盗或者隐私泄露。对此,TSRC的同学做了个演示demo,通过提供一个二维码或者url发送给他人,当使用聊天工具或者购物应用扫描二维码或者打开链接后,那么就可以窃取到他人的个人资料【如图5】。


图5:利用UXSS漏洞窃取用户资料
       
        同时,TSRC的同学也开发出一款UXSS自动化检测工具【如图6】,既支持批量测试,也支持PC、Android浏览器的检测,也发现当前国内一些Android下的浏览器也受UXSS漏洞影响,个别PC端的浏览器也受到影响。


图6:浏览器UXSS自动化检测工具

        Android UXSS主要是Android系统本身遗留的安全问题,但如果都各大应用厂商都依赖Google来修复的话,就显得过于被动了。而且即使Google修复了,多数用户也未必会及时升级。这样的话,许多用户依然可能会受到UXSS漏洞的影响。所以对于各应用厂商而言,动手去堆壁固垒筑造属于自己的城防是很有必要的。

【下篇:堆壁固垒】
       
        在Android的WebViewClient对象中,提供有一个叫OnPageStarted的事件方法【如图7】,它是WebView注入代码最早的事件,因此我们可以在攻击者利用UXSS注入JS代码前执行我们自己的检测代码,判断是否存在跨域操作。


图7:OnPageStared事件方法

        与此同时,还可通过对动态创建的危险元素进行 JS Hook,比如iframe、object等元素,然后再跟踪里面的的事件行为,看是否存在跨域,若存在就全部过滤掉,拒绝加载。
        目前腾讯安全中心终端安全团队已经完成该防御方案的开发,其测试效果【如图8】,可在不破坏程序稳定性的情况下,防御Android上的UXSS漏洞。

         
图8:Android UXSS防御工具Demo

        前面提到的这些UXSS漏洞,目前已经在最新版Android 4.4中修复,同时它也提供了自动升级webkit的功能,以便及时修复漏洞,因此建议广大用户尽量采用最新版的Android系统。
        对于厂商,除采用OnPageStarted + JS Hook的方法,还可以打包最新的Webkit内核供自家产品调用,但这会大大增加应用包的体积,而且需要跟随Google Webkit官方进行更新,相对麻烦一些,各厂商可根据自身情况选定。

【后记:路漫漫其修远】

        Android UXSS只是Android漏洞上的冰山一角,除此之外,还有addJavascriptInterface执行漏洞、FakeID漏洞等等,未来可能还会有其它漏洞被爆光,在面对这类安全问题时,如何更好地防御它,我们还有很多路要走。
        有攻,必有防,如何在攻与防的对立统一中寻求突破,是一个安全人员永恒的话题。

【附注:何为UXSS】

        通用型跨站脚本(UXSS,Universal Cross-Site Scfipting),主要是利用浏览器及插件的漏洞(比如同源策略绕过,导致A站的脚本可以访问B站的各种私有属性,例如cookie等)来构造跨站条件,以执行恶意代码。它与普通的XSS的不同点就在于漏洞对象及受害范围的差异上,如表1所示。

表1:UXSS与普通XSS的对比


正是由于UXSS可影响在浏览器访问的所有站点,因此才将其称为通用型跨站。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 3
支持
分享
最新回复 (6)
雪    币: 859
活跃值: (309)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
2
泉哥沙发 我先坐,其实坐沙发也是一种生活态度~
2014-10-10 09:45
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
3
前排支持楼主!
2014-10-10 10:18
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
泉哥威武,前排围观
2014-10-10 10:50
0
雪    币: 507
活跃值: (130)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
强大的xss,连android都没法避免了,前排广告位友情出租~
2014-10-10 11:13
0
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
6
谢谢分享〜〜赞
2014-10-10 12:06
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
uxss漏洞用到Android了啊
2014-10-17 12:28
0
游客
登录 | 注册 方可回帖
返回
//