Google Gears是一个开源产品,它能够开发用于离线使用的网页应用程序。目前,它已经得到许多站点的支持。Google Gears的特色之一是支持跨域通信,而本文则向读者介绍针对Google Gears的跨域通信模型的一个漏洞的攻击方法。
一、关于Google Gears
Google Gears是一个著名的RIA基础设施,被Google广泛用于各种服务,如Google Docs和Google Reader,同时还可以用于非Google提供的服务,如MySpace、Zoho Writer以及WordPress。Gears实际上是一个浏览器扩展,使得开发人员可以用来提供更丰富的网络应用程序,并提高网络应用程序的响应速度。Gears的关键特性之一是能够透明地创建既可以在线使用又可以离线使用的网络应用程序。
此外,Gears还具有以下特性:
以上说明引自Google Gears的官方文档。实际上,Gears最妙的地方之一在于对它的使用方式,即可以通过在网络应用程序的HTML代码中插入JavaScript来调用Gears的应用程序接口。因此,Gears的独特之处在于它可以很轻松平滑地集成到现有的网络应用程序之中。对于Google Gears详尽的解释以及用法范例,可以参考Google Gears网站的“如何入门?”。
就像其它的RIA基础设施一样,Google Gears也为开发人员提高了跨域通信能力。这些能力对于开发人员来说是非常重要的,因为能够使得他们在实现mashup及其他所希望的特性时变得更加轻松。然而,跨域通信对于安全性来说则有一些不利影响。一个粗劣实现可能导致攻击者得以突破同源策略,并导致大规模的攻击事件。所以,这种漏洞会导致灾难性的后果。
不久之前,人们发现Google Gears的跨域通信安全模型还不够坚固,因为在某些情况下可以轻而易举地绕过此安全模型。好在Google已经对此进行了改进,所以将此漏洞暴露出来也不算为过了。
二、Gears的跨域通信的实现
让我们假定,我们是web开发人员,并且在http://Some.Site/建立了一个网页,该页面会收集用户在http://Another.Site/上的经认证的会话中收集有关信息。这些事情,完全可以通过Google Gears的WorkerPool应用程序接口来完成。你只要利用createWorkerFromUrl(scriptUrl)方法加载一个Google Gears“工作人员”就行了。所谓Google Gears“工作人员”实际上就是一段JavaScript代码,用于访问Google Gears提供的功能部件,如本地服务器、Http通信以及数据库等。
Google Gears的“工作人员”可以从远程域载入,但是必须首先调用allowCrossOrigin()方法。这个可以看作是一项安全措施,用来防范在未授权的情况下远程加载“工作人员”。如果一个工作人员是从不同的域创建的,那么google.gears.factory的所有方法都不得用于该工作人员,直到allowCrossOrigin()被调用为止。这可以防止跨站点脚本攻击,该攻击可以让攻击者从另一个域装入工作人员的URL,然后向那个工作人员发送恶意消息,如“delete-all-data”等。调用allowCrossOrigin()方法的工作人员应该对messageObject.origin进行检查,并忽略所有来自非预期域的消息。
下面的描述引自Google Gears的官方文档:
如果一个工作人员是从不同的域创建的,那么google.gears.factory的所有方法都不得用于该工作人员,直到allowCrossOrigin()被调用为止。
这可以防止跨站点脚本攻击,该攻击可以让攻击者从另一个域装入工作人员的URL,然后向那个工作人员发送恶意消息,如“delete-all-data”等。
调用allowCrossOrigin()方法的工作人员应该对messageObject.origin进行检查,并忽略所有来自非预期域的消息。
三、问题所在
乍一看,这个保护措施似乎是无懈可击的。然而,人们在试用该基础设施的时候发现,Google Gears工作人员的加载器具有一个相当混乱的策略:它竟然对所加载的Gears工作人员文件的报头视而不见!这实际上是为恶意攻击开了一扇后窗,使得攻击者能够借此在目标网站上植入恶意的Gears工作人员代码。例如,可以上载具有图像后缀的文件,而实际上文件中包含的却是Gears工作人员代码。稍后,Google Gears工作人员加载器会从其他Domain的执行上下文中加载这些文件,而web服务器却将其作为图像文件对待!
因此,攻击者可以籍此规避甚至破坏包含用户的内容的站点(论坛、web邮件、社交网络,等等)的安全限制。事实上,就连那些非常著名的服务也很容易受到上面所说的方法的攻击。此外,由于Gears工作人员代码中没有包含具体的“危险”字符,所以使得各站点难以防御如下所示的基于Google Gears的跨域访问攻击。
Google Gears工作人员代码举例如下:
|
上述脚本用于从http://TARGET.SITE抓取信息,并利用Google Gears的内建的通信应用程序接口将捕获的信息传递给该脚本的远程调用者。
四、攻击流程
⒈ 攻击者创建一个包含恶意的Google Gears命令的文本文件,这些命令可以用来访问数据库、使用HttpRequest模块等等。
⒉ 攻击者设法将文本内容植入目标域,例如 http://TARGET.SITE/Upload/innocent.jpg。 Gears的“工作人员”代码并没有包含可疑的字符,如〈、〉等等。因此,它被http://TARGET.SITE服务器端过滤掉的可能性不大。
⒊ 攻击者创建一个http://ATTACKER.SITE/attack.html页面,其中存放有一些Google Gears代码,这些代码将用于加载并执行http://TARGET.SITE/Upload/innocent.jpg。
⒋ 在本例中,嵌入到innocent.jpg中的代码会在http://TARGET.SITE 的上下文中加以执行。因此,它有权访问Google Gears的客户端对象,诸如数据库、本地服务器数据以及各种web资源。为此,它可以使用Google Gears内置的HttpRequest模块来达此目的。
⒌ 在前面收集的所有信息可以很轻松地利用Google Gears的标准通信机制反馈给http://ATTACKER.SITE。
需要注意的是,虽然http://ATTACKER.SITE必须使用Google Gears,但是http://TARGET.SITE却可以是任意寄放有用户创建的内容的站点,而根本不必使用Google Gears。
五、修补措施
目前,Google Gears新发布的版本已经修补了上述漏洞。具体的修补方法是,为Googl Gears设置一个专门的内容类型报头值(application/x-gears-worker),当web服务器提供Googl Gears工作人员代码文件时必须发送该值。 如果没有该值,就会拒绝加载该工作人员文件。
虽然这个解决方案看上去很不错,但是却面临轻微的向后兼容性问题。使用Google Gears的Web开发人员应当意识到,这个修补方案要求他们做一些相应的修改,例如为提供Google Gears工作人员的Web服务器中创建一个专门的规则,等等。要了解关于上面描述的新的安全限制的更多信息,请参考Googl Gears的跨域工作人员的相关文档。
六、小结
Google Gears是一个开源产品,它能够开发用于离线使用的网页应用程序。目前,它已经得到许多站点的支持。Google Gears的特色之一是支持跨域通信,而本文则向读者介绍针对Google Gears的跨域通信模型的一个漏洞的攻击方法,Google Gears安全小组提供的解决方案。在修补该漏洞的过程中,Google Gears安全小组对于该问题的迅速响应以及提供的有效处理方法给人们留下了深刻的印象。