从诺基亚 X6 聊聊人脸解锁的安全性2

2018年6月8日13:01:50 发表评论 371 views

Android 4 时代的人脸解锁


不知很多同学是否还记得,早在 Android 4.0 冰淇淋三明治时代,Android 系统内部就集成了人脸识别解锁功能——当年的 Galaxy Nexus 和 Nexus 4 还用这项功能做过一波广告(还记得是一个小孩儿做出各种鬼脸企图解锁父亲的手机,父亲把手机拿到跟前看了一眼就完成了解锁)。那个时代的人脸识别解锁体验当然比现在差远了,尤其识别率和对场景的要求,都和现在的人脸识别解锁解决方案相去甚远。


但这是次要的,在人脸识别解锁功能推出的初期,谷歌似乎没怎么考量过这项功能的安全性,所以用照片来欺骗 Android 4.0 的人脸识别解锁是完全可行的(第一阶段的安全性差)。那么第二阶段呢?悲剧的是,我作为一个从未参与过生产的人,也没有条件去对当年的 Android 4.0 搞逆向;我也没有找到相关资料。不过我恶意揣测,这个阶段的人脸数据也并没有存储到像 TrustZone 这样的 TEE 安全世界中,而是简单地放在某个系统文件夹里,有关依据会在下文提到。


这其中当然还关乎很多细节,比如人脸数据是如何转为数字形式存储的,是否加密等。但其存储方式就决定了其安全等级与当代诺基亚 X6 这类手机在生物特征数据存储安全性方面存在差距。所以后来谷歌把这项功能移到了设置菜单的 Smart Lock 中,而不将其作为解锁手机的属性单独列项。


从诺基亚 X6 聊聊人脸解锁的安全性2


现在各 OEM 手机制造商所用的人脸解锁方案大部分也都不是谷歌集成在 Android 系统内的功能了。即便它们始终也没能迈过人脸识别第一阶段安全性的门槛,第二阶段的安全性却都清一色做了升级——但这也注定,Android 手机当前比较普遍的人脸解锁方案是很难应用于支付的,毕竟支付关乎金钱,它对于安全性的要求可比解个锁高多了(至少对普通人而言是如此),唯有第一阶段也做到苹果的程度,才有将其作为全局身份认证方案的基础。


如果不做具体工程,大概也很难比对 QSEE(高通的 TrustZone 方案)和苹果 Secure Enclave 谁更安全,所以就第二阶段,Android 手机和 iPhone 的安全性比较也就说不清楚了。但至少,它们的大体思路是一样的,就是把生物特征数据加密后存在 CPU 的这个“黑匣子”里,别说其它 App 撬不开,连系统自己也拿不到里面的数据——这就是一种进步。


实际上我们之所以说 Android 4.0 时代的人脸解锁在安全性方面还很原始,有一则依据是直到 2013 年下半年 Android 4.3 果冻豆的推出,谷歌才在 API 文档中首次提及硬件级别的证书存储(Hardware credential storage)[2],说句人话就是 KeyChain 证书现在可以存储在专有的硬件中了(好像也不是人话...),极为敏感的身份凭证,比如密钥这种东西就会更安全。谷歌也是第一次在开发者文档中提到了 TrustZone,“即便是操作系统内核也无法访问(存储在其中的)密钥资料”。


从诺基亚 X6 聊聊人脸解锁的安全性2


从这个版本的系统开始,Android Key Store 密钥存储,对于存储和使用 app 私钥才有了公开的 API——早前的系统其实也可以实现,只不过并没有得到谷歌的正式支持。系统甚至在设置项中还支持检查证书存储是否受到手机的硬件支持,比如当时的 Nexus 4 就已经开始宣传高通内部的 TrustZone 了,而更早一代的 Galaxy Nexus 在证书存储的问题上仍然只支持软件上的实现(德州仪器的 SoC?)[3]。其实我们把这里的“证书”译作“身份凭证”可能更便于理解,人脸或指纹解锁中的人脸和指纹数据,就是一种身份凭证(即便可能和实质上的 credential 还是不一样,或成为独立的子系统),它们放在哪个位置显然是很重要的。


(注:但我也不能下结论说,Android 4.3 之前的解锁凭证没有受到硬件级别的保护;另外可能还需要对 Android 系统后来的全盘加密做更进一步研究。这里简单聊一聊,Android 系统的全盘加密是从 5.0 时代开始受到支持的,这其中涉及到的各类密钥和加密过程比较复杂。设备解锁启用的 PIN 码、密码、解锁图案都属于全盘加密(以及文件级别加密)的组成部分,而不仅是很多人以为的某个简单的通行证而已。详情可以参见 Android 安全文档[4]。


我们说“证书存储”,究竟存什么证书?实际上 Android 4.3 正式引入的这证书存储 API 主要用于存储例如 Wi-Fi 和 VPN 连接之类的证书(比如密钥),另外当然就是针对第三方 App 的证书。这个 API 支持生成和访问 App 私钥,为非系统 App 安全存储密钥提供了便利,开发者不需要再自己取实施密钥保护措施。就硬件支持的证书存储(TrustZone),即便有 root 权限也很难拿到其中的证书。

不过据此,我们至少可以认为,Android 4.3 之前的系统还罕有专门硬件支持的凭证存储。TrustZone 在此之前还没有被普遍认知,更不用谈生物特征数据是否存储在此位置)


用指纹或人脸解锁设备时,系统究竟在做什么?


其实我不知道诺基亚 X6 的人脸解锁用的是哪家的方案(诺基亚当前全系支持人脸解锁设备的手机应该都是同一套方案),可能并不是时下国内厂商普遍流行的 Face++(旷视)。而且我在网上找 Face++ 的方案细节也一无所获(哭,不会做逆向的悲哀)。但 Face++ 的方案在生物特征数据存储上基于 TrustZone 也是可以确认的。


这里我们只能借用 iOS 系统的 Touch ID 和 Face ID 来简单地管中窥豹了[6](Android 的安全文档实际上也有指纹识别方面的内容),iOS 的安全白皮书相对简要地谈到人脸解锁识别和支付的过程。人脸解锁和支付的过程,其实并不像很多人想象得那么简单,就是把两份数据简单比对一下,看看是否匹配,匹配就解锁或支付——因为如果真的这么做,安全性会成为一个巨大的问题。


从诺基亚 X6 聊聊人脸解锁的安全性2


先聊聊 Touch ID,毕竟就生物特征数据的存储,总体上它和 Face ID 应该是差不多的。这部分有点绕:就 iPhone 而言,Touch ID 是几乎直接和处理器的 Secure Enclave 进行通讯的。苹果的处理器与 Touch ID 指纹识别传感器的通讯是通过串行外围接口(SPI)总线进行的,处理器随后把 Touch ID 获得的数据转给 Secure Enclave,处理器自己的“普通世界”是无法阅读这部分数据的。每台 iPhone 设备的 Touch ID 传感器都会与对应的处理器 Secure Enclave 最初都会有个共享密钥(出厂时就有的,且每台设备都不一样),两者会利用这个共享密钥再协商一个会话密钥——这个会话密钥对刚才获取的指纹数据进行加密和认证。


另外,两者的会话密钥的交换过程也是加密的,而这里用于加密交换过程的 AES 密钥还会有一重外衣,这层外衣由 Touch ID 传感器和 Secure Enclave 分别提供的随机密钥构建起来,传输再采用 AES-CCM 传输加密。


说得这么绕,讲句人话其实也就是 Touch ID 的指纹数据的传输和存储经过了层层加密、各种加密,才在 Secure Enclave 中落地,即便或许在你的使用过程中,只是一瞬间的事情。


从诺基亚 X6 聊聊人脸解锁的安全性2


不好意思,一激动又装了个逼。上面这两段都是次要的,也不是我们这篇文章要讨论的问题,毕竟它们更偏向于前文提到的“第一阶段”的安全性。不过在 Face ID 的阐述中,苹果并未言明相关脸部数据的“传输”通道是如何保证安全性的,对应于 Touch ID 的传输(传感器和处理器之间的通讯)经过了层层加密;毕竟后续“脸部数据”的数字化表达(mathematical representation)和加密都是在 Secure Enclave 内部进行的,前期的传输过程如何是未知的(以及除了前置摄像头意外,其他传感器是如何与处理器进行通讯的)。我们猜测,2D 图像和深度图顺序的随机化,或许可以抵御针对传输过程的攻击。


从诺基亚 X6 聊聊人脸解锁的安全性2


实际上,和前文 Android 证书存储部分所述的一样,利用 Touch ID 和 Face ID 进行手机“解锁”,它们并不只是单纯充当通行证的角色,匹配正确了就让你进手机阶段。生物特征数据,或者我们设置的解锁密码、PIN 之类,本质上都会参与设备上的各种加密操作,比如 Android 5.0 之后的全盘加密,以及 iOS 设备上的数据防护。有关这部分内容,还可以参见我早前写的另一篇文章《内置加密芯片的金立M6,真的是“最安全”的手机吗?咱来聊聊TrustZone》。


iOS 的数据防护(Data Protection,包括文件加密)当然也有最高级别的密钥,这些密钥是存在 Secure Enclave 中的。如果我们开启人脸或指纹识别,在我们关闭屏幕之后,设备不会丢弃这些密钥。这些密钥会再用一个密钥进行加密操作,然后把它们交给 Touch ID 或 Face ID 子系统。当我们去解锁设备,并且成功匹配,则 Touch ID 或 Face ID 就会交还一个密钥,用于解密数据防护的密钥。如果设备重启,上面提到的这些密钥会丢失,Secure Enclave 也丢弃了这些密钥(也包括 48 小时我们都没有去使用设备的情况下),所以我们需要重新输入解锁密码。


所以简单的一个解锁设备的操作,其后系统忙里忙外做的事情可是相当多样的。我虽然没有仔细阅读 Android 在这部分的设定,加密解密的细节可能会存在较大差异,但整体思路差不多也会是这样——但 Android 的人脸解锁估计并不参与这部分操作,因为 Android 安全文档的身份验证章节中并没有提到人脸解锁。所以有可能 Android 当前的人脸解锁还真的主要停留在进入系统的“通行证”功能的层级上(欢迎反驳)。


有关支付的巧妙操作


最后咱来聊聊生物特征识别,在支付行为中扮演什么角色。某一类生物特征识别的支付,或者关乎金融操作(比如取款)的方案其实是很不安全的,比如很多银行为了方便用户进行金融方面的操作,要用户到银行去录入指纹,以后取钱不用密码,用指纹就可以。这种模型是一个“中心化”的模型,即指纹数据是集中存储在一个中央机构的,如果说有黑客用各种手段攻破了服务器防线,获取到了这些数据,那么就意味着上亿用户的生物特征数据被窃取(即便或许其他攻击方式可能会更经济)。


大部分消费类媒体都不止一次地提到,生物特征数据的一次破解,就意味着终生破解,毕竟生物特征(包括指纹、掌纹、声纹、心跳等)具有稳定、不可更改、不可抛弃的特点。这和设置字符密码是不同的,毕竟如果密码被暴力破解了,我们大不了改一个。所以中心化的生物特征识别支付操作是非常不安全的。


从诺基亚 X6 聊聊人脸解锁的安全性2


FIDO 联盟(Fast Identity Online)2015 年就提出过一个参考标准[7],而且是与 TrustZone 打配合的。其中 UAF(Universal Authentication Framework)标准的扩展提到过这么一套方案:比如利用指纹或人脸来支付的场景,设备生成公钥和私钥(两者自然是配对的关系)——针对用户、设备及卖家(也就是购物网站)。卖家那边仅持有公钥,买家持有私钥——这个私钥当然也是加密存储在 TrustZone 中的。买东西的时候,如果私钥能够与公钥匹配,则完成支付操作。


可能很多人以为私钥就是指纹或人脸了,但实际情况是私钥是加密存储的,指纹、人脸这样的生物特征只不过是用来解密私钥的一个因素(也就是说指纹、人脸只是获得私钥的一个必要途径)。这样一来,生物特征数据只参与解密私钥,而且不可或缺,还不会在网络上传输,安全性自然就和前面提到的那些银行的操作不同了。


现如今用指纹进行支付的场景已经随处可见了,包括 Android 手机也能用指纹完成支付。但就像文章第一部分说的,Android 手机至今都没能很好地解决人脸识别关乎的第一阶段的安全性,所以用人脸来支付在 Android 设备上依旧任重而道远。

来源:周三科技  文|欧阳洋葱  部分内容有删减  维修狮 整理发布从诺基亚 X6 聊聊人脸解锁的安全性2

从诺基亚 X6 聊聊人脸解锁的安全性2

领导说,小编工资已与下方广告挂钩,点击一次涨0.5元!

原文始发于微信公众号(维修狮):从诺基亚 X6 聊聊人脸解锁的安全性2

发表评论

您必须登录才能发表评论!