前言
最近進展,8月24日個信SDK官網針對此事回復如下:
http://www.igexin.com/news_details.html?uuid=20
個信SDK能夠以下載惡意插件的方式通過非惡意app監控受害者。谷歌應用商店中超過500款app都使用瞭個信廣告SDK。雖然並非所有的app都下載瞭這種惡意監控功能,但個信SDK可能已為這些app引入該功能。包含受影響SDK的app下載量已超過1億次。
個信SDK本質非惡意但其服務器有問題
越來越多的創新性惡意作者嘗試通過向受信任應用商店提交無害app的方式逃避檢測,隨後從遠程服務器下載惡意代碼。而個信並非如此,因為開發人員並未創造惡意功能,也未控制甚至並未意識到這個惡意payload之後可能會執行。這個具有入侵性的功能起源於由個信控制的服務器。
受影響app
包含這個廣告SDK的app包括:
針對青少年的多款遊戲app(下載量為5000萬至1億次)
天氣app(下載量為100萬至500萬次)
互聯網廣播(下載量為50萬至100萬次)
照片編輯器(下載量為100萬至500萬次)
教育、健康和健身、旅行、表情、傢庭視頻攝像機類app
Lookout公司將個信的該功能告知谷歌後,後者從應用商店中刪除相關app或者將入侵功能刪除後換以更新版本。
背景
一般來講,移動app使用廣告SDK的目的是便於app開發人員利用廣告網絡向用戶推送廣告。跟其它廣告網絡一樣,個信服務也會利用所收集到的用戶興趣、職業、收入和位置信息推廣目標廣告服務。
研究人員在例行審查跟某些IP和此前推送惡意軟件的服務器通信的app時,發現瞭可疑流量。個信SDK本身的流量並未出現異常,因為出於很多原因的考慮,很多惡意軟件會為合法服務生成流量。
研究人員發現一款app在向http://sdk[.]open[.]phone[.]igexin.com/api.php 的一個REST API發送一系列初始請求後下載瞭大量的加密文件。而上述API正是個信廣告SDK使用的一個端點。
這種流量通常是惡意軟件首先安裝“清潔的”app隨後下載並執行代碼的結果,目的是躲避檢測。加密文件的下載以及將com.igexin namespace調用安卓的dalvik.system.DexClassLoader(用於從.jar或.apk文件加載類)這兩點就足以說明需要深入分析payload中可能隱藏著惡意軟件。
個人數據的收集取決於app的權限、移動安全解決方案和隱私策略,它們用來評估app所收集的個人數據是否合理。而app開發人員最終負責在app隱私策略中披露所有收集到的個人信息。開發人員也負責審查內嵌的第三方代碼並將所有內嵌第三方代碼中的數據收集能力披露在隱私策略中。
很多app開發人員可能並未意識到,因為個信廣告SDK的嵌入,可能會從客戶設備中提取到個人信息。而發現這一點需要對app和廣告SDK進行深入分析。該功能不僅難以被發現,而且隨時可從遠程服務器中更改。
SDK功能
並非所有的個信廣告SDK版本都傳播惡意功能。惡意版本實現一個插件礦建,能讓客戶端加載任意代碼,如向位於http://sdk[.]open[.]phone[.]igexin[.]com/api.php這個REST API端點發送請求得到的響應一樣。
向這個端點發送的請求和收到的響應都是編碼的JSON數據。如下是從這個API收到的解碼響應,它讓客戶端在兩個加密JAR文件中下載並運行代碼:
這些響應信息中的相關字段如下:
從服務器接收瞭這種響應類型時,SDK會利用API調用提供的密鑰解密一個或多個文件,並將其保存在設備上。隨後它會利用安卓的dalvick.system.DexClassLoader和映像從JAR文件加載這個具體類:
所有的插件都包含實現com.igexin.push.extension.stub.IPushExtension界面的一個類。這個界面定義瞭被調用來初始化插件的一個boolean init(Context)方法。
要註意的是,所有的API流量都被編碼(並非加密)並以明文文本形式發送或接收。
所下載類中包含的插件功能在運行時完全被外部控制,而且可隨時更改並給予遠程系統操作者所選擇的因素變化。提出遠程API請求後,用戶和app開發人員無法控制設備上會執行什麼代碼。
對於可運行內容的唯一限制是由安卓權限系統規定的。也就是說從插件中觀察到的最嚴重的行為是呼叫日志提取。
研究人員發現,如滿足下列條件,則所下載的大量插件都會通過init方法註冊一個PhoneStateListener:
1.啟用瞭內部SQLite數據庫中的設置。
2.這款app擁有 “android.permission.READ_PHONE_STATE” 權限。
這個PhoneStateListener會保存:
呼叫時間
呼叫號碼
呼叫狀態(空閑、響鈴、占線)
通過一個HTTP請求中把數據發送給http://sdk[.]open[.]phone[.]igexin[.]com/api.php 端點。信息解碼後格式如下:
如果以Base64解碼BIData,就能看到通過PhoneStateListener收集到的數據格式是管道分隔記錄:
第四個字段是呼叫時間,第六個字段是呼叫狀態,第五個字段包含所呼叫的經Base64編碼和RC4加密的電話號碼。第二個字段包含用於XOR加密的部分密鑰(另一部分較難,在應用程序中編碼)。
有瞭這個密鑰,我們就能把s6GYbkAUkOQPwK4P字符串解密成一個有效的電話號碼。