瀏覽器中的安全窗口通信

本文爲論文《Securing Frame Communication in Browsers》的讀書筆記。

該論文基於瀏覽器的安全策略,主要着眼於瀏覽器中的窗口通信(frame communication)。

現在隨着網民的不斷增多,瀏覽器在用戶的網絡生活中扮演着一個不可或缺的角色,但是瀏覽器在顯示用戶所需的網頁時,並非是安全的。現在絕大多數的網站在窗口中植入第三方的內容,而對於用戶來說,主要依靠瀏覽器的安全策略來保證不受惡意內容的攻擊或者影響。在瀏覽器中,窗口其實並不是很充分的獨立存在,因爲現在越來越多的瀏覽器,允許窗口內容可以通過導向來控制其他的窗口。

在該論文中,評估了現有的一些窗口導向策略,並且倡導瀏覽器執行一種更加嚴格的策略。首先,可以看到的是,窗口之間的隔離必定會或多或少的影響窗口之間的通信。對於以上結論,作者分析了窗口間通信的兩種技術:fragment identifier channel和postMessage。首先,第一種技術fragment identifier channel,它提供了保密的通信但是卻不能保證通信的身份驗證。而第二種技術postMessage,它提供了通信的雙方身份驗證,但是卻在現實應用中發現有一些攻擊者可以破壞其中的保密性。作者通過修改postMessage API 接口來實現窗口通信的保密性。

 

正文中,作者在介紹窗口通信的時候,涉及到了三個術語:mashup,integrator,gadget。其中mashup代表網站將好幾個源發過來的內容整合的過程,integrator代表整合這些內容的主動方,gadget則代表被整合的內容。

在瀏覽器的實際工作中,瀏覽器的窗口內容之間會存在兩種狀態,一種是相互孤立(isolation),另一種是相互通信(communication)。孤立的好處是,窗口之間的運行不受彼此的影響,即一個窗口不會產生對其他窗口的導向。這看似簡單嚴謹,但是隨着瀏覽器的發展,這個窗口策略變得不符合實際的需求,從而使得瀏覽器的質量有所影響。由於嚴格的孤立策略,瀏覽器中窗口間的交互變得很受限制,從而使得孤立的窗口間協作通信變成了一個不得不重視的問題。在這個問題地研究過程中,業界出現兩種窗口間通信的方法:fragment identifier channel和postMessage。

由於瀏覽器窗口通信中存在安全問題,故作者在隨後的一個模塊介紹了瀏覽器上的危險模型(Threat Model)。其中基於瀏覽器的最主要的攻擊是,破壞瀏覽器窗口間的交互,或者竊取一些敏感的隱私信息。這些攻擊的方式是在瀏覽器中植入惡意內容,或者修改瀏覽器中的某些狀態。

在介紹完Threat Model以後,作者花大篇幅來敘述了現有的窗口導向策略,並粗略的講述了目前衆多流行的瀏覽器使用的策略。

 

作者從窗口孤立(frame isolation)出發,畢竟窗口的通信都是在這基礎上的更進一部,從一開始的腳本策略和導向策略。腳本策略主要通過在一個窗口中的腳本來控制其他的窗口,這樣的話把窗口間的很多實現都轉交給腳本。導向策略的主要思想是一個窗口可以導向任何其他的窗口。這樣的好處主要是可以通過在從URL中獲取的內容來替換窗口的文檔內容。

作者還介紹了兩種攻擊:Cross-Window Attack和Same-Window Attack。

Cross-Window Attack主要是基於用戶需要在某一個窗口中輸入登錄信息(帳號密碼等),一旦該窗口中包含有向惡意網站的導向,那麼這些信息將有可能會被攻擊將輸入信息窗口的內容發送到惡意網站。對於這樣的攻擊有一種很嚴格的策略防止,那就是Window Policy,也就是說一個窗口只允許導向這個窗口內的其他窗口。

可以說Window Pocily是一個很好的策略,但是這並不代表它可以被廣泛地應用到如今的瀏覽器中,原因很簡單,那就是發展過程中,mashup完全違反了它的安全假設,也就是用戶不會植入不受信任的內容。

既然mashup違反了window policy的假設,所以在mashup的過程不能保證不受攻擊。這樣的攻擊主要有Gadget HijackingAttacks。在這類攻擊中,攻擊者可以控制被合法integrator植入的gadget,從而攻擊擁有了攻擊的平臺。也就是說,一個惡意的gadget可以控制一個gadget導向惡意網站,從而向用戶扮演這個gadget的角色。

由於在mashup的過程中也會出現安全問題,所以在實際運行中需要更加嚴謹的策略來支持瀏覽器窗口通信的安全。所以除了以上比較寬鬆的window policy以外,還有兩種另外的窗口導向策略: Descendant Policy和Child Pocily。前者是允許窗口可以導向到他的子孫處,而後者只允許它導向到它的兒子處,可見後者要比前者更加嚴格。

而後,作者講述了一種技術:像素代表(Pixel Delegation)。可見Descendant Policy採取了在安全和兼容性之間的完全權衡,因爲它並不是那麼嚴格。所謂像素代表,也就是父窗口在子窗口看來只是代表了屏幕上的一個像素區域。瀏覽器可以防止子窗口超越這些屏顯範圍。

 

在介紹完威脅模型和窗口導向策略以後,作者講述了窗口通信的機制。主要是基於兩個通信方法:fragment identifier channel和postMessage。

fragment identifier channel可以使得mashup開發者在單獨的窗口中安置每一個gadget,並依靠瀏覽器的安全策略來實現防止惡意gadget攻擊integrator和受信任的gadget。

爲了理解該方法中的安全屬性。如果一個信息是保密的話,那也就是這個信息只能被這個信息的接受方讀取。但是這個機制卻是一個缺乏安全的信道,因爲它缺少身份認證,也就是說當一個接受方接收到一個信息的時候,它不具備能力來辨別這個信息到底是誰發過來的,所以說這個機制是不具備身份驗證的。另外該方法的安全屬性是通過公鑰加密來實現的。一方面公鑰極易容易收到網絡的感染,另一方面該機制主要受限於瀏覽器中的窗口導向策略。當然也可以通過一些加強的協議使得該機制變得安全,比如說使用Needham-Schrooeder-Lowe協議。

和fragment identifier channel不同的是,postMessage的設計主要是爲了網站間通信的。

在瀏覽器中如果一個窗口需要向另一個窗口發送一個信息的話,那麼發送方只需要調用一個postMessage方法就可以了。然後瀏覽器會生成一個message事件,這個事件會包含消息,發送方的源,還有一個指向這個窗口的指針。

可以看到postMessage的安全屬性中可以做到身份驗證,因爲在發送的這個信息中,需要包含發送方的源,這樣的話接收方對於信息的來源是可以獲知的。但是它卻缺乏信息的保密性。

大家普遍認爲postMessage是一個安全可靠的窗口通信方法,但是攻擊可以攻擊信息的保密性對信息進行攻擊。其中包括Recursive Mashup Attack,Reply Attack。

關於安全的postMessage,作者也介紹了一些方法,其中就有在該方法的基礎上添加另一種API CommRequest。因爲這個API接口只會傳輸到特定的一定方,這樣的話也就多了身份驗證。
發佈了47 篇原創文章 · 獲贊 10 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章