百度“美杜莎偷拍插件”技術(shù)分析
美杜莎是百度對(duì)其"偷拍插件"自己定義的名稱。它的原理是,百度插件上傳用戶屏幕截圖等信息,由服務(wù)端判斷用戶正在使用哪款瀏覽器,從而挾持百度鳳巢客戶資源針對(duì)360瀏覽器進(jìn)行不兼容提示。
百度"偷拍插件"系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)
"美杜莎"分為網(wǎng)頁(yè)腳本、客戶端和服務(wù)端三個(gè)部分,三者交互完成密碼加密和瀏覽器檢測(cè)"二選一"目的。
當(dāng)用戶訪問(wèn)開(kāi)啟了"美杜莎"計(jì)劃的百度鳳巢(北京測(cè)試時(shí)需要外地代理),網(wǎng)站會(huì)先通過(guò)加載指定的JS腳本,彈出對(duì)話框要求用戶安裝插件。在用戶安裝完成后,用戶登錄界面上密碼框會(huì)變?yōu)檩斎肟丶妮斎肟?,如圖:
該插件會(huì)通過(guò)特殊方式獲得用戶輸入的密碼,加密后計(jì)算一個(gè)加密的密碼,在用戶選擇登錄時(shí):
首先會(huì)發(fā)送一個(gè)握手請(qǐng)求給服務(wù)端,包括插件的版本號(hào)等,請(qǐng)求獲取一個(gè)SID(Token),服務(wù)端若判斷插件有更新,則會(huì)返回需要更新,由網(wǎng)頁(yè)腳本彈出對(duì)話框提示:"控件已經(jīng)更新,請(qǐng)重新下載安裝!"
接著網(wǎng)頁(yè)JS腳本會(huì)調(diào)用控件的接口: sendEnvironmentInfo,收集當(dāng)前用戶的環(huán)境信息并發(fā)送給服務(wù)端,這是獨(dú)立于當(dāng)前網(wǎng)站的一個(gè)收集和判定系統(tǒng),由百度客戶端插件收集以下信息:
用戶的CPU信息
用戶的磁盤(pán)序列號(hào)
用戶的網(wǎng)絡(luò)IP地址、MAC地址和網(wǎng)關(guān)信息
用戶網(wǎng)絡(luò)DNS信息
用戶的當(dāng)前瀏覽器進(jìn)程名稱信息
用戶當(dāng)前啟動(dòng)的所有程序的進(jìn)程名稱信息
用戶當(dāng)前電腦屏幕的圖像截圖
除了屏幕截圖外,其它信息都使用AES加密算法進(jìn)行了加密。百度將全部這些信息打包編碼到數(shù)據(jù)包后,會(huì)通過(guò)加密的HTTP傳輸協(xié)議上傳到百度的服務(wù)器:https://isafe.baidu.com/cinfo,百度服務(wù)端解密后看到的數(shù)據(jù)如下:
偷拍插件采集數(shù)據(jù)上傳后,百度服務(wù)端程序會(huì)對(duì)上傳的數(shù)據(jù)做判定,然后給控件返回一個(gè)狀態(tài)碼,網(wǎng)頁(yè)腳本通過(guò)控件的getLastErrorCode接口獲取到這個(gè)狀態(tài)碼。當(dāng)服務(wù)端程序通過(guò)進(jìn)程信息或截圖判定用戶正在使用360瀏覽器,則返回-3這個(gè)狀態(tài)碼。
網(wǎng)頁(yè)腳本判斷如果返回的狀態(tài)碼是-3,那么就調(diào)用控件的getSendbackMessage接口,目的是獲得百度服務(wù)端返回的一段文字,并彈出對(duì)話框提示用戶更換其他瀏覽器。
在這個(gè)過(guò)程中,上傳信息判定是由百度云端決定的,彈框的文字也是由云端發(fā)送的,關(guān)鍵邏輯都由云控。
由于上傳信息非常豐富,因此百度云端判斷相當(dāng)靈活,不僅可以針對(duì)360瀏覽器不兼容,還可以針對(duì)系統(tǒng)中其他任何軟件做不兼容提示,提示文字也是完全云控、可隨時(shí)變化的,同時(shí)還可以隨時(shí)在服務(wù)端配置升級(jí),要求用戶更新插件,以便應(yīng)用新的信息采集和對(duì)抗策略。
百度"偷拍插件"技術(shù)原理
npBaiduSafeInput.dll控件的關(guān)鍵在于sendEnvironmentInfo這個(gè)函數(shù),它首先收集信息,收集的信息包括cinfo\bmp兩個(gè)字段。
cinfo字段包括了除了截屏之外的其它系統(tǒng)信息,是一個(gè)簡(jiǎn)單的key-value結(jié)構(gòu)數(shù)據(jù),使用AES加密算法進(jìn)行了加密,然后編碼為ASCII-HEX后,保存在數(shù)據(jù)包的cinfo字段中。
獲取cinfo.processlist字段系統(tǒng)進(jìn)程列表信息使用的API是ToolHelp32 系列API,通過(guò)對(duì)比當(dāng)前進(jìn)程Pid,在進(jìn)程列表中篩選出當(dāng)前瀏覽器進(jìn)程名并保存為cinfo.currentprocess字段。
截屏數(shù)據(jù)則通過(guò)GetDIBits截取屏幕指定區(qū)域的圖像并保存為BMP數(shù)據(jù),編碼為ASCII-HEX后,保存在bmp字段。
這些數(shù)據(jù)再加上之前獲取的sid數(shù)據(jù),和計(jì)算整個(gè)數(shù)據(jù)包的md5數(shù)據(jù),拼接成具有4個(gè)字段的數(shù)據(jù)包,通過(guò)WinHttp接口發(fā)送加密的HTTPS數(shù)據(jù)到http://isafe.baidu.com/cinfo這個(gè)百度服務(wù)器地址上。
綜上,百度用于判定用戶軟件使用情況的數(shù)據(jù)有:當(dāng)前進(jìn)程、進(jìn)程列表和屏幕截圖。以下為幾處代碼分析:
1、百度"偷拍插件"通過(guò)GetDIBits對(duì)用戶電腦屏幕截圖:
2、把截取的BMP數(shù)據(jù)編碼后發(fā)送到百度服務(wù)器:
3、抓取用戶的Cpu、磁盤(pán)序列號(hào)、ip地址、mac信息、網(wǎng)關(guān)信息、DNS信息和所有進(jìn)程列表上傳:
4、網(wǎng)頁(yè)腳本根據(jù)百度服務(wù)端返回的狀態(tài)碼彈出相應(yīng)提示,怎樣提示完全由服務(wù)端控制: