有米iOS惡意SDK分析

wyzsk發表於2020-08-19
作者: 360NirvanTeam · 2015/10/29 10:10

0x00 前言


有米廣告平臺為業界領先的移動資訊服務提供商優蜜科技™所有,總部和研發中心設在廣州,在北京設立分支機構。有米廣告擁有核心技術及完整智慧財產權,並獲多項國家專利,在使用者特徵識別、精準投放、客戶端防作弊、廣告智慧投放等關鍵領域遙遙領先。有米廣告瞄準7億手機使用者,致力於為數以萬計的企業廣告主提供精準的產品營銷和品牌推廣服務,為應用開發者創造公正和優質的廣告收益。

網址是 https://www.youmi.net/

前不久SourceDNA的研究人員發現iOS平臺使用有米SDK的一些APP收集使用者隱私資料,主要包括以下四類:

  1. 使用者安裝在手機上的應用列表資訊;
  2. 在使用者執行舊版iOS時,收集裝置的平臺序列號;
  3. 在執行新版iOS時,收集裝置的硬體元件及元件序列號;
  4. 使用者的Apple ID郵箱。

在跟進過程中發現,sourceDNA在自己的微博中更新了說明,對是否獲取apple id做了解釋

https://sourcedna.com/blog/20151018/ios-apps-using-private-apis.html

enter image description here

我們Nirvanteam也對此進行了詳細的技術分析。

詳細過程開始分析如下

0x01 社工獲取iOS的SDK


目前網上不太好找這個SDK,而且有米也在努力更新SDK。

最後透過社工得到 SDK。

0x02 SDK細節分析


拿到SDK後直接 strings不能搜尋到URL的, 劫持包發現了URL然後分析發現URL都做了編碼。 URL如下:

http://ios.wall.youmi.net  主要是這個URL在傳送資料
http://stat.gw.youmi.net
http://au.youmi.net/offer/ios/offers.manifest
http://t.youmi.net

透過分析SDK 發現SDK透過大量的私有API。

私有API是指放在PrivateFrameworks框架中的API,蘋果通常不允許App使用這類API,因為呼叫私有API而在稽核中遭到拒絕的現象並不少見。但蘋果的稽核機制並不透明,許多使用了私有API的App也被稽核透過,包括Google Voice這樣的應用,一樣呼叫了私有API,也獲得了透過上架。甚至是蘋果的預裝App iBooks也被揭露使用了大量私有 API,致使第三方應用無法實現亮度控制和呼叫字典等類似的功能。

逆向sdk分析:

透過分析URL 去挖掘傳送的資料,sub_2DE18 函式主要獲取各種資訊,如下如:

1) 其中獲取序列號資訊程式碼:

IOServiceMatching("IOPlatformExpertDevice")
io_service_t  IOPlatformExpertDevicev_ios_service= IOServiceGetMatchingService)(
                addr_kIOMasterPortDefault,
               "IOPlatformExpertDevicev");
CFStringRef  strref = CFStringCreateWithCString(kCFAllocatorDefault, IOPlatformSerialNumber_v64, 0x600);//Creates an immutable string from a C string.    

CFTypeRef SerialNumberAsCFString = 
IORegistryEntryCreateCFProperty(platformExpert, CFSTR("IOPlatformSerialNumber"), kCFAllocatorDefault, 0) ; 
          if ( SerialNumberAsCFString )
          {
            CFTypeID typeid = CFGetTypeID(SerialNumberAsCFString);
            if ( typeid == CFStringGetTypeID() )
            {
              [NSString stringWithString:SerialNumberAsCFString];  //獲得統序列號 5K152FX7A4S
            }
          }

2) 獲得各種裝置資訊主要透過下面函式獲取。

getinfo_from_devicename_and_togetdict_infosub_1EC88((DeviceName, dict_v8); 

傳入需要獲取的裝置名稱和字典資訊來獲取資訊,裝置名用於獲取資訊,字典是需要獲取的資訊。 函式程式碼如下:

 io_iterator_t iterator,iterator2;
            IORegistryEntryGetChildIterator(result2,"IOService", &iterator);
             io_iterator_t t = IOIteratorNext(iterator);
            char name[20];
            IORegistryEntryGetNameInPlane(result2,"IOService", name);
                if([DeviceName isEqualToString: name])
                {
               CFTypeRef data;
            IORegistryEntryCreateCFProperties_v25)(result2,
                            &data,
                            kCFAllocatorDefault,
                            0);

            if(CFGetTypeID(data) ==  CFDictionaryGetTypeID())
            {
            …………

例如獲取裝置名稱如下:

  • 電池 battery-id
  • 攝像機 AppleH4CamIn
  • iOS加速度感測器 accelerometer
  • WIFI 資訊 wlan
  • 藍芽資訊 bluetooth
  • Device Characteristics TLC還是MLC記憶體 ASPStorage disk
  • 充電次數 AppleARMPMUCharger

獲取裝置資訊後將資訊儲存到APP/Library/.XABCD/nidayue.dict這個檔案中,當需要哪些資訊就從這裡讀取。

寫這個檔案是透過設定訊息函式來實現的。

void __cdecl -[ChargerClinkeredConcertedly catalogueChoraleAlamo](struct ChargerClinkeredConcertedly *self, SEL a2)
{
  struct ChargerClinkeredConcertedly *v2; // [email protected]
  void *v3; // [email protected]
  void *v4; // [email protected]    

  v2 = self;
  v3 = objc_msgSend(&OBJC_CLASS___NSNotificationCenter, "defaultCenter");
  objc_msgSend(
    v3,
    "addObserver:selector:name:object:",
    v2,
    "approvementAviateBefitted:",
    UIApplicationWillTerminateNotification,
    0);
  v4 = objc_msgSend(&OBJC_CLASS___NSNotificationCenter, "defaultCenter");
  objc_msgSend(
    v4,
    "addObserver:selector:name:object:",
    v2,
    "consummatingCreators:",
    UIApplicationWillResignActiveNotification,
    0);
}

當安裝好APP 後,將要關閉APP或者按home鍵到後臺才會去寫檔案資訊。

3) 獲取UUID資訊

4) 廣告標示符(IDFA-identifierForIdentifier)

ASIdentifierManager  sharedManager

ASIdentifierManager單例提供了一個方法advertisingIdentifier,透過呼叫該方法會返回一個上面提到的NSUUID例項。

NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

5) 螢幕大小 960*640 獲取方式

[[UIScreen mainScreen] bounds]
[[UIScreen mainScreen] scale]
CGRectGetHeight
CGRectGetWidth

6) 手機裝置型號獲取,如下圖:

如上函式假設引數*servicename_a1傳遞值為hw.machine時,返回裝置硬體資訊為iPhone3,1

0x03 危害分析


透過分析發現SDK 獲得瞭如下資訊(測試用的iPhone4 iOS7.12):

  1. 裝置的WIFI資訊,

    BSSID = "d0:fa:1d:20:a:f8"; 這個無線AP的MAC地址
    SSID = "360WiFi-200AF8";  一個無線AP的名稱。
    SSIDDATA = <33363057 6946692d 32303041 4638>;
    
  2. 序列號資訊IOPlatformSerialNumber 5K152FX7A4S

  3. 電池資訊 battery-id

  4. 攝像機資訊

  5. iOS加速度感測器 low-temp-accel-offset

  6. 藍芽資訊 wifi-module-sn

  7. Device Characteristics TLC還是MLC記憶體

  8. UUID 資訊 a2ab842508133b62b680b5f9efa1cd51
  9. 充電次數 CycleCount
  10. 廣告標示符(IDFA-identifierForIdentifier112fb7fe79fb4b7abf7a8e2ecaf57147
  11. __UDID資訊 7a32771c3adf2ad0564c3cb2d6920bc6ef9818b7
  12. 螢幕大小 960*640
  13. 手機裝置型號 iPhone3,1
  14. 透過檢查程式名, 安裝的APP BundleID表 , 程式模組中有沒有 iGrimace,org.ioshack.iGrimace等來檢查越獄狀態,越獄或者未越獄。
  15. 裝置名稱資訊如 D. vice:iPhone3,1 Jailbreak:1 OS:iPhone OS Version:7.1.2 Name:“panda”的 iPhone Model:iPhone

獲得這些資訊後透過 deflate 壓縮,再透過一次混合加密傳送出去。加密過程如下圖:

經過加密後將資料整合到URL上,發後透過POST方式傳送出去。

傳送加密如下

NSURLConnection_start { 
cookie = "";
data = "";
host = "ios.wall.youmi.net";
method = GET;
mime = "";
url = "http://ios.wall.youmi.net/v3/reqf?s=1,5,8aa2a777452acf72,lyOU,1,bfDG9lgEuEfsVbWHLjyNZ-ESDTPXoRHqPZvukpsNiA9esOWBJTHnmelJwR4Mzd-tYlsbO1ROsjJAYN35ngXjNvMqdtMKUu2czR4hRqws3pU2UGYPMY6Z2Z-XGzxqhb9o1gJmB2cNMfczHb4Lu8ji7e5gOu-VQjLZiXCHEnMdls-OOyb5e2wtU-wsQtK.Q0v6S692Tr-Qp8k-YcYMJ47vqcsnCJJdzehyw4W-uee7pHmmJJU1.jxMeHEKT4BpL8flP338p3HPN5Zx5DoAzEmNRdlvPui7LZiHyOxL0r8adyZyJDkfAn8qE6PDBWmK1MUQ1jWa6ghwR4bPVQmrCMZcq6a1RUZzTJVKMQOokMswhs.JdRBIZMyyUrBuRf1IcHECc.Rj1jL1IdiwTdZaDLAzcLiKDMK3Pn222K160LVqG6XhnAzmw6gs.9.0yc.kZmbsUKZ7MZ5dCliJY8Izkk9A2SGpLI4zQ5MML5XPnobSVHlVQQ4tN4khqvAXVAJwLK91YdxrhFae1fNoi5BaCpj7fSnzRjF1j46Lygnv4DgT890oljclyzBgxbxBFrwuqV8tc1VpGqMvnX6sDlGVonzGOQnd9Yjwm3d3CE3PYwCSC1jafsTlw8AhwsyZ6E5gKqio4B-JlLavdFZF4xPfP4YeQngzZRAijN3QUXYT7ZVB5f5C9NdrDdrnmZTLx5B7jChaUbdI5sTs4zNXgaGUzFYOxmgxlxdxZGN6TSUMUS7k9SEygV0tAI-uARcuF1MSE.o76aoRR1JmtSPDSI7yPL1ooo2-CeLEOhQCzcgNrrkdx.ZL6LRyWkyOXcGISiaWKWFh0BAtzv2mFhBvArj7d1MsKMY57suR58v8rugnnEeFBtfNDKK7lQrZAKKfm7iGv-xmJ4f3DFtqo4OYOE0.Q8uSQblgnK24F3-x&p=1&n=100&nshw=1";
}

加密資訊解密如下:

{
    3gst = "";
    acc = "0.000000,0.000000,0.000000";
    accos = 1000010000000000c4bc1300612003004e260900;
    aicid = 47a903bcec614984acd1d0f88039d34a;
    apn = None;
    av = "1.0";
    batsn = ae15041460753d1420;
    bcsn = "";
    bsi = "";
    bssid = ec26cad6e5a;
    btsn = "";
    cc = CN;
    chn = 0;
    chrcy = "";
    cid = "eIyoH-ZvBqO_f";
    cn = 2;
    dd = "Device:iPhone3,1  Jailbreak:1  OS:iPhone OS  Version:7.1.2  Name:\U201cpanda\U201d\U7684 iPhone  Model:iPhone";
    ddn = "\U201cpanda\U201d\U7684 iPhone";
    ext =     {
        attr = 195;
        it = 1;
        nshw = 1;
        reqt = 0;
        rtype = 1;
        sat = 3;
        wat = 3;
    };
    fcsn = "";
    gyo = "0.000000,0.000000,0.000000";
    hv = 2;
    ifa = 112fb7fe79fb4b7abf7a8e2ecaf57147;
    ifat = 1;
    ifst = 3155986;
    ise = 0;
    jb = 1;
    kernid = a2ab842508133b62b680b5f9efa1cd51;
    lat = "0.00";
    lc = "zh-Hans";
    lon = "0.00";
    mac = "";
    mcc = "";
    mmcid = "";
    mnc = "";
    mod = iPhone;
    odfa = "";
    oifa = 112fb7fe79fb4b7abf7a8e2ecaf57147;
    osv = "7.1.2";
    pd = 3;
    pn = "feng.YouMiWallSample";
    po = "iPhone OS";
    rb = "-1.000000";
    rt = 1445444547;
    sh = 960;
    smv = 1;
    sn = 5K152FX7A4S;
    spc = "";
    ssid = "TP-LINK_2510";
    sv = "5.3.0";
    sw = 640;
    tid = 005ecs1rcn0k1dltd0o8dngsruf;
    ts = 0;
    udid = 7a32771c3adf2ad0564c3cb2d6920bc6ef9818b7;
    usb = 2;
    user = "this is user";
    vpn = 0;
    wifisn = "";
}

0x04 結果及總結


透過對大量樣本掃描發現,共計掃描出了1035個蘋果APP受到感染。 具體對應版本資訊見另一份文件

1)有米SDK主要用於統計裝置型別的使用情況,這樣來對市場形勢作出判斷來獲取利益。

2)私有API如果透過靜態掃描的話意思不大,一般能透過蘋果稽核的,私有API都是經過處理的,所以檢查私有API要透過動態HOOK的方式去檢查。

3)一般有使用私有API的一般都是啟動的階段,所以動態掃描APP執行階段做成自動化也是可行的。

附件:有米iOS惡意SDK感染列表

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章