ios 越獄與安全性分析

通過看一些文檔發(fā)現越獄有風險,但是風險還是在可控范圍內的,所以touchid用于交易還是可行的。

一越獄存在的問題

理論上iPhone越獄沒有安全性可言,所有安裝在你手機的APP都以root權限運行,它們可以

?任意讀寫文件系統(tǒng)數據

?HTTP(S)實時被監(jiān)測

?重新打包ipa

?暴露的函數符號

?未加密的靜態(tài)字符

?篡改程序邏輯控制流

?攔截系統(tǒng)框架API

?逆向加密邏輯

?跟蹤函數調用過程(objc_msgSend)

?可見視圖的具體實現

?偽造設備標識

?可用的URL schemes

runtime任意方法調用

以上安全風險都基于一個前提:安裝了一個惡意APP或插件。所以只要自己注意不要下載到這些東西就不會有問題。越獄后不知名的APP就不要下了,特別是那些只有盜版市場有的APP。不知名的盜版市場最好也不好用,cydia的源不要隨意添加,下載插件要謹慎。

另外實際上AppStore上的APP在越獄環(huán)境下也不是絕對安全的,因為蘋果也檢測不到這些APP有沒有做以上那些不軌之事。對于在盜版市場下載知名APP,似乎跟在AppStore上下載沒區(qū)別,目前沒見到有安裝包被注入程序,不像Android市場。像支付寶這樣敏感的APP數據是有加密的,就算獲取了也沒那么容易破解。所以也不用太擔心在越獄機器上用它們不安全。雖然越獄后的iPhone有這么高風險,但比Android安全得多,因為市場環(huán)境好,沒多少惡意APP出現,所以情況還是樂觀的,了解清楚情況,只要稍微注意點就沒問題,至今沒聽說有人因越獄了iPhone損失了什么

二越獄防護

一般而言完美越獄的設備,是非常危險的,通過腳本動態(tài)庫注入,可以修改app的方法實現。所以盡量少越獄,即使越獄也不要隨意安裝插件。

1越獄檢測,很多現在常用檢測是判斷

/Applications/Cydia.app

/Library/MobileSubstrate/MobileSubstrate.dylib

這兩個是否存在,但是黑客現可能會改變這些工具的安裝路徑,躲過你的判斷。

但比較好的辦法是通過檢測當前程序運行的環(huán)境變量:

?voidprintEnv(void)

?{

?char*env?=?getenv("DYLD_INSERT_LIBRARIES");

?NSLog(@"%s",?env);

?}

未越獄設備返回結果是null,越獄設備就各有各的精彩了,尤其是老一點的iOS版本越獄環(huán)境。

2敏感交易的時候我們可以做一次校驗判斷是否正版app,通過二進制文件的驗證,來確定app的安全性。

網上的方法是讀取沙盒的程序二進制經過md5加密后做一些處理傳給服務器驗證,這個我也沒想好。

3 GDB是大多數hackers的首選,阻止GDB依附是應用的常規(guī)辦法

?#import?

?

?intmain(intargc,charchar*argv[])

?{

?#ifndef?DEBUG

?ptrace(PT_DENY_ATTACH,0,0,0);

?#endif

?@autoreleasepool{

?returnUIApplicationMain(argc,?argv,nil,?NSStringFromClass([WQMainPageAppDelegateclass]));

?}

?}

但遺憾的是,iPhone真實的運行環(huán)境是沒有sys/ptrace.h拋出的。雖然ptrace方法沒有被拋出,但是不用擔心,我們可以通過dlopen拿到它。

dlopen:當path參數為0是,他會自動查找$LD_LIBRARY_PATH,$DYLD_LIBRARY_PATH, $DYLD_FALLBACK_LIBRARY_PATH和當前工作目錄中的動態(tài)鏈接庫.

1#import?

2#import?

3

4typedefint(*ptrace_ptr_t)(int_request,?pid_t?_pid,?caddr_t?_addr,int_data);

5#if?!defined(PT_DENY_ATTACH)

6#define?PT_DENY_ATTACH?31

7#endif??//?!defined(PT_DENY_ATTACH)

8

9voiddisable_gdb()?{

10void*?handle?=?dlopen(0,?RTLD_GLOBAL?|?RTLD_NOW);

11ptrace_ptr_t?ptrace_ptr?=?dlsym(handle,"ptrace");

12ptrace_ptr(PT_DENY_ATTACH,?0,?0,?0);

13dlclose(handle);

14}

15

16intmain(intargc,charchar*argv[])

17{

18#ifndef?DEBUG

19disable_gdb();

20#endif

21@autoreleasepool{

22returnUIApplicationMain(argc,?argv,nil,?NSStringFromClass([WQMainPageAppDelegateclass]));

23}

}

4敏感的邏輯代碼重寫為C的代碼

把函數名隱藏在結構體里,以函數指針成員的形式存儲。

這樣做的好處是,編譯后,只留了下地址,去掉了名字和參數表,提高了逆向成本和攻擊門檻。

也許,程序中存在一個類似這樣的類:

?@interfaceXXUtil?:?NSObject

?

?+?(BOOL)isVerified;

?+?(BOOL)isNeedSomething;

?+?(void)resetPassword:(NSString*)password;

?

@end

改寫的程序如下:

?//XXUtil.h

?#import?

?

?typedefstruct_util?{

?BOOL(*isVerified)(void);

?BOOL(*isNeedSomething)(void);

?void(*resetPassword)(NSString*password);

?}XXUtil_t?;

?

?#define?XXUtil?([_XXUtil?sharedUtil])

?

?@interface_XXUtil?:?NSObject

?

?+?(XXUtil_t*)sharedUtil;

?@end

24//XXUtil.m

25#import?"XXUtil.h"

26

27staticBOOL_isVerified(void)

28{

29//bala?bala?...

30returnYES;

31}

32

33staticBOOL_isNeedSomething(void)

34{

35//bala?bala?...

36returnYES;

37}

38

39staticvoid_resetPassword(NSString*password)

40{

41//bala?bala?...

42}

43

44staticXXUtil_t*?util?=NULL;

45@implementation_XXUtil

46

47+(XXUtil_t*)sharedUtil

48{

49staticdispatch_once_t?onceToken;

50dispatch_once(&onceToken,?^{

51util?=?malloc(sizeof(XXUtil_t));

52util->isVerified?=?_isVerified;

53util->isNeedSomething?=?_isNeedSomething;

54util->resetPassword?=?_resetPassword;

55});

56returnutil;

57}

58

59+?(void)destroy

60{

61util???free(util):?0;

62util?=NULL;

63}

@end

最后,根據Xcode的報錯指引,把以前這樣的調用

[XXUtilisVerified];

對應改成:

XXUtil->isVerified();

5數據保護API

文件系統(tǒng)中的文件、keychain中的項,都是加密存儲的。當用戶解鎖設備后,系統(tǒng)通過UDID密鑰和用戶設定的密碼生成一個用于解密的密碼密鑰,存放在內存中,直到設備再次被鎖,開發(fā)者可以通過Data

Protection API來設定文件系統(tǒng)中的文件、keychain中的項應該何時被解密。

1)文件保護

?/*為filePath文件設置保護等級*/

?NSDictionary*attributes?=?[NSDictionarydictionaryWithObject:NSFileProtectionComplete

?forKey:NSFileProtectionKey];

?[[NSFileManagerdefaultManager]setAttributes:attributes

?ofItemAtPath:filePath

?error:nil];

//文件保護等級屬性列表

NSFileProtectionNone//文件未受保護,隨時可以訪問(Default)

NSFileProtectionComplete//文件受到保護,而且只有在設備未被鎖定時才可訪問

NSFileProtectionCompleteUntilFirstUserAuthentication//文件收到保護,直到設備啟動且用戶第一次輸入密碼

NSFileProtectionCompleteUnlessOpen//文件受到保護,而且只有在設備未被鎖定時才可打開,不過即便在設備被鎖定時,已經打開的文件還是可以繼續(xù)使用和寫入

2keychain項保護

1/*設置keychain項保護等級*/

2NSDictionary*query?=?@{(__bridgeid)kSecClass:?(__bridgeid)kSecClassGenericPassword,

3(__bridgeid)kSecAttrGeneric:@"MyItem",

4(__bridgeid)kSecAttrAccount:@"username",

5(__bridgeid)kSecValueData:@"password",

6(__bridgeid)kSecAttrService:[NSBundlemainBundle].bundleIdentifier,

7(__bridgeid)kSecAttrLabel:@"",

8(__bridgeid)kSecAttrDescription:@"",

9(__bridgeid)kSecAttrAccessible:(__bridgeid)kSecAttrAccessibleWhenUnlocked};

10

11OSStatus?result?=?SecItemAdd((__bridge?CFDictionaryRef)(query),NULL);

1//keychain項保護等級列表

2kSecAttrAccessibleWhenUnlocked//keychain項受到保護,只有在設備未被鎖定時才可以訪問

3kSecAttrAccessibleAfterFirstUnlock//keychain項受到保護,直到設備啟動并且用戶第一次輸入密碼

4kSecAttrAccessibleAlways//keychain未受保護,任何時候都可以訪問(Default)

5kSecAttrAccessibleWhenUnlockedThisDeviceOnly//keychain項受到保護,只有在設備未被鎖定時才可以訪問,而且不可以轉移到其他設備

6kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly//keychain項受到保護,直到設備啟動并且用戶第一次輸入密碼,而且不可以轉移到其他設備

7kSecAttrAccessibleAlwaysThisDeviceOnly//keychain未受保護,任何時候都可以訪問,但是不能轉移到其他設備

for example

把一段信息infoStrng字符串寫進文件,然后通過Data

Protection API設置保護。

1NSString*documentsPath?=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,YES)firstObject];

2NSString*filePath?=?[documentsPathstringByAppendingPathComponent:@"DataProtect"];

3[infoStringwriteToFile:filePath

4atomically:YES

5encoding:NSUTF8StringEncoding

6error:nil];

7NSDictionary*attributes?=?[NSDictionarydictionaryWithObject:NSFileProtectionComplete

8forKey:NSFileProtectionKey];

9[[NSFileManagerdefaultManager]setAttributes:attributes

10ofItemAtPath:filePath

11error:nil];

設備鎖屏(帶密碼保護)后,即使是越獄機,在root權限下cat讀取那個文件信息也會被拒絕。

參考鏈接:

http://blog.csdn.net/yiyaaixuexi/article/category/1302847/1

這個妹子是阿里安全部的,很厲害啊。。。。

微博:程序媛念茜

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容