转载:蛋蛋读UFS之九:UFS数据安全
前面提到RPMB使用认证机制和抗重放攻击机制保障数据不被黑客攻击,除此之外,UFS还有其它一些手段来保护用户数据安全,这一章节我们来关注UFS数据安全。
UFS设备用来存储个人或者企业的数据信息,UFS设备需要这样一种机制,就是必要时,数据能永久从设备(闪存)删除,这样就能防止别有用心的人通过反向工程获取你的数据。
话说,陈老师吸取了上次教训,每次拍照后,事后“阅后即焚”。陈老师想:这样就没有人看到我们的照片了吧。陈老师很是得意。
没有想到,不久后网上又爆出陈老师新的“艳Zhao门”事件。陈老师很是纳闷,我不是明明都删除了吗??
我们帮陈老师分析一下为什么删了的照片还能被修手机的人弄出来。
手机文件系统把陈老师拍的照片数据用逻辑块管理,然后把这些逻辑块写到UFS设备的存储介质(如上图所示)。陈老师删除照片,删除的只是逻辑块数据,存在UFS存储介质上的数据还在原地,
如下图所示:
修手机的一看,这不陈老师吗?修手机的知道肯定能发现什么,嘴角不禁露出一丝不易觉察的笑。他从文件中没有找到照片,有点失望。小子吃一堑长一智呀!但猎奇的心不会让他轻易放弃的,有经验的他盯上了存储卡。功夫不负有心人,他从存储介质里把照片弄出来!
拍照不容易,且拍且珍惜。我们看看如何避免陈老师的悲剧。
注意,这个“擦除”操作不是擦除存储介质,不是闪存层面的擦除操作,而是UFS层面的擦除操作。数据写在闪存上,UFS设备内部有个逻辑地址到物理地址的映射,擦除操作通过切断这种映射,主机就不能获得擦除掉的数据。
当陈老师删除照片时,它切断了用户直接访问照片的途径:
当陈老师删除照片后,手机系统会通过发送UNMAP命令(就是通常说的TRIM)来告诉设备这些照片数据无效。设备收到该命令后,然后根据逻辑单元描述符中的bProvisioningType来确定执行具体操作。
bProvisioningType:
00h: Thin Provisioning is disabled (default)
02h: Thin Provisioning is enabled and TPRZ = 0 (Discard)
03h: Thin Provisioning is enabled and TPRZ = 1 (Erase)
即当bProvisioningType = 03h时,设备执行擦除操作,即切断逻辑地址到物理空间的映射。
一个逻辑块如果被UNMAP命令擦除(TRIM),那么主机访问这个逻辑块时,设备必须返回全0数据给主机。
注意,这个“擦除”操作(TRIM)不是擦除存储介质,只是主机让设备切断逻辑地址到物理地址的映射,因此不保证照片数据从闪存介质删除。但是,由于UFS设备知道该照片数据已经删除(没有逻辑块到物理空间的映射),在后续垃圾回收时,这些被删掉的数据很大概率会从介质上擦除掉。
和擦除操作类似,主机通过发送UNMAP命令来执行舍弃操作。当bProvisioningType = 02h时,设备执行舍弃操作。
舍弃操作和擦除操作的区别:主机访问一个被舍弃的逻辑块,可能获得任何数据,甚至包括舍弃前的数据,而擦除操作是主机获得全0数据。也就是说,对删除的照片,如果UFS设备执行的是舍弃操作,那么主机还可能获得原图片;如果UFS设备执行的是擦除操作,通过主机不可能直接再获得原照片。
但不管是舍弃操作还是擦除操作,都不能保证照片从存储介质上删除。像修手机这样的人,它不走寻常路(通过手机系统),直接操作闪存的话,还是有可能把删除的照片找回来。
陈老师看到这里,急了,难道我以后再也不能拍照了吗??
别急,小陈!你先坐下,听我慢慢讲。
陈老师,有三种可选策略用以安全清除数据,你造吗?
1. 设备控制器擦除(Erase):要 删除的逻辑块 所对应的 物理地址空间;
2. 设备控制器用单一字符覆盖写要被删除的逻辑块所对应的物理地址空间,然后擦除设备;
3. 设备控制器用单一字符、字符补码和随机字符,依次覆盖写要被删除的逻辑块所对应的物理地址空间。
又是覆盖写,又是擦除,照片是彻底从闪存中删除了。
陈老师听到这里,情绪缓和下来,终于是坐了下来。
清除操作是针对垃圾数据(比如陈老师删除的照片),让这些数据不仅不能通过正规渠道(操作系统)访问,还让这些数据无法从存储介质中获取,彻底把垃圾数据从UFS设备清除掉。
前面所说的擦除(trim)和舍弃(discard) 操作,都是主机通过命令层的 UNMAP 命令来实施的。而 清除 操作则是主机通过设备管理器的 Query 功能来告诉设备的。
这里涉及到一个重要的标志(flag)和一个重要的属性(Attribute),分别是发fPurgeEnable 和 bPurgeStatus,前者用以使能/禁止清除操作,后者用以设备向主机提供清除操作的状态信息。
fPurgeEnable:
如果主机想终止设备执行清除操作,可以通过清除该标志达到目的。
bPurgeStatus:
主机为了让设备执行清除操作,主机通过QUERY REQUEST UPIU设置fPurgeEnable = 1。如果当前逻辑单元的命令队列中没有任何命令,设备会执行清除操作。一旦设备开始执行清除操作,它不会响应主机发来的任何命令。如果这个时候主机需要让设备紧急响应命令,主机首先应该通过QUERY REQUEST UPIU设置fPurgeEnable = 0来提前终止设备的清除操作,然后再发送命令。
下图是清除操作的状态机图:
UFS设备在执行清除(purge)操作时,对那些垃圾数据,有以下几种处理方式:
这些手段前面已经介绍过。
主机通过发送FORMAT UNIT命令格式化所有的逻辑单元(RPMB LU除外)。不过,对那些写保护的逻辑单元,FORMAT UNIT 命令会失败。
FORMAT UNIT 的命令对象是Device well know LU,它格式化除RPMB之外所有无写保护的逻辑单元。
FORMAT UNIT 只会切断逻辑块到物理空间的映射。但如果要让数据彻底从设备上清除,UFS设备还需要执行Purge操作,这样数据才能彻底删除。
前面都是千方百计的清除数据,但有时候UFS设备需要保护写的数据。
每个逻辑逻辑单元(除了RPMB)有写保护属性。写保护包括永久写保护和上电写保护,前者的意思是说,一旦该逻辑单元写保护使能,将终生是写保护(不能改回去了);而后者写保护只对某次上电有效,如果设备重上电或者重启,写保护将失效。
最后总结一下UFS数据安全机制:
RPMB,提供数据认证和抗重放攻击机制保护一些重要数据,请参看RPMB章节。