【iOS】越獄檢測

Yaso_GG發表於2017-07-25

前段時間公司讓做了個對越獄裝置的檢測和攔截,下面是綜合自己的開發和網上一些帖子的總結,總體來說做起來還是比較簡單的,但是有一個大坑一定要注意!!

一、什麼是越獄

越獄:是指標對iPhone作業系統(即iOS系統)限制使用者儲存讀寫許可權的破解操作。經過越獄的iPhone擁有對系統底層的讀寫許可權,能夠讓iPhone手機免費使用破解後的App Store軟體的程式(相當於盜版)

更詳細點說,越獄是指利用iOS系統的某些漏洞,通過指令取得到iOS的root許可權,然後改變一些程式使得裝置的功能得到加強,突破封閉式環境。

二、越獄優缺點

  1. 越獄的好處
    1.系統許可權很高,可以自己優化系統,可以修改系統檔案,可以安裝更多擁有高系統許可權的軟體,實現更多高階功能!例如:與其他裝置藍芽傳送檔案、簡訊回執、來電歸屬地、檔案管理、瀏覽器下載外掛、flash外掛、內容管理等等。
    2.可以安裝破解後的軟體。
    3.可以更換主題、圖示、簡訊鈴聲等等,打造個性的手機。
    4.可以藉助第三方檔案管理軟體靈活的管理系統或者其他檔案,比如把iPhone當行動硬碟(u盤)

  2. 越獄的害處
    對使用者
    1.費電,越獄後系統會常住一些程式保持越獄的狀態。視系統級軟體(deb格式)安裝的數量,越獄後耗電速度約提升10% ~20%。
    2.可能會造成系統不穩定,擁有很高系統許可權的同時,也伴隨著系統崩潰的危險,這個道理大家能理解吧?你可以修改它,但是你不能保證永遠正確的修改它。所以系統級的軟體寧缺毋濫,不瞭解用途的情況下不要亂安裝。
    3.在新的手機韌體版本出來的時候,不能及時的進行更新。每個新版本的韌體,都會修復上一個版本的越獄漏洞,使越獄失效。因此如果需要保持越獄後的功能,要等到新的越獄程式釋出,才能升級相應的手機韌體版本。
    4.越獄過程中滋生小BUG,但是不是很影響使用.

    對公司,隨著iOS系統的逐步完善,越獄機對應用層的攻擊也越來越難,譬如:iOS7相比之前系統版本,升級了沙盒機制,封鎖了幾乎全部應用沙盒可以共享資料的入口。即使在越獄情況下,限制也非常多,大大增加了應用層攻擊難度。但是:
    使用者越獄後,還是可以通過下載一些外掛,
    譬如:xCon(n00neimp0rtant and Lunatik聯合開發)、NZT、tsPretector等,
    來篡改裝置資訊,從而來刷一些商家或公司活動福利,或者利用一些漏洞故弄一些異常來投訴。

三、越獄的檢測

對於越獄的判斷,想要做到完全檢測是非常難的,因為一是蘋果在一直修補已知漏洞,所以越獄攻擊程式也一直在更改,二是使用者可能安裝了越獄檢測繞過軟體(xCon)。
所以我們只要做到在多重越獄檢測的基礎上,儘可能的提高越獄裝置的判定率就行了,常見的檢測方法如下:

 
1. 使用NSFileManager,判斷裝置上是否安裝了常用越獄工具。(容易被hook掉)
2. 使用stat系列函式檢測常用越獄工具。(也可能被hook掉)
3. 那就需要檢測下stat是否出自系統庫。
4. 檢測連結動態庫(不建議,appStore稽核可能不過)
5. 最後還可以通過檢測程式執行的環境變數。

四、檢測方法

  1. 使用NSFileManager,判斷裝置上是否安裝了常用越獄工具。 
//判斷工具安裝路徑  本期先做成BOOL開關方法
 - (BOOL)checkPath
{
    BOOL jailBroken = NO;
    NSString * cydiaPath = @"/Applications/Cydia.app";
    NSString * aptPath = @"/private/var/lib/apt";
    if ([[NSFileManager defaultManager] fileExistsAtPath:cydiaPath]) {
        jailBroken = YES;
    }
    if ([[NSFileManager defaultManager] fileExistsAtPath:aptPath]) {
        jailBroken = YES;
    }
    return jailBroken;
}
·
上述路徑也可替換為以下常見越獄工具路徑:
 /Library/MobileSubstrate/MobileSubstrate.dylib 
/Applications/Cydia.app   /var/lib/cydia/
/var/cache/apt   /var/lib/apt    /etc/apt 
/bin/bash /bin/sh 
/usr/sbin/sshd   /usr/libexec/ssh-keysign   /etc/ssh/sshd_config 
  1. 使用stat系列函式檢測常用越獄工具
//防hook NSFileManager的方法  使用stat系列函式檢測Cydia等工具,路徑同上
 - (BOOL)checkCydia
{
    struct stat stat_info;
    if (0 == stat("/Applications/Cydia.app", &stat_info)) {
        NSLog(@"Device is jailbroken");
        return YES;
    }
    return NO;
}
  1. 檢測stat是否出自系統庫 
 int ret;
Dl_info dylib_info;
 int (*func_stat)(const char *,struct stat *) = stat;
 if ((ret = dladdr(func_stat, &dylib_info))) {
       if (strcmp(dylib_info.dli_fname,"/usr/lib/system/libsystem_kernel.dylib") != 0) { 
           jailbroken = YES; 
       }
}
  1. 檢測連結動態庫,檢測是否被連結了異常動態庫,但動態庫相關Api屬於私有Api,呼叫的話appStore稽核會不通過,所以不列舉。

  2. 檢測程式執行的環境變數

//檢測當前程式執行的環境變數,防止通過DYLD_INSERT_LIBRARIES注入連結異常動態庫,來更改相關工具名稱
 - (BOOL)checkEnv
{
    char *env = getenv("DYLD_INSERT_LIBRARIES");
    NSLog(@"%s", env);
    if (env) {
        return YES;
    }
    return NO;
}

五、深坑請注意!!

千萬不要通過判斷是否可以開啟 cydia:// 為首的URL Schema 來判斷是否越獄,因為你會發現很多App居然註冊了這個URL Type !!

相關文章