Google Gears是一個(gè)開源產(chǎn)品,它能夠開發(fā)用于離線使用的網(wǎng)頁(yè)應(yīng)用程序。目前,它已經(jīng)得到許多站點(diǎn)的支持。Google Gears的特色之一是支持跨域通信,而本文則向讀者介紹針對(duì)Google Gears的跨域通信模型的一個(gè)漏洞的攻擊方法。
一、關(guān)于Google Gears
Google Gears是一個(gè)著名的RIA基礎(chǔ)設(shè)施,被Google廣泛用于各種服務(wù),如Google Docs和Google Reader,同時(shí)還可以用于非Google提供的服務(wù),如MySpace、Zoho Writer以及WordPress。Gears實(shí)際上是一個(gè)瀏覽器擴(kuò)展,使得開發(fā)人員可以用來(lái)提供更豐富的網(wǎng)絡(luò)應(yīng)用程序,并提高網(wǎng)絡(luò)應(yīng)用程序的響應(yīng)速度。Gears的關(guān)鍵特性之一是能夠透明地創(chuàng)建既可以在線使用又可以離線使用的網(wǎng)絡(luò)應(yīng)用程序。
此外,Gears還具有以下特性:
以上說(shuō)明引自Google Gears的官方文檔。實(shí)際上,Gears最妙的地方之一在于對(duì)它的使用方式,即可以通過(guò)在網(wǎng)絡(luò)應(yīng)用程序的HTML代碼中插入JavaScript來(lái)調(diào)用Gears的應(yīng)用程序接口。因此,Gears的獨(dú)特之處在于它可以很輕松平滑地集成到現(xiàn)有的網(wǎng)絡(luò)應(yīng)用程序之中。對(duì)于Google Gears詳盡的解釋以及用法范例,可以參考Google Gears網(wǎng)站的“如何入門?”。
就像其它的RIA基礎(chǔ)設(shè)施一樣,Google Gears也為開發(fā)人員提高了跨域通信能力。這些能力對(duì)于開發(fā)人員來(lái)說(shuō)是非常重要的,因?yàn)槟軌蚴沟盟麄冊(cè)趯?shí)現(xiàn)mashup及其他所希望的特性時(shí)變得更加輕松。然而,跨域通信對(duì)于安全性來(lái)說(shuō)則有一些不利影響。一個(gè)粗劣實(shí)現(xiàn)可能導(dǎo)致攻擊者得以突破同源策略,并導(dǎo)致大規(guī)模的攻擊事件。所以,這種漏洞會(huì)導(dǎo)致災(zāi)難性的后果。
不久之前,人們發(fā)現(xiàn)Google Gears的跨域通信安全模型還不夠堅(jiān)固,因?yàn)樵谀承┣闆r下可以輕而易舉地繞過(guò)此安全模型。好在Google已經(jīng)對(duì)此進(jìn)行了改進(jìn),所以將此漏洞暴露出來(lái)也不算為過(guò)了。
二、Gears的跨域通信的實(shí)現(xiàn)
讓我們假定,我們是web開發(fā)人員,并且在http://Some.Site/建立了一個(gè)網(wǎng)頁(yè),該頁(yè)面會(huì)收集用戶在http://Another.Site/上的經(jīng)認(rèn)證的會(huì)話中收集有關(guān)信息。這些事情,完全可以通過(guò)Google Gears的WorkerPool應(yīng)用程序接口來(lái)完成。你只要利用createWorkerFromUrl(scriptUrl)方法加載一個(gè)Google Gears“工作人員”就行了。所謂Google Gears“工作人員”實(shí)際上就是一段JavaScript代碼,用于訪問(wèn)Google Gears提供的功能部件,如本地服務(wù)器、Http通信以及數(shù)據(jù)庫(kù)等。
Google Gears的“工作人員”可以從遠(yuǎn)程域載入,但是必須首先調(diào)用allowCrossOrigin()方法。這個(gè)可以看作是一項(xiàng)安全措施,用來(lái)防范在未授權(quán)的情況下遠(yuǎn)程加載“工作人員”。如果一個(gè)工作人員是從不同的域創(chuàng)建的,那么google.gears.factory的所有方法都不得用于該工作人員,直到allowCrossOrigin()被調(diào)用為止。這可以防止跨站點(diǎn)腳本攻擊,該攻擊可以讓攻擊者從另一個(gè)域裝入工作人員的URL,然后向那個(gè)工作人員發(fā)送惡意消息,如“delete-all-data”等。調(diào)用allowCrossOrigin()方法的工作人員應(yīng)該對(duì)messageObject.origin進(jìn)行檢查,并忽略所有來(lái)自非預(yù)期域的消息。
下面的描述引自Google Gears的官方文檔:
如果一個(gè)工作人員是從不同的域創(chuàng)建的,那么google.gears.factory的所有方法都不得用于該工作人員,直到allowCrossOrigin()被調(diào)用為止。
這可以防止跨站點(diǎn)腳本攻擊,該攻擊可以讓攻擊者從另一個(gè)域裝入工作人員的URL,然后向那個(gè)工作人員發(fā)送惡意消息,如“delete-all-data”等。
調(diào)用allowCrossOrigin()方法的工作人員應(yīng)該對(duì)messageObject.origin進(jìn)行檢查,并忽略所有來(lái)自非預(yù)期域的消息。
三、問(wèn)題所在
乍一看,這個(gè)保護(hù)措施似乎是無(wú)懈可擊的。然而,人們?cè)谠囉迷摶A(chǔ)設(shè)施的時(shí)候發(fā)現(xiàn),Google Gears工作人員的加載器具有一個(gè)相當(dāng)混亂的策略:它竟然對(duì)所加載的Gears工作人員文件的報(bào)頭視而不見!這實(shí)際上是為惡意攻擊開了一扇后窗,使得攻擊者能夠借此在目標(biāo)網(wǎng)站上植入惡意的Gears工作人員代碼。例如,可以上載具有圖像后綴的文件,而實(shí)際上文件中包含的卻是Gears工作人員代碼。稍后,Google Gears工作人員加載器會(huì)從其他Domain的執(zhí)行上下文中加載這些文件,而web服務(wù)器卻將其作為圖像文件對(duì)待!
因此,攻擊者可以籍此規(guī)避甚至破壞包含用戶的內(nèi)容的站點(diǎn)(論壇、web郵件、社交網(wǎng)絡(luò),等等)的安全限制。事實(shí)上,就連那些非常著名的服務(wù)也很容易受到上面所說(shuō)的方法的攻擊。此外,由于Gears工作人員代碼中沒(méi)有包含具體的“危險(xiǎn)”字符,所以使得各站點(diǎn)難以防御如下所示的基于Google Gears的跨域訪問(wèn)攻擊。
Google Gears工作人員代碼舉例如下:
|
上述腳本用于從http://TARGET.SITE抓取信息,并利用Google Gears的內(nèi)建的通信應(yīng)用程序接口將捕獲的信息傳遞給該腳本的遠(yuǎn)程調(diào)用者。
四、攻擊流程
⒈ 攻擊者創(chuàng)建一個(gè)包含惡意的Google Gears命令的文本文件,這些命令可以用來(lái)訪問(wèn)數(shù)據(jù)庫(kù)、使用HttpRequest模塊等等。
⒉ 攻擊者設(shè)法將文本內(nèi)容植入目標(biāo)域,例如 http://TARGET.SITE/Upload/innocent.jpg。 Gears的“工作人員”代碼并沒(méi)有包含可疑的字符,如〈、〉等等。因此,它被http://TARGET.SITE服務(wù)器端過(guò)濾掉的可能性不大。
⒊ 攻擊者創(chuàng)建一個(gè)http://ATTACKER.SITE/attack.html頁(yè)面,其中存放有一些Google Gears代碼,這些代碼將用于加載并執(zhí)行http://TARGET.SITE/Upload/innocent.jpg。
⒋ 在本例中,嵌入到innocent.jpg中的代碼會(huì)在http://TARGET.SITE 的上下文中加以執(zhí)行。因此,它有權(quán)訪問(wèn)Google Gears的客戶端對(duì)象,諸如數(shù)據(jù)庫(kù)、本地服務(wù)器數(shù)據(jù)以及各種web資源。為此,它可以使用Google Gears內(nèi)置的HttpRequest模塊來(lái)達(dá)此目的。
⒌ 在前面收集的所有信息可以很輕松地利用Google Gears的標(biāo)準(zhǔn)通信機(jī)制反饋給http://ATTACKER.SITE。
需要注意的是,雖然http://ATTACKER.SITE必須使用Google Gears,但是http://TARGET.SITE卻可以是任意寄放有用戶創(chuàng)建的內(nèi)容的站點(diǎn),而根本不必使用Google Gears。
五、修補(bǔ)措施
目前,Google Gears新發(fā)布的版本已經(jīng)修補(bǔ)了上述漏洞。具體的修補(bǔ)方法是,為Googl Gears設(shè)置一個(gè)專門的內(nèi)容類型報(bào)頭值(application/x-gears-worker),當(dāng)web服務(wù)器提供Googl Gears工作人員代碼文件時(shí)必須發(fā)送該值。 如果沒(méi)有該值,就會(huì)拒絕加載該工作人員文件。
雖然這個(gè)解決方案看上去很不錯(cuò),但是卻面臨輕微的向后兼容性問(wèn)題。使用Google Gears的Web開發(fā)人員應(yīng)當(dāng)意識(shí)到,這個(gè)修補(bǔ)方案要求他們做一些相應(yīng)的修改,例如為提供Google Gears工作人員的Web服務(wù)器中創(chuàng)建一個(gè)專門的規(guī)則,等等。要了解關(guān)于上面描述的新的安全限制的更多信息,請(qǐng)參考Googl Gears的跨域工作人員的相關(guān)文檔。
六、小結(jié)
Google Gears是一個(gè)開源產(chǎn)品,它能夠開發(fā)用于離線使用的網(wǎng)頁(yè)應(yīng)用程序。目前,它已經(jīng)得到許多站點(diǎn)的支持。Google Gears的特色之一是支持跨域通信,而本文則向讀者介紹針對(duì)Google Gears的跨域通信模型的一個(gè)漏洞的攻擊方法,Google Gears安全小組提供的解決方案。在修補(bǔ)該漏洞的過(guò)程中,Google Gears安全小組對(duì)于該問(wèn)題的迅速響應(yīng)以及提供的有效處理方法給人們留下了深刻的印象。


