iOS安全攻防之越獄設備檢測


    iOS 越獄(iOS Jailbreaking),是用於獲取蘋果公司便攜裝置操作系統iOS最高權限的一種技術手段,用戶使用這種技術及軟件可以獲取到 iOS 的最高權限,甚至可能可以進一步解開運營商對手機網絡的限制。手機越獄后會面臨更多的安全風險,不建議對iOS設備進行越獄。在開發中可以針對越獄設備進行安全防范。

  可以嘗試用 NSFileManager 判斷設備是否安裝了越獄插件。

#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])

const char* jailbreak_tool_pathes[] = {
    "/Applications/Cydia.app",
    "/Library/MobileSubstrate/MobileSubstrate.dylib",
    "/bin/bash",
    "/usr/sbin/sshd",
    "/etc/apt"
};
#pragma mark - 判斷設備是否被越獄
+ (BOOL)isJailBreak
{
    for (int i=0; i<ARRAY_SIZE(jailbreak_tool_pathes); i++) {
        if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreak_tool_pathes[i]]]) {
            XSDLog(@"The device is jail broken!");
            return YES;
        }
    }
    XSDLog(@"The device is NOT jail broken!");
    return NO;
}

 

  可以通過嘗試讀取應用列表,看有無權限:  

if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){
        NSLog(@"Device is jailbroken");
        NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/User/Applications/"
                                                                               error:nil];
        NSLog(@"applist = %@",applist);
    }

  未越獄設備是無法讀取數據的,越獄設備是可以獲得一個列表。

 

  使用stat系列函數檢測Cydia等工具:

#import <sys/stat.h>

void checkCydia(void)
{
    struct stat stat_info;
    if (0 == stat("/Applications/Cydia.app", &stat_info)) {
        NSLog(@"Device is jailbroken");
    }
}

  

  可以看看stat是不是出自系統庫,有沒有被攻擊者換掉:

#import <dlfcn.h>  

void checkInject(void)
{
    int ret ;
    Dl_info dylib_info;
    int (*func_stat)(const char *, struct stat *) = stat;
    if ((ret = dladdr(func_stat, &dylib_info))) {
        NSLog(@"lib :%s", dylib_info.dli_fname);
    }
}
輸出結果為:

  如果結果不是 /usr/lib/system/libsystem_kernel.dylib 的話,那就100%被攻擊了。
如果 libsystem_kernel.dylib 都是被攻擊者替換掉的……

 

  動態庫檢測:

#import <mach-o/dyld.h>

void checkDylibs(void)
{
    uint32_t count = _dyld_image_count();
    for (uint32_t i = 0 ; i < count; ++i) {
        NSString *name = [[NSString alloc]initWithUTF8String:_dyld_get_image_name(i)];
        NSLog(@"動態庫檢測結果--%@", name);
    }
}

  通常情況下,會包含越獄機的輸出結果會包含字符串: Library/MobileSubstrate/MobileSubstrate.dylib 。

  結果:

  

 

  通過檢測程序當前運行的環境:

#include <stdlib.h>

void printEnv(void)
{
    char *env = getenv("DYLD_INSERT_LIBRARIES");
    NSLog(@"===%s", env);
}
結果:
2017-05-23 15:02:30.232140+0800 TestSecurityAdvance[16888:919836] ===(null)
  未越獄設備返回的是 null。

  參見:念茜的博客。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM