綜述
2018年02月02日,Grammarly官方更新了Grammarly for Chrome
14.826.1446版本,其中修復了一個嚴重漏洞,在此之前的版本中此擴充套件能夠向所有網站曝光使用者的令牌資訊,導致任意網站都可以訪問並修改使用者在Grammarly上的文件,詞典,訪問歷史,日誌資訊,使用者資訊等敏感資料。Grammarly官方當日立即修復此漏洞,與2月5日關閉此Bug。
影響版本:≤ 14.826.1446。
攻擊難度:低。
危害程度:高。
官方修復情況如下:目前官方已經發布最新版本14.826.1446
什麼是Grammarly?
Grammarly是一款擁有1000w+使用者的國外廠商開發的語法檢查應用,提供了瀏覽器擴充套件、網頁版、 Mac
版和 Windows 版。如果你使用 Windows,Grammarly 還提供了 Word 外掛,下載後可以在
Word 內部呼叫外掛直接檢查語法錯誤,我也是Grammarly的忠實使用者之一。
Grammarly可以實現實時語法檢查,你邊寫它就邊改,語法問題和修改意見會以標註的形式顯示在文件的右側,方便你去一一檢視,而且在每條批註下面都會配有詳細的解釋,告訴你哪裡錯了,為什麼要這樣修改。當你出現錯誤的內容可以存入使用者字典或者文件中。
關於Grammarly的厲害之處請戳:https://youtu.be/wOxVMRwLfjU
漏洞分析
從網路上下載老版本的擴充套件外掛,這裡我們使用最新版之前的一個版本14.825.1439(這裡有所有版本https://www.crx4chrome.com/history/2722/),然後解壓外掛包,主要程式碼都在\extension_14_825_1439_0\src\js\Grammarly.js檔案中,程式碼很多,但是主要核心漏洞程式碼如下圖所示:
這裡在返回的Message物件中,當返回的資料data.action=user
,並且data.Grammarly=true
時,呼叫sendUser()
函式,在sendUser()
函式中直接將user物件返回了,此user物件中包括了使用者的所有資訊,包括email,firstName,grauth等敏感資訊,所以導致任意網站都可以通過觸發message事件,通過postMessage操作獲取Grammarly使用者的敏感資訊。
因為Grammarly的很多介面登入認證只需要grauth這個token值就可以直接訪問,所以通過惡意獲取使用者grauth值之後就可以隨意操作使用者的資料資訊了。
漏洞驗證及利用
在官方的漏洞詳情中,漏洞作者給出了在瀏覽器console中執行幾行程式碼即可觸發漏洞,如下圖所示:
下面來解釋一下這四行程式碼的意思:
將當前DOM中的節點元素置為可編輯狀態(預設不可編輯);
返回文件中匹配指定的選擇器組的第一個元素,這裡返回[data-action=”editor”]
的節點元素並執行點選操作;
返回class=gr_-ifr
的iframe節點元素物件,再通過contentWindow得到iframe包含頁面的window物件,最後將此物件註冊到一個指定的監聽器上,當該物件觸發指定的事件message時,回撥並執行匿名函式;
通過postMessage觸發時間,併傳送使用者資料。
最後控制檯上將返回使用者資訊中的email和grauth資訊,如下圖效果:
通過獲取到grauth內容後,傳送附帶grauth
cookie內容(grauth未失效)的請求到Grammarly介面即可獲取對應使用者資料,如下圖訪問使用者的文件:
其他可利用介面如下:
雖然這裡可以證明漏洞,但是並沒有充分利用此漏洞將其危害體現出來。漏洞報告中提到任意網站都可以獲取使用者敏感資訊,那就是說我們建立一個惡意網站,只要安裝Grammarly
for Chrome外掛的使用者訪問到我們的網站就會被劫持,下面我們來實現此利用場景。
首先我們的站點頁面必須存在可編輯文字的功能,比如\<textarea\>,這樣才能自動調出Grammarly功能,所以我們構建如下頁面即可:
這裡已經成功指出我們的語法錯誤,這時點選右下角的圖示即可進行相關操作了。
然後我們在此頁面中加入構造好的js程式碼,在編輯區觸發此js程式碼即可:
最後將我們構造好的站點傳送給受害者,當受害者訪問此網站時,滑鼠移動到編輯區即可觸發漏洞,傳送使用者email和grauth內容到攻擊者伺服器,如下圖我們的伺服器上收到的使用者資訊:
備註:這裡只進行區域性測試,攻擊方法可行,未進行任何非法操作及資料收集。
漏洞修復
在2018年02月02日更新的14.826.1446最新版本中,已經修復此漏洞,在程式碼中直接將使用者的敏感資訊刪除掉,如下圖修復程式碼對比:
在Chrome中安裝最新版本後,通過console除錯也可以看出返回的data.user資訊中已經沒有email和grauth等敏感資訊了,如下圖所示:
使用Grammarly for Chrome的使用者請及時更新避免被惡意攻擊者劫持導致資訊洩露被濫用。
參考連結
https://bugs.chromium.org/p/project-zero/issues/detail?id=1527