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)
留言评论(旧系统):