图片 18

iOS Security 安全白皮书(一)

苹果公司在 iPhone 5s
的发布会上公布了全新的指纹识别安全技术,也就是 Touch
ID
,开创了生物安全识别技术在便携设备上使用的新篇章。此后,苹果还将此技术带到了
iPad
上。此前没有任何厂家将指纹识别成功的打造在如此常用的设备上,因为涉及到非常复杂的工艺和技术难关。苹果在2012年收购在此方面技术领先的
Authen Tec 公司作为技术基础,并为iOS设备量身打造了 Touch
ID。这使得苹果在智能设备的指纹识别方面比其他厂商更加智能且利于使用。三星的指纹识别功能必须要用手指按某个方向滑动,而
Touch ID 只需你将手指放上去,就可以360度读取指纹。那么,Touch ID
是否真的足够安全呢?这是一个值得探讨的问题。

本文首发个人博客:聊聊 iOS 数据保护

图片 1

图片 2

文件系统中的文件、keychain中的项,都是加密存储的。当用户解锁设备后,系统通过UDID密钥和用户设定的密码生成一个用于解密的密码密钥,存放在内存中,直到设备再次被锁,开发者可以通过Data
Protection API
来设定文件系统中的文件、keychain中的项应该何时被解密。这个就是数据保护的内容。

前言

iOS
安全白皮书是苹果官方提供的,里面有苹果对于安全设计的一些细节介绍,阅读可以更佳理解苹果系统的构造,虽然不能说是看了能很深的明白其设计思路,但是可以增加知识,为以后做安全方面打下基础

官方原文地址)
这个是官方的文档,英文好的同学强烈建议看原文档,个人经验来说,看英文跟看中文完全是两种不同的体验,但是看英文会更加有趣更加深刻

17年白皮书翻译),我是看到巧神推荐才知道有iOS
安全白皮书的,以前对于白皮书的概念还是高中的练习辅导呢,那时候上网找了下有没中文文档,很遗憾没有找到,然后过了半个月这篇翻译就出来了,很快,很强,但是原文都是机翻,然后没有润色,有点难读懂,理解能力强的同学可以直接看,全文都已经翻译好了

16年白皮书
这个无敌,强烈建议大家去看,翻译的堪称完美,至今不知道作者是如何做到的,一句话:无敌,是真的无敌

在我翻译第一章的时候找到这些优秀的资料,一开始是放弃翻译的了。后来自我反思,以前Blog
我也看了很多,但是印象一直不深,但是这次翻译完第一章給我自己的感觉挺好的,认识了很多新知识点,感觉印象很深刻,所以还是想自己慢慢的翻译下,可以慢慢成长。这次打算自己翻译17年的白皮书和阅读16年白皮书,一起讲iOS
安全这方面的知识学习下

以下是翻译


Touch ID 与普通密码相比的安全性

一个人的指纹是世界上最好的密码之一。它独一无二,高度特异,并且无需记忆。它会伴随人终生,所以你可以一直使用同一个指纹密码。

比起简单的4位数字锁屏密码一万分之一的破解可能性,能找到同样单个指纹的人的概率为五万分之一,这是非常安全的,比起前者我可以不断尝试,Touch
ID
指纹的硬性破解几率几乎没有,因为不可能有五万多个人排队来一一解锁你的设备,况且
Touch ID
会拒绝第五次以后的尝试而要求输入密码。所以我们可以添加更加复杂的密码而不是简单的数字密码来进一步提高安全性。

图片 3

苹果在发布会上表示,在 Touch ID
推出之前,因为每次解锁都要繁琐的输入密码的原因,使用了锁屏密码的人不到
50%;然而在此之后,iPhone 5s 用户使用锁屏密码的概率大大增加,因为 Touch
ID 简单好用,所以瞬时的解锁让人几乎感受不到有锁屏密码的存在。

图片 4

这实际上是一个非常好的情况,苹果公司在这一点上做的贡献就是,它让大多数曾经没有保护数据安全习惯的用户都开始添加密码来保护数据安全,让
iPhone 从总体方面来说都变得更加安全。而这一切实现的原因就是 Touch ID
既可靠又简单。

可见,Touch ID 的出现,让手机锁比以前更加安全可靠。

keychain服务提供了一种安全的保存私密信息(密码,序列号,私钥,证书等)的方式,每个iOS程序都有一个独立的keychain存储。相对于NSUserDefaults、文件保存等一般方式,keychain保存更为安全,而且keychain里保存的信息不会因APP被删除而丢失。

Introduction

指纹破解可能性

指纹密码是否可破解?基本所有密码都可以被破解,只是难度不同。已经有人成功硬性破解了
Touch ID
,靠的是一张指纹的模型。普通人是否应该为此担心?答案是否定的,因为这种模型需要很高的技术来打造,并且仍然有着很高的失败率,但
Touch ID 只允许尝试不超过 5
次,所以必须把指纹模型做到极为精密和逼真,但没人愿意付出如此代价来解锁
iPhone。

图片 5

基于钥匙串的特点,我们在使用时对于新增的数据项目,要注意数据删除的时机。还有一点需要注意的就是,保护属性的指定。如果没有指定保护属性,这将被视为严重的安全漏洞。

System Security

Touch ID 指纹识别的原理

Touch ID 如何识别指纹呢?在如此快速的识别过程中,Home
按钮上的一圈金属环起到了感应手指的功能,通知 Touch ID 来读取指纹。Touch
ID 置于该按钮中,传感器的厚度只有 170 微米,拥有 500 ppi
高分辨率,可读取极小的指纹细节。传感器可从皮肤皮下层指纹的一些小部分拍摄高分辨率图像,然后会分析该信息,根据三种基本指纹类型(弧形纹、箕形纹或斗形纹)将指纹分类,它会绘制比人眼不可见的纹路细节,确保指纹读取准确无误。

图片 6

Touch ID 可从 360
度方向读取指纹,随后创建指纹的某种数学表达式,并将其与已注册的数据进行比较,以确定是否匹配。如果匹配,便可替代密码来解锁设备或通过某个令牌。

此外,根据苹果官方的描述,Touch ID
会向以注册的指纹数据里持续的添加新的特征数据,随着时间的推移,这能不断提高匹配准确度,也能进一步的提高安全性。

图片 7

除了上述的内容,苹果还加入可以一些有效的手段来进一步确保安全,例如设备再重新启动或者保持锁定
48
小时后,丢只能通过密码而不是指纹来解锁设备,这也打消了坏人通过不停重新启动来破解指纹的可能性。

总体而言,Touch ID 是一套完备的指纹识别系统,其原理清晰明了。

作用

当我们备份设备数据时,系统会将用户数据保存在相应的钥匙串中,并依照相应的安全策略保存。主要分成两类:加密不加密

两者的主要区别在于恢复数据时的范围不同。加密备份的数据可以恢复到任何设备上(ThisDeviceOnly指定的项目除外),而不加密的备份则只能恢复至同一台设备。

keychain支持在多个应用之间共享数据。但现实开发中UIPasteboardNameFind的使用代替了keychain。不过好在Apple在iOS11中已经废弃它。看来Apple想规范开发者对于用户敏感数据的共享使用,同时提醒大家使用更加安全的方式存储用户敏感数据。

Secure boot chain

指纹信息数据存储的安全性

指纹对于每个人来说都极其重要,因为它不能更改,所以如果泄漏了指纹图案,相当于是损失了一个天然的强有力的安全密码。问题是,我的指纹数据在
iOS 设备上是否安全,iOS
是否会泄露我的指纹图像?这些是我们最应该关心的问题。

首先,苹果声明指纹的图案不会被保存,存储于设备中的是指纹特征的数学表达式,而且从这些表达式直接反推出指纹图像也是不可能的。因此即使丢失设备并被人把它拆解开来,也不会丢失指纹的图形。

图片 8

其次,指纹的验证运算独立于主要处理器芯片(例如 A7、A8),芯片内有称为
“Secure Enclave” 的高级安全架构,专用于密码指纹数据,并使用 Secure
Enclave 的专用密钥加密,以及每次启动以随机的 UID
进行管理。指纹数据仅能被 Secure Enclave
处理和使用,正因为此架构独立于其它设备部件,仅有 Touch ID
使用它,且不能将它用于匹配其他指纹数据库,所以存储的指纹数据不会由 iOS
或其他应用访问,也不会被存储到 Apple 服务器或备份到 iCloud 等地方。

图片 9

以上皆是苹果官方的说明。从硬件上来看指纹特征数据尚不能被 “Secure
Enclave” 和 Touch ID
以外的部件访问到,并且两者芯片互相隔离开来,所有软件都没有权利获得指纹数据,仅能得到指纹是否错误的回馈。因为架构的核心秘密仅仅只有苹果公司知道,所以目前几乎没有第三方软件可以访问到这部分敏感信息。这里也要感谢
iOS 的封闭性以及对应用程序严格的约束,才能打造出最安全的系统。

那么苹果公司是否会自己上传利用这部分数据呢?从官方的声明来看是不会的。

使用范例

NSMutableDictionary *dict = [NSMutableDictionary dictionary];NSData *passwordData = [@"myPassword" dataUsingEncoding:NSUTF8StringEncoding];[dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];[dict setObject:@"Conglomco" forKey:(__bridge id)kSecAttrLabel];[dict setObject:@"This is your password for the Conglomco service." forKey:(__bridge id)kSecAttrDescription];[dict setObject:@"chars" forKey:(__bridge id)kSecAttrAccount];[dict setObject:@"cn.zaker.keychain.sample" forKey:(__bridge id)kSecAttrService];[dict setObject:passwordData forKey:(__bridge id)kSecValueData];[dict setObject:(__bridge id)kSecAttrAccessibleWhenUnlocked forKey:(__bridge id)kSecAttrAccessible];OSStatus error = SecItemAdd((__bridge CFDictionaryRef)dict, NULL);if (error == errSecSuccess) { NSLog;}

NSMutableDictionary *dict = [NSMutableDictionary dictionary];[dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];[dict setObject:@"chars" forKey:(__bridge id)kSecAttrAccount];[dict setObject:@"cn.zaker.keychain.sample" forKey:(__bridge id)kSecAttrService];OSStatus error = SecItemDelete((__bridge CFDictionaryRef)dict);if (error == errSecSuccess) { NSLog;}

NSMutableDictionary *dict = [NSMutableDictionary dictionary];NSData *newPasswordData = [@"newMyPassword" dataUsingEncoding:NSUTF8StringEncoding];[dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];[dict setObject:@"chars" forKey:(__bridge id)kSecAttrAccount];[dict setObject:@"cn.zaker.keychain.sample" forKey:(__bridge id)kSecAttrService];NSDictionary *updatedAttribute = [NSDictionary dictionaryWithObject:newPasswordData forKey:(__bridge id)kSecValueData];OSStatus error = SecItemUpdate((__bridge CFDictionaryRef)dict, (__bridge CFDictionaryRef)updatedAttribute);if (error == errSecSuccess) { NSLog;}

NSMutableDictionary *dict = [NSMutableDictionary dictionary];[dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];[dict setObject:@"chars" forKey:(__bridge id)kSecAttrAccount];[dict setObject:@"cn.zaker.keychain.sample" forKey:(__bridge id)kSecAttrService];[dict setObject:kCFBooleanTrue forKey:(__bridge id)kSecReturnAttributes];NSDictionary *result = nil;OSStatus error = SecItemCopyMatching((__bridge CFDictionaryRef)dict, &result);if (error == errSecSuccess) { NSLog(@"Yay %@", result);}

System Software Authorization

与 Touch ID 配合使用的安全建议

Touch ID
虽然很安全,但仍不可在安全性上大意。除了最普通的物理防盗方法之外,还推荐如下的安全措施,来竭力保护个人数据的安全。

常用方法

方法 描述
SecItemAdd 添加数据
SecItemDelete 删除数据
SecItemUpdate 修改数据
SecItemCopyMatching 查找数据

Secure Enclave

更加强壮的锁屏密码

Touch ID
快速的扫描解锁免去了输入繁琐的锁屏密码,但在多次扫描失败后,允许用户手动输入密码。这时如果你有一个不简单的密码,不是简单的4位数字,就能大幅提高安全性。这对于本人使用来说,仍然不会增加日常使用的繁琐。

保护属性

钥匙串保护属性 含义
kSecAttrAccessibleAfterFirstUnlock 开机之后密钥不可用,直到用户首次输入密码
kSecAttrAccessibleAlways 密钥在设备开机后依旧可用。在iOS9中已经废弃
kSecAttrAccessibleAlwaysThisDeviceOnly 密钥始终可用,但无法迁移到其他设备
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly 作用同上
kSecAttrAccessibleWhenUnlocked 只要解锁过设备,则密钥保持可用状态
kSecAttrAccessibleWhenUnlockedThisDeviceOnly 作用同上
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly 作用同上,只有用户设置密码密钥才可用

kSecAttrAccessibleAlways
将会引入一个很明显的安全问题,因为此种保护属性,只要有人窃取了你的设备,他们就能读取钥匙串的内容。

kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
这个属性可以完美的解决上述的安全问题。因为越狱时通常需要重启设备。

kSecAttrAccessibleWhenUnlocked
这个属性要求攻击者必须知道用户密码才能提取隐私数据。它很适合做默认属性值。

kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
是iOS8新增的保护属性。这个属性要求在使用时用户设定了密码,否则使用就失败。

Touch ID

注册精准的指纹

推荐使用大拇指录入指纹,因为此处的指纹纹理清晰,最适合扫描。推荐将手指清洁干净再录入指纹,防止扫描出错。在录取指纹边缘的界面,应当将手指各边缘尽可能的接触
Home 按钮,来全方位的录入指纹。

图片 10

虽然网络上有提供方法,可以在录取指纹时,同时将五个手指录入到一个指纹里,但这无疑降低了精准性,可能会带来增大被破解概率的风险。因此,推荐一次只录入一个指纹,目前
iOS 支持最多注册 5 个指纹,你可以安排在你最常用的手指上。

基本用法

项目类 描述
kSecClassGenericPassword 普通密码
kSecClassInternetPassword 专门用于互联网服务的密码
kSecClassCertificate 加密证书
kSecClassKey 加密密钥
kSecClassIdentity 一个密钥对(包括公共证书和私钥)

Encryption and Data Protection

丢失或被盗后停用 Touch ID

在iPhone、iPad丢失或者被盗后,应当前往 iCloud.com/#find 或者其他设备上的“查找我的iPhone”应用来打开“丢失模式”,此时会停用
Touch ID 并只能通过密码解锁设备,排除他人使用破解的指纹来解锁开
iPhone、iPad 的可能性。

图片 11

iCloud同步

这是iOS7引入的一种新机制,可以把钥匙串项目同步到iCloud,允许用户在多个设备之间共享钥匙串项目。

默认情况下,应用程序创建的钥匙串项目会禁用这个机制,但可以把kSecAttrSynchronizable设置为true来启用。

另外请注意,使用此选项时无法指定不兼容的kSecAttrAccessible属性。例如,指定kSecAttrAccessibleWhenUnlockedThisDeviceOnly不起作用,因为ThisDeviceOnly指定的项目不会备份,也不能同步到iCloud、笔记本电脑、台式机或其他同步位置。

Apple
推出了数据保护API作为额外的保护层,它允许开发者指定文件解密密钥的生命周期。可以使用这个API控制文件的访问权限,与钥匙串项目中的kSecAttrAccessible
属性类似。

数据保护API使用用户密码和层级密钥来加密保护文件的密钥,而当这些文件不能被访问时,会从内存中删除这个层级密钥。

Hardware security features

避免 iOS 越狱

虽然目前没有明确的说明可以指出越狱设备的 Touch ID
机制会存在安全隐患,但由于越狱设备的权限非常大,某些破解软件和插件可能会访问到很机密的信息,这会留下很大的安全隐患。此外,在
iOS 不断改良的今天,越狱已经变得不再那么令人激动了。

文件保护过程

图片 12文件保护过程

1.文件生成一个文件密钥来加密文件的内容。

2.生成一个额外的密钥对,用于生成文件公钥文件私钥

3.用文件私钥Protected Unless Open等级公钥计算出一个共享密码

4.用共享密码 SHA-1散列值加密文件密钥。

5.加密过的文件密钥会存储在文件的元数据中,元数据中还有文件的公钥。

6.系统丢弃文件私钥

7.关闭文件时从内存中删除未加密的文件密钥。

8.需要再次打开文件时,用Protected Unless Open等级私钥文件公钥计算共享密码

9.计算共享密码的SHA-1散列值,把它当作解密文件的密钥。

File Data Protection Passcodes

DataProtectionClass 权限

如果你的应用在设备进入后台或锁定时不需要写入或读取文件,那你就可以在工程中配置一个NSFileProtectionComplete值来添加权限。这将确保所有受保护的文件数据只能在设备解锁时访问,相当于为所有的应用文件都设置kSecAttrAccessibleWhenUnlocked选项。

从Xcode5开始,新工程会默认启用数据保护权限,但是一些旧工程并不会自动开启。

开启方式如下图:

图片 13开启DataProtectionClass权限

Data Protection classes

使用范例

NSData *data = [self generateData];NSError *error = nil;NSString *path = [NSString stringWithFormat:@"%@_demo.pdf", NSTemporaryDirectory()];[data writeToFile:path options:NSDataWritingFileProtectionComplete error:&error];if  { NSLog(@"%@", error);}

NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"demo.txt"];NSError *error = nil;NSDictionary *attr = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey];[[NSFileManager defaultManager] setAttributes:attr ofItemAtPath:path error:&error];if  { NSLog(@"%@", error);}

NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"demo.sqlite"];sqlite3 *handle = NULL;sqlite3_open_v2([path UTF8String], &handle, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_FILEPROTECTION_COMPLETEUNLESSOPEN, NULL);

Keychain Data Protection

保护等级

这个保护等级是iOS5开始使用的默认值。主要用来防御一些需要重启的攻击。

官方称这是目前最安全的文件保护等级。在这种情况下,锁屏之后系统就会删除内存中的层级密钥,并把文件改为不可读。

具体使用的范例前文可见。

使用Complete保护之前,考虑是否合适。如果你的应用进程需要持续写/读一个文件,那这种保护模式就不合适了。

如果一个文件当前被一个应用打开,那会暂时禁用该文件的保护。它会确保打开的文件在设备被锁定时依然能够写入,并且允许新建文件到磁盘。不过这个等级保护的文件在锁屏时无法打开,除非锁屏时就已经提前打开。

CommonCrypto是Apple官方提供的一套加密框架。在使用这套方案时,主要注意以下几个问题即可。

Access to Safari saved passwords

避免弱算法

众所周知,DES就是一种很典型的弱算法。如果你使用弱算法,那应用就很容易遭受密码攻击和暴力破解。

我们在实际使用时,可以考虑使用AES算法、MD5算法或MD5加盐算法等。

Keybags

破碎的熵

我们通常会使用rand方法来产生随机数,但是系统的这个随机函数并不是真正的随机。它产生的随机数符合正态分布,我们可以使用官方提供的方法SecRandomCopyBytes获得。也可以自己使用算法产生随机数。

这里分享一个笔者以前自己实现的随机数案例。《均匀分布随机函数的实现》

Security certifications and programs

弱密钥

开发者经常将用户的密码当作加密密钥,尤其在移动设备上,这将导致一个非常脆弱、低熵加密的密钥。

那么正确的姿势是使用CCKeyDerivationPBKDF方法来生成。

App Security

使用范例

#import <LocalAuthentication/LocalAuthentication.h>LAContext *context = [[LAContext alloc] init];NSError *error = nil;NSString *reason = @"We use this to verify your identify";if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:reason reply:^(BOOL success, NSError * _Nullable error) { if  { NSLog(@"Hello, that's your finger!"); } else { NSLog(@"Couldn't read your fingerprint. Falling back to PIN or somthing."); } }];} else { NSLog(@"Error : %@ %@", error, [error userInfo]);}

App code signing

Touch ID 与普通密码相比的安全性

一个人的指纹是世界上最好的密码之一。它独一无二,高度特异,并且无需记忆。它会伴随人终生,所以你可以一直使用同一个指纹密码。

比起简单的4位数字锁屏密码一万分之一的破解可能性,能找到同样单个指纹的人的概率为五万分之一,这是非常安全的,比起前者我可以不断尝试,Touch
ID
指纹的硬性破解几率几乎没有,因为不可能有五万多个人排队来一一解锁你的设备,况且
Touch ID
会拒绝第五次以后的尝试而要求输入密码。所以我们可以添加更加复杂的密码而不是简单的数字密码来进一步提高安全性。

Runtime process security

Touch ID 指纹识别的原理

在如此快速的识别过程中,Home
按钮上的一圈金属环起到了感应手指的功能,通知 Touch ID 来读取指纹。Touch
ID 置于该按钮中,传感器的厚度只有 170 微米,拥有 500 ppi
高分辨率,可读取极小的指纹细节。传感器可从皮肤皮下层指纹的一些小部分拍摄高分辨率图像,然后会分析该信息,根据三种基本指纹类型(弧形纹、箕形纹或斗形纹)将指纹分类,它会绘制比人眼不可见的纹路细节,确保指纹读取准确无误。

图片 14touch
id sensor

Touch ID 可从 360
度方向读取指纹,随后创建指纹的某种数学表达式,并将其与已注册的数据进行比较,以确定是否匹配。如果匹配,便可替代密码来解锁设备或通过某个令牌。

此外,根据苹果官方的描述,Touch ID
会向以注册的指纹数据里持续的添加新的特征数据,随着时间的推移,这能不断提高匹配准确度,也能进一步的提高安全性。

图片 15touch
id ontouch

除了上述的内容,苹果还加入可以一些有效的手段来进一步确保安全,例如设备再重新启动或者保持锁定
48 小时后,就只能通过密码而不是指纹来解锁设备。

Extensions

Secure Enclave

Apple声明指纹的图案不会被保存,存储于设备中的是指纹特征的数学表达式,而且从这些表达式不可能直接反推出指纹图像。

图片 16touch-id-structure

指纹的验证运算独立于主要处理器芯片,芯片内有称为 “Secure Enclave”
的高级安全架构,专用于密码指纹数据,并使用 Secure Enclave
的专用密钥加密,以及每次启动以随机的 UID 进行管理。指纹数据仅能被 Secure
Enclave 处理和使用,正因为此架构独立于其它设备部件,仅有 Touch ID
使用它,且不能将它用于匹配其他指纹数据库,所以存储的指纹数据不会由 iOS
或其他应用访问,也不会被存储到 Apple 服务器或备份到 iCloud 等地方。

图片 17A7-Secure-Enclave

从硬件上来看指纹特征数据尚不能被 “Secure Enclave” 和 Touch ID
以外的部件访问到,并且两者芯片互相隔离开来,所有软件都没有权利获得指纹数据,仅能得到指纹是否错误的回馈。因为架构的核心秘密仅仅只有苹果公司知道,所以目前几乎没有第三方软件可以访问到这部分敏感信息。

到此,关于 iOS 数据保护的问题暂时告一段落。欢迎大家评论指正。

App Groups

Data Protection in apps

Accessories

HomeKit

SiriKit

HealthKit

ReplayKit

Secure Notes

Apple Watch

Network Security

TLS

VPN

Wi-Fi

Bluetooth

Single Sign-on

AirDrop security

Apple Pay

Apple Pay components

How Apple Pay uses the Secure Element

How Apple Pay uses the NFC controller

Credit, debit, and prepaid card provisioning

Payment authorization Transaction-specific dynamic security code

Contactless payments with Apple Pay

Paying with Apple Pay within apps

Paying with Apple Pay on the web

Rewards cards Suspending, removing, and erasing cards

Internet Services

Apple ID

iMessage

FaceTime

iCloud

iCloud Keychain

Siri

Continuity Safari Suggestions, Spotlight Suggestions, Lookup, #images, and News

Widget in Non-News Countries

Device Controls

Passcode protection

iOS pairing model

Configuration enforcement

Mobile device management (MDM)

Shared iPad

Apple School Manager

Device Enrollment

Apple Configurator 2

Supervision

Restrictions

Remote Wipe

Lost Mode

Activation Lock

Privacy Controls

Location Services

Access to personal data

Privacy policy

Apple Security Bounty

Conclusion

A commitment to security

Glossary

Document Revision History


Introduction

苹果设计的 iOS
平台以安全为核心。当我们着手打造最好的移动平台时,我们借鉴了几十年的经验,打造了全新的架构。我们考虑了桌面环境的安全隐患,并在
iOS
的设计中建立了新的安全方法。我们开发并纳入许多创新功能,来加强手机安全和保护整个系统。因此,iOS
在移动设备安全方面有大的飞跃

每一个 iOS
设备结合软件、硬件和服务一起工作,为了是提供更加具有安全性和透明性的用户体验。iOS
不仅是保护本地的设备和它的数据,而是扩展到整个生态系统,包括用户在本地做的一切,还有在网络上的各种互联网服务

iOS 和 iOS
设备提供先进的安全功能,并且它们也很容易使用。许多功能是默认启用的,因此IT
部门不需要去大量的配置。但是关键的安全功能,如设备加密是不可配置的,所以用户不会因为错误的操作而禁止设备加密。其他功能,例如指纹识别,在提高用户体验方面,可以更简单,更直观的保护设备

本文档提供了如何在 iOS
平台上实现安全技术和功能的详细细节。它也将有助于开发者将 iOS
平台安全技术和功能与自己的政策和程序相结合,以满足其特定的安全需求。

这个文档主要是讨论以下几个话题:

  • 系统安全:为 iPhone、iPad、iPod touch 平台集成安全的软件和硬件
  • 加密和数据保护:架构和设计来保护用户数据,在设备丢失或被盗,或未经授权的人试图使用或修改它的情况下
  • 应用程序安全:使应用程序安全运行,且不影响平台完整性
  • 网络安全:使用行业标准的网络协议,提供安全的认证和加密的数据传输
  • 苹果支付:关于安全支付的实现
  • 互联网服务:苹果为通讯,同步,和备份做的网络基础设施
  • 设备控制:允许管理 iOS
    设备,防止未经授权的使用,如果设备丢失或被盗可以远程清除数据。
  • 隐私控制:可以控制是否访问位置服务和用户数据。

图片 18

System Security

系统安全设计,软件和硬件在所有的iOS
设备中的核心组件都是安全的,这包括启动过程、软件更新、安全区域。这种架构在iOS中是安全的核心,不会有另外一种方式让可以运行设备

在iOS
设备中,硬件和软件紧密的相结合,确保系统的每一个组件都是可信任的,并且系统是作为一个有效的整体。从最初的启动到iOS
软件更新到第三方应用程序,每一个步骤进行了分析和审查,以确保硬件和软件以最佳性能结合,并且正确合理的使用资源

进入设备固件升级模式 (DFU Device Firmware Upgrade)

确定只有未修改的Apple 签名代码,才可以恢复设备进入DFU
模式后,将其恢复到已知的良好状态。DFU 模式可以手动的进入:首先用USB
电缆将设备连接到电脑上,然后同时按住Home
键和电源键,然后过了8秒,放开电源键继续按住Home 键提示:当设备进入DFU
模式屏幕上是不会出现任何东西的,如果苹果Logo
出现了,就是电源键被按住的时间太久了

Secure boot chain 安全启动链

启动过程的每一步都包含了苹果密码签名的组件,来确保完整性,并且只有信任链验证后才能进入。这包括引导装载器、内核,内核扩展,基带固件。安全启动链确保这些最底层的软件不会被篡改

当启动iOS
设备,它的应用处理器会立刻执行只读存储器(ROM)中的代码,这里称之为Boot
ROM。这些不可改变的代码,被称之为硬件信任根(hardware root of
trust),在芯片制造的时候就烧进去了,而且是默认信任的

引导ROM 代码包含了苹果根CA 的公钥,在允许进入加载之前用来验证iBoot
引导装载器是否是苹果签名的,这个是在信任链中的第一步,来确保接下来的每一步都是苹果签名认证的,当iBoot
完成它的任务时,它会验证和运行iOS
内核。对于搭载S1,A9或则A系列处理器的设备,Boot ROM
验证一个额外的低级引导装载器(Low-Level Bootloader
LLB),依次加载和验证iBoot

如果引导过程这一步无法加载或者无法验证下一步的程序,启动会被停止,这个时候设备屏幕会显示
“Connect to iTunes” ,这个就是恢复模式。如果引导Boot ROM
无法加载或则验证低级引导装载器,这个时候会进入到DFU
模式(设备固件升级模式)。对于这两种情况,必须将设备用USB
线缆连接到电脑的itunes
恢复到工厂默认设置。对于手动进入恢复模式更多信息可以查看链接:https://support.apple.com/kb/HT1808

对于蜂窝移动数据接入的设备,基带子系统也在相似的安全启动过程中,利用基带处理器来签名软件和密钥验证

设备有安全区域(Secure
Enclave),这个安全区域处理器也会利用一个安全启动的启动过程来确保它由苹果来独立的软件验证和签名

System Software Authorization 系统软件授权

苹果公司定期发布软件更新来解决新兴的安全问题,并且提供新功能,同时这些支持更新到所有的iOS
设备,用户在设备上接受到iOS 更新提示,可以通过iTunes
和无线来更新,并且鼓励大家快速采用最新的安全补丁

上面所述的启动过程有助于确保在设备上只能安装苹果签名的代码。防止设备被降级到旧版本以致缺乏最新的安全保护,iOS
使用这一过程被称之为系统软件授权。如果降级是可能的,攻击者可以在设备安装一个旧版本的iOS
系统来利用漏洞,但是这个漏洞已经在新版本被修复了

在设备上有安全区域(Secure
Enclave),安全区域处理器也会利用系统软件授权来确保软件的完整性,并且防止降级设备。具体可以看接下来的安全区域章节

iOS 软件更新可以使用iTunes 更新,也可以在设备上使用空中下载技术(over
the air OTA)。利用iTunes 更新,会下载一份完整的iOS 系统并安装,用OTA
更新只会下载必要的组件进行更新,提高网络效率,并不会下载整个操作系统。另外,软件更新可以被缓存在macOS
服务器运行在本地网络服务,所以iOS
设备不需要访问苹果服务器获取必要的更新数据

在iOS 升级过程中,iTunes 更新(或者利用设备的OTA
更新),会连接到苹果安装授权服务器,然后发送一系列的加密测量结果(cryptographic
measurements ),里面有每个安装包需要更新的信息(例如:iBoot、内核、OS
映像),还有一个临时随机的不重复的(anti-replay)值,设备的唯一ID(ECID)

授权服务器会检查这个加密的测量结果,查看是否允许安装,如果匹配成功,会将ECID
加到这个测量结果中并且标记这个结果。在升级过程中,服务器将一组完整的签名数据传递给设备。添加一个处理过的ECID
到请求设备,只对加密的测量结果授权和认证,服务器确保只会由苹果提供更新

启动时信任链会评估验证这个签名是从苹果来的,和从磁盘中加载这个测量结果,结合设备的ECID,匹配所要更新的签名

这些步骤确保为特定的设备授权,和一个设备的旧版系统的不能被复制到另外一个设备上面去,可以防止攻击者保存服务器的响应,并且利用它来篡改设备或修改系统软件

Secure Enclave 安全区域

安全区域是一个协助处理器,是在Apple S2,Apple A7 以及后面的A
系列处理器中出现的。它使用加密内存,包括硬件随机数发生器。安全区域提供了所有的数据保护密钥管理的加密操作,并且维护数据的完整性,即使内核已受到破坏。安全区域跟应用处理器通讯被隔离在一个中断驱动信箱和一个共享内存数据缓冲器中

安全区域运行一个苹果定制的L4
微核,安全区域利用自己的安全启动去做一个个性化的软件更新,这里也是跟应用处理器分离的。在A9
及以后的A 系列的处理器中,芯片会安全的生成一个UID(唯一的ID)。这个UID
连苹果和系统的其他部分都不知道的

当设备启动的时候,会创建一个临时密钥,并跟UID
混淆在一起,这个用来对设备内存模块中的安全区域进行加密。除了在苹果A7
处理器上,安全区域的内存也用这个临时密钥做了加密

另外,数据用一个随机值和UID 混淆后加密存储在安全区域的文件系统中

安全区域负责处理指纹识别传感器的指纹数据,判断指纹是否有效,然后允许访问设备或者通过用户的购买行为,处理器跟指纹识别传感器是在串行外设接口上通讯的,处理器将数据传输到安全区域但是处理器并不能读取数据内容,这个数据用指纹识别传感器跟安全区域的一个设备共享密钥来进行加密和验证,这个密钥用AES
方法来加密,两边都会提供一个随机密钥,并且用AES-CCM 来传输数据

Touch ID 指纹识别传感器

Touch ID
是指纹识别传感器系统,可以更快、更简单、更安全的解锁手机。该技术会从任何角度读取指纹数据,并随着时间的推移更多地了解用户的指纹,随着每次使用的其他重叠节点被识别,传感器继续扩展指纹图

Touch ID
可以让用户使用更长、更复杂、更实用的密码,因为用户现在不用频繁地输入密码。Touch
ID
克服了用密码解锁的不便,但不是通过替换它来解决,是在一定的时间和场景内可以使用
Touch ID 来安全的访问设备

Touch ID and passcodes 指纹识别传感器和密码

要使用Touch ID,用户必须要为手机设置一个解锁密码,当Touch ID
扫描并识别到一个已经注册过的指纹时,设备可以在不需要密码的情况下解锁。Touch
ID 通常可以代替密码,但是在以下情况仍然需要使用密码:

  • 设备刚刚启动或者重启
  • 设备48小时内没有被解锁
  • 在过去的156小时(六天半天)中,密码未被用于解锁设备,Touch
    ID在过去4小时内未解锁设备
  • 设备已收到远程锁定命令
  • 指纹识别失败5次
  • 使用Touch ID设置或注册新手指时

当启用Touch
ID时,按下睡眠/唤醒按钮时,设备立即锁定。很多用户会设置一个解锁的宽限期,以避免每次使用该装置输入密码。使用Touch
ID,设备会在每次进入睡眠状态时锁定,并在每次唤醒时都需要指纹或者输入密码

Touch ID
可以最多设置5根不同的手指,随着一根手指的录入,跟别人误匹配的机率是50万分之一。在Touch
ID 指纹识别失败了五次,用户才需要输入密码以获取访问权限

Other uses for Touch ID

Touch ID 也可以用于Apple Pay(苹果提供的安全支付),有关更多Touch ID
的信息,请参阅本文档的Apple Pay 部分

另外,第三方应用程序可以使用系统提供的API 来让用户使用Touch ID
或密码进行身份验证。应用程序仅被通知身份验证是否成功; 它无法访问Touch ID
或与注册指纹相关联的数据

Keychain 也一样可以使用Touch ID
来解锁,只有通过指纹识别或者输入密码才能被访问。应用程序开发人员还有API
来验证用户是否设置了密码,因此可以使用Touch
ID对钥匙串项进行身份验证或解锁

在iOS 9 及以后,开发者可以做以下一些事情:

  • Require that Touch ID API operations don’t fall back to an
    application password or the device passcode. Along with the ability
    to retrieve a representation of the state of enrolled fingers, this
    allows Touch ID to be used as a second factor in security sensitive
    apps.
  • Generate and use ECC keys inside Secure Enclave. These keys can be
    protected byTouch ID. Operations with these keys are always done
    inside Secure Enclave afterSecure Enclave authorizes the use. Apps
    can access these keys using Keychainthrough SecKey. SecKeys are just
    references to the Secure Enclave keys and the keys never leave
    Secure Enclave.

Touch ID 也可以直接解锁 iTunes Store、App Store、iBooks Store
的购买项目,用户从而不用输入Apple ID
的密码。当用户授权购买的时候,设备和商店之间交换认证令牌。令牌和加密随机数保存在安全区域(Security
Enclave)中,这个随机数是被所有设备和iTunes Store
共享的安全区域密钥进行签名的。在iOS 10 中,Touch ID 保护安全区域中的ECC
密钥,这个密钥是用于通过认证购买的请求

Touch ID security

仅当Home按钮的电容钢环检测到手指的触摸时,指纹传感器才会起作用,这将触发高级成像阵列扫描手指并将扫描发送到安全区域

光栅扫描临时存储在安全存储器内的加密存储空间中,同时被矢量化分析,然后被丢弃。这个分析是使用subdermal
ridge flow angle mapping
技术,这是丢弃重建用户实际指纹所需的细节数据的有损过程。生成的结果是没有任何身份信息相关的数据,并且加密存储在安全区域,只能有安全区域访问,而且永远不会发送給苹果或者备份在iCloud、iTunes
上面

How Touch ID unlocks an iOS device

如果Touch ID关闭,设备锁定时,保留在安全区域中的Data Protection class
Complete的密钥将被丢弃。在用户通过输入密码解锁设备之前,该类中的文件和钥匙串项目是无法访问的。

当Touch ID
开启的时候,这个密钥不会在设备锁定的时候被丢弃。相反,这个密钥会被加到在安全区域内的Touch
ID 子系统的密钥中。当用户尝试解锁设备时,如果Touch
ID识别用户的指纹,则它会提供用于一个解密 Data Protection keys
的密钥,并且设备被解锁。这个解锁的过程需要Data Protection 和 Touch ID
子系统共同协作提供额外的保护

如果设备重新启动,并且在48小时没有解锁或五次失败的Touch ID
识别尝试后,安全区域会丢弃Touch ID 解锁设备所需的密钥

发表评论

电子邮件地址不会被公开。 必填项已用*标注