iCloud是Apple提供给用户的云同步工具,主要用于丢失设备或购买新设备时,可以轻松地恢复先前设备上拥有的相同信息。但当用户的Apple ID失窃之后,则可能面临用户数据被盗取的风险。

iCloud备份

---

iCloud的相关信息,Apple在Support中提供了部分说明[^1]:

### iCloud的备份信息

* 已购买的音乐、影片、电视节目、App 和图书

* “相机胶卷”中的照片和视频

* 设备设置

* App 数据(包括:Keychain、数据Document文件夹,不包含tmp和Cache临时文件)

* 主屏幕和 App 排列

* 信息(iMessage、短信和彩信)

* 铃声

* Visual Voicemail

### iCloud的备份时间

当iOS设备接通电源、被锁定(锁屏)且接入无线局域网时,iCloud云备份会自动运行。

### iCloud的备份特点

根据iTunes备份提供的官方文档说明[^2],iTunes备份可选择使用两种方式进行:一种是备份文件使用单独密码加密,另外一种是不含密码加密。

iCloud备份和iTunes的备份除完整性上的区别外,区别主要在于Keychain数据处理上。在常见的iTunes备份中,备份的敏感数据(如keychain)是可选择使用单独密码或不使用单独密码方式加密(使用UDID等硬件信息加密)。iCloud该选项不可设置,默认加密使用设备的UDID等硬件信息加密。

当包含单独密码时,敏感数据(如Keychain)是可以直接备份至新手机中,若不设置密码(或iCloud方式)则在相同手机上则才可还原敏感信息(如Keychain)。

存在的问题

---

由于iCloud会备份App数据,包括不限于keychain和程序文档目录,因此一些重要的iOS保存信息会随iCloud被同样备份。

当用户Apple ID被盗后,盗用者可在一台iOS设备上恢复远程正常用户手机的备份内容,并且可实现免密码登录部分系统的功能。

截至本文写成时,微信尚存在此问题。(时间较久,最新版本轻自行测试。)

同样的问题也存在于iTunes备份中,相对来说,窃取用户电脑上的iTunes备份的困难度和复杂度也较单独窃取Apple ID难度高。但若获取到iTunes备份,且获取iTunes备份密码的前提下,则可完成对设备的完全复制,包括Keychain数据。

同样在iOS系统越狱环境中,攻击者可通过程序伪造UDID信息等方式,在iCloud恢复备份时同样恢复Keychain中的数据备份。

解决方案

---

###针对文件的备份

针对文件的iCloud备份,可使用NSURL类的NSURLIsExcludedFromBackupKey方法[^3]实现判断文件是否包含在备份文件中。

同样,可通过对设备上的文件设置该属性,禁用该文件被iCloud备份。

适用于iOS 5.1以上系统:

```
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);
    NSError *error = nil;
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
                                  forKey: NSURLIsExcludedFromBackupKey error: &error];
     if(!success){
        NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
     }
    return success;
}
```

适用于iOS 5.0.1系统:

```
#import <sys/xattr.h>
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);
    const char* filePath = [[URL path] fileSystemRepresentation];
    const char* attrName = "com.apple.MobileBackup";
    u_int8_t attrValue = 1;
    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
     return result == 0;
}
```

目前iOS 5.0系统没有禁用iCloud方式的方法,唯一防止备份的方法为将文件放置于Cache文件夹中。

[^1]: [iCloud: iCloud Backup](http://support.apple.com/kb/PH2584)

[^2]: [iTunes: About iOS backups](http://support.apple.com/kb/HT4946)

[^3]: [NSURL Class Reference](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html)

[原文地址]

留言评论(旧系统):

五折 @ 2013-12-19 16:48:14

话说,射到过一个iCloud,玛德里面啥都没有!

本站回复:

……