WebExtension安全漏洞詳解 Part 1
在本文中,我們將為讀者介紹Web擴展安全方面的知識。
我們知道,Web擴展提供了大量的新API,為了能夠在這個安全領域自由翱翔,首先需要了解它們的運行機制。
WebExtension安全性概述
對於瀏覽器在網路內容方面所面臨的基本安全問題,我想大家都已經很熟悉了。實際上,Web內容所面臨的大多數安全問題(同源策略違規、XSS、clickjacking等)也適用於WebExtensions。但是,這裡要討論的是WebExtension所特有的安全問題,為此,我們需要了解一些WebExtension方面的新知識。為此,我們建議讀者閱讀MDN,或者考察一些小型WebExtension的源代碼以獲得更好的理解。
關於許可權
所有WebExtensions都必須提供一個名為manifest.json的文件,其中包含描述擴展的元數據。在這裡,我們將重點關注該文件中的數組變數permissions。如果您曾經安裝過瀏覽器擴展的話,就會發現安裝之前會先顯示一則提示信息,告訴您該擴展所提供的功能。
例如,如果WebExtension許可權數組中包含「bookmarks」的話,則在安裝之前會通知用戶該擴展將有權訪問其書籤。有了這種許可權的話,我們就可以通過編程來破解用戶的書籤。
同樣,如果我們獲得了「downloads」許可權的話,就能夠與下載管理器進行交互。當然,我們可以同時獲取這兩種許可權,並且在安裝之前會向用戶告知這兩種許可權。
此外,我們也可以添加帶有通配符的網站。這樣的話,就能一次添加多個網站,只要它們符合匹配模式。
說到這裡,有心的讀者可能已經注意到了其中隱含的安全問題。如果您具有使用類似「*://*.example.org/*」這種模式的許可權,那麼您的擴展就可以在「https://anything.example.org/anything」上執行JS。
因此,如果您請求的是站點A的許可權,但是卻能在另一站點(不匹配的許可權)站點B執行代碼的話,那麼這可能就是一個安全漏洞。此外,您還可以請求文件:URI方案的許可權。
需要注意的是,通配符*://不能匹配file: URL這種形式,而只能匹配http/s,所以您必須明確寫出來。同樣,如果您請求的是使用「downloads」API的許可權,卻能以某種方式通過它來訪問書籤(這需要「bookmarks」許可權)的話,那麼這也是一個值得注意的安全漏洞。
鏈接限制
在各種許可權中,最有趣的就是了,在FireFox上,該許可權允許您在任意內容的URL(包括http/s和file:URI)上執行任意JS,但不允許訪問特權(about:addons)和半特權URL(稍後將詳細介紹)。
請記住,Firefox允許您的擴展在file:URL(具有或file://*許可權)內執行JS,但是這並不意味著您可以以編程方式打開file:URL。
用戶必須使用瀏覽器手動打開一個文件,然後您才能夠向其中注入JS(然後通過將JS注入到一個file: URL,繼而通過注入的JS來打開其他file: URL)。因此,如果您可以(在Firefox上)以編程方式打開file: URL(無需依賴用戶為您打開任何內容),那麼這就是一個從天而降的「大餡餅」。
但是,對於Chrome瀏覽器而言,在默認情況下,我們可以通過編程方式打開file: URL(具有適當的匹配模式許可權)。需要注意的是,在默認情況下(或使用適當的匹配模式)是無法注入JS的。如果想注入JS,需要選中特定WebExtension選項,具體如下所示。如果在沒有選中「Allow access to file URLs」複選框的情況下,就能夠在file:URL中注入JS的話,說明您找到一個安全漏洞。
上面為大家詳細介紹了與瀏覽器擴展有關的相關知識,接下來我們向讀者介紹幾個與瀏覽器擴展有關的安全漏洞。在本文的第2部分中,我們將會為讀者介紹更多的相關漏洞。
CVE-2018-5113——launchWebAuthFlow可以打開特權頁面——Firefox瀏覽器
利用「identity」許可權,我們可以訪問用於啟動OAuth2登錄流程的launchWebAuthFlow函數。下面給出JS PoC:
正如讀者已經注意到的那樣,該函數會檢查redirect_uri是否被附加到url,否則會拋出一個錯誤。更重要的是,這裡能打開about:addons頁面(本例中是通過一個新窗口打開的)。
正如我上面提到的,除非用戶已經打開過單個文件的URL(至少一次),否則Firefox是不允許擴展打開諸如about:addons之類的頁面或本地文件的。
所以,利用這個安全漏洞,我們就可以讀取整個磁碟,或利用它來鏈接另一個漏洞,來發動其他方面的攻擊。
這裡可能會讓人感到困惑,因為Chrome是允許導航至特權頁面(about: pages)的,而Firefox則不允許。據我所知,Mozilla安全團隊認為這樣做會帶來安全風險,因為如果與其他漏洞相結合的話,會導致更大的安全漏洞。
例如,WebExtensions中可能存在一個允許在特權頁面上執行任意JS執行的漏洞,但是除非用戶明確這麼做,否則是不能自動打開這樣的頁面(about:home不是特權而是半特權頁面,而特權頁面在默認情況下是可能導致RCE問題。)所以,這裡的漏洞可以用來打開一個特權頁面,然後通過其他漏洞向其中注入代碼,以實現RCE攻擊。
Firefox禁止打開具有特權的about: pages頁面的另一個原因也很簡單:XSS。
我曾經在Firefox瀏覽器的「about:cache」頁面中找到了一個XSS漏洞。然而,為了觸發這個漏洞,要求受害者訪問兩個特權頁面。
首先,受害者需要訪問以下URL:
about:cache-entry?storage=memory&context=&eid=&uri=http://aa.com
然後,受害者還必須訪問下面的URL:
about:cache?storage=memory&context=
在第一步中,對原始的輸入進行緩存時,好像沒有對參數eid進行嚴格的過濾。不幸的是,雖然這裡的about:cache頁面沒有特權(不能執行RCE),但它仍然包含了大量的私人數據。
很明顯,除非結合其他允許打開任意about: URL的安全漏洞,否則這個XSS本身沒有多大的用處。為此,可以設法讓用戶安裝一個惡意WebExtension,該擴展只需要identity許可權即可,之後,我們就可以組合這兩個漏洞,從而達到在about:cache頁面內執行JS的目的。
這個漏洞允許攻擊者在devtools中打開任意的需要URL(包括具有特權的URL),這要求具有devtools許可權。不過,由於該漏洞的利用過程要求用戶手動打開Devtools,所以它沒有前面的漏洞那樣嚴重。
PoC:
browser.devtools.panels.create(
"My Panel",
"icons/star.png",
"about:about"//
).then((newPanel) => {
console.dir(newPanel)
newPanel.onShown.addListener(handleShown);
newPanel.onHidden.addListener(handleHidden);
});
CVE-2018-5134——Web擴展可以通過view-source:打開任意URL(Firefox)
對於這個漏洞,上面的標題已經說的很明白了。正如我們以前所了解的那樣,通常不允許擴展具有打開about:URL的許可權,但實際上只要在URL開頭部分加上view-source:,就能輕鬆繞過這些限制。這個漏洞對許可權沒有特殊的要求,默認情況下攻擊者可以打開新的選項卡。
PoC:
CVE-2018-5135——activeTab許可權能夠在本不應該允許執行腳本的頁面上執行腳本(Firefox)
activeTab許可權使WebExtension能夠訪問用戶跟擴展進行交互的活動標籤IFF。用戶可以通過三種方式與擴展進行交互:
1.單擊Firefox右上角顯示的擴展按鈕。
2.單擊自定義上下文菜單(右鍵單擊時顯示的內容)按鈕。
3.激活擴展分配給自己的鍵盤快捷鍵。
就本例來說,我只是注意到,該功能並未禁止該擴展從about:cache頁面內執行JS,而該頁面是一個半特權頁面,正常情況下是不允許擴展訪問的。
對於這個漏洞,只要檢查是否可以截取半特權頁面即可找到它。
未完待續
這篇文章中介紹的安全漏洞仍然只是冰山一角:實際上,我們已經在WebExtensions中發現了20多個漏洞,而這裡僅僅列舉了4個而已。通過將這些漏洞組合起來,就能夠通過WebExtensions實現RCE攻擊。一旦其他漏洞得到了修復,我會第一時間將其公布出來。如果讀者有任何疑問,可以通過Twitter平台與我進行探討,我的賬戶為@qab。
※iOS安全基礎之鑰匙串與哈希
※如何利用LockCrypt勒索軟體自身弱點恢復加密數據
TAG:嘶吼RoarTalk |