iOS浏览器与UIWebview
iOS平台极为流行(StatCounter数据显示其为第三大流行平台)。移动浏览器约占20%至25%的市场份额。iOS提供与桌面浏览器及云端的集成(攻击者可获取相同数据)。许多第三方iOS浏览器存在相似弱点,这些弱点仍被新浏览器复制…且iOS被部分漏洞赏金计划采纳。
默认iOS浏览器为Mobile Safari。根据iOS应用商店审核指南,“2.17 浏览网页的应用必须使用iOS WebKit框架和WebKit Javascript”。当然,Mobile Safari并非苹果商店中唯一浏览器,部分浏览器亦在桌面端使用。
浏览器基于UIWebView构建,该组件允许在应用中嵌入网页内容。UIWebView与原生Mobile Safari的关键差异集中于UI。两者核心均使用WebKit,但原生浏览器使用Viewport而非UIWebView。UIWebView API简洁直接,支持获取远程文件/HTML字符串/二进制数据,并可编程实现基本导航功能(后退、前进、停止加载、重新加载)。stringByEvaluatingJavaScriptFromString
函数允许从字符串执行Javascript,且其权限与来源页面(request.mainDocumentURL
)相同。远程Web服务器可通过内容安全策略(CSP)阻止Javascript执行。Javascript用于实现浏览器功能及重写原生函数,以通过Objective-C代码桥接(如实现多标签页)。最后,UIWebViewDelegate API允许响应加载文档中的特定事件。
演讲者解释其研究主要聚焦多标签页行为、地址栏、自动填充与密码管理器、下载、对不受信任SSL证书的支持及其他功能(安全评级、恶意软件防护、云集成)。他们受“浏览器安全手册”(http://browsersec.googlecode.com)启发,该手册提供一组可于浏览器运行的测试用例(参见http://browsersec.googlecode.com/files/browser_tests-1.03.tar.gz)。此外,他们从Web角度进行黑盒测试、Javascript代码审查及少量逆向/调试。他们准备了跨浏览器测试用例并发布于https://ios.browsr-tests.com。
此外,他们重新测试了部分既往Mobile Safari漏洞(CVE-2011-3426等),发现部分修复不完整。
UXSS(通用跨站脚本)
Lukasz称,UXSS中攻击者利用浏览器漏洞。报告某些漏洞时,浏览器开发者通常回应“WebKit应处理同源策略,对吧”,归咎于iOS。他们发现此假设/反应并非总是正确。人们常仅关注功能而非安全。CVE-2013-6893、CVE-2013-7197及CVE-2012-2899为各浏览器(Mercury、Yandex、Google)中UXSS漏洞的若干示例。多数情况下,问题源于浏览器支持多标签页使用且可指定子窗口/标签页中显示/执行内容。iOS上WebKit并无真正多标签页,这意味着浏览器开发者需自行实现所有必需功能。桌面浏览器所用技术相对安全,但iOS浏览器并非如此。他们解释,父窗口/标签页使用原生UIWebView同源策略。创建新标签页需使用Objective-C“桥接”,且开发者需记得更新地址栏及其他UI元素。为此需自定义同源策略。最终子窗口/标签页再次使用原生SOP。
此外,由于移动浏览器无原生文件下载方式,它们通常加载文件后通过本地file://
源写入。某些情况下,文件(通过Content-Disposition: attachment
)显示于托管站点源中。iOS 5+实现了新“隔离附件源”,但未修复所有问题。操纵Content-Type
亦产生有趣结果:text/plain
可被执行为HTML(< iOS 7,现已修复),application/octet-stream
同样可被执行为HTML,且打开application/other
页面将触发Mobile Safari询问使用何应用打开文件(可能获得本地跨源权限)。无论如何,若能执行JS并打破同源策略,则可窃取Cookie、访问内部网站等。他们解释窃取密码并不容易。为正确处理本地HTML文件,开发者应以text/plain
打开文件、应用内容安全策略标头、使用HTML5沙箱,或使用Quick Look而非UIWebView(因Quick Look不支持Javascript)。
从攻击视角,利用UXSS时若还能欺骗地址栏则成功几率增加。事实上,有时甚至无需UXSS漏洞,仅能欺骗地址栏即足够。实际上,无法真正使用框架且通常仅能攻击移动浏览器父/顶层窗口,无法真正将窗口隐藏于另一窗口下…故UXSS漏洞成功率可能相对有限。
ABS(地址栏欺骗)
Marek解释地址栏为移动浏览器开发者编程部分,非UIWebView组成部分。更改网站内容而不更新地址栏的能力显然不佳。实现此的一种可能方式为使用超时函数更新当前页面内容。“初始与中断”技术为达成ABS的另一方式。代码不等待页面加载而中断加载并加载其他内容。亦可告知浏览器回退至特定页面。于卡巴斯基安全浏览器及F-Secure安全浏览器中发现漏洞。某些情况下,即使使用自签名证书加载页面,浏览器仍保持绿色“证书正常”图标。
部分浏览器易受先加载无效页面后重定向至最终钓鱼页面而不更新地址栏的场景影响。循环加载页面且先连接未监听端口再连接实际页面/端口,或允许控制地址栏URL(因端口常不显示)。
修复此问题需显示UIWebView中当前加载URL而非预期URL。此外,于各事件(包括webView::didFailLoadWithError
)更新地址栏。最后,若存在实际成功且有效的SSL连接,则显示SSL锁有意义。而非之前。
其他常见弱点
他们还研究了其他漏洞,包括URI方案(影响下载、发送未认证推文及绕过弹出窗口阻止程序)与URL处理(Mobile Safari中格式字符串内存破坏漏洞允许泄漏栈内容,甚至使用代理渲染时访问服务器文件系统)。
密码管理器功能亦由Web浏览器开发者实现。于一场景(卡巴斯基安全浏览器)中,研究人员能通过MITM漏洞(插入自动接收用户名/密码的隐藏框架)从密码管理器窃取密码。地址栏将短暂更新(除非与ABS结合),但演示攻击成功。
最后,SSL处理方式重要。默认情况下,iOS UIWebView HTTPS请求的无效证书无用户交互即被拒绝。某些漏洞可改变此行为(用户将接受自签名证书)。Opera Coast 3.0为易受简单MITM攻击的浏览器之一。
关于演讲者
Lukasz Pilorz——前国际电子商务平台应用安全专家,现于某英国大银行任渗透测试员。OWASP波兰会议常驻演讲者及波兹南分支发起人。其Web安全生涯始于2006年sla.ckers.org。
Marek Zmyslowski拥有多年渗透测试经验,包括数家波兰银行及金融机构的银行系统与电子银行。现于某世界最大银行作为首席渗透测试专家测试内部系统。持有Offensive Security的OSCP与OSCE证书。亦为OWASP波兰董事会成员。Marek毕业于华沙理工大学电子与信息技术学院。
© 2014 – 2021, Peter Van Eeckhoutte (corelanc0d3r)。保留所有权利。