Android Webview UXSS 漏洞攻防
“前事之不忘,后事之师”—— 《战国策·赵策》
【开篇:前车之鉴】
随着移动互联网的发展,很多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 WebKitHTMLObjectElement 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可影响在浏览器访问的所有站点,因此才将其称为通用型跨站。