ios 越狱与安全性分析

通过看一些文档发现越狱有风险,但是风险还是在可控范围内的,所以touchid用于交易还是可行的。

一越狱存在的问题

理论上iPhone越狱没有安全性可言,所有安装在你手机的APP都以root权限运行,它们可以

•任意读写文件系统数据

•HTTP(S)实时被监测

•重新打包ipa

•暴露的函数符号

•未加密的静态字符

•篡改程序逻辑控制流

•拦截系统框架API

•逆向加密逻辑

•跟踪函数调用过程(objc_msgSend)

•可见视图的具体实现

•伪造设备标识

•可用的URL schemes

runtime任意方法调用

以上安全风险都基于一个前提:安装了一个恶意APP或插件。所以只要自己注意不要下载到这些东西就不会有问题。越狱后不知名的APP就不要下了,特别是那些只有盗版市场有的APP。不知名的盗版市场最好也不好用,cydia的源不要随意添加,下载插件要谨慎。

另外实际上AppStore上的APP在越狱环境下也不是绝对安全的,因为苹果也检测不到这些APP有没有做以上那些不轨之事。对于在盗版市场下载知名APP,似乎跟在AppStore上下载没区别,目前没见到有安装包被注入程序,不像Android市场。像支付宝这样敏感的APP数据是有加密的,就算获取了也没那么容易破解。所以也不用太担心在越狱机器上用它们不安全。虽然越狱后的iPhone有这么高风险,但比Android安全得多,因为市场环境好,没多少恶意APP出现,所以情况还是乐观的,了解清楚情况,只要稍微注意点就没问题,至今没听说有人因越狱了iPhone损失了什么

二越狱防护

一般而言完美越狱的设备,是非常危险的,通过脚本动态库注入,可以修改app的方法实现。所以尽量少越狱,即使越狱也不要随意安装插件。

1越狱检测,很多现在常用检测是判断

/Applications/Cydia.app

/Library/MobileSubstrate/MobileSubstrate.dylib

这两个是否存在,但是黑客现可能会改变这些工具的安装路径,躲过你的判断。

但比较好的办法是通过检测当前程序运行的环境变量:

voidprintEnv(void)

•{

char*env = getenv("DYLD_INSERT_LIBRARIES");

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

•}

未越狱设备返回结果是null,越狱设备就各有各的精彩了,尤其是老一点的iOS版本越狱环境。

2敏感交易的时候我们可以做一次校验判断是否正版app,通过二进制文件的验证,来确定app的安全性。

网上的方法是读取沙盒的程序二进制经过md5加密后做一些处理传给服务器验证,这个我也没想好。

3 GDB是大多数hackers的首选,阻止GDB依附是应用的常规办法

•#import 

intmain(intargc,charchar*argv[])

•{

•#ifndef DEBUG

•ptrace(PT_DENY_ATTACH,0,0,0);

•#endif

@autoreleasepool{

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

•}

•}

但遗憾的是,iPhone真实的运行环境是没有sys/ptrace.h抛出的。虽然ptrace方法没有被抛出,但是不用担心,我们可以通过dlopen拿到它。

dlopen:当path参数为0是,他会自动查找$LD_LIBRARY_PATH,$DYLD_LIBRARY_PATH, $DYLD_FALLBACK_LIBRARY_PATH和当前工作目录中的动态链接库.

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

文件系统中的文件、keychain中的项,都是加密存储的。当用户解锁设备后,系统通过UDID密钥和用户设定的密码生成一个用于解密的密码密钥,存放在内存中,直到设备再次被锁,开发者可以通过Data

Protection API来设定文件系统中的文件、keychain中的项应该何时被解密。

1)文件保护

•/*为filePath文件设置保护等级*/

NSDictionary*attributes = [NSDictionarydictionaryWithObject:NSFileProtectionComplete

•forKey:NSFileProtectionKey];

•[[NSFileManagerdefaultManager]setAttributes:attributes

•ofItemAtPath:filePath

•error:nil];

//文件保护等级属性列表

NSFileProtectionNone//文件未受保护,随时可以访问(Default)

NSFileProtectionComplete//文件受到保护,而且只有在设备未被锁定时才可访问

NSFileProtectionCompleteUntilFirstUserAuthentication//文件收到保护,直到设备启动且用户第一次输入密码

NSFileProtectionCompleteUnlessOpen//文件受到保护,而且只有在设备未被锁定时才可打开,不过即便在设备被锁定时,已经打开的文件还是可以继续使用和写入

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

这个妹子是阿里安全部的,很厉害啊。。。。

微博:程序媛念茜

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容