[Android][FRP]Factory Reset Protection

Pass:本文有部分截图摘选自CSDN博友画图以及google/qcom文档,由于是上一年写的文章,所以暂时未能提供出处

Factory Reset Protection

功能介绍:

Google FRP,google的账户锁,全称factory reset protection,在android 5.x以后释放的功能,为减少手机被偷走的概率,该功能由google研发并提供接口,用户在使用的时候必须具备三个条件:
1.设备支持google认证
2.不能修改该方案核心功能
3.设备能连接网络进行认证
4.添加一个屏幕锁

触发原理:

当登陆了google账户后,在未退出google账户就使用了recovery或者fastboot命令回复了出厂设置的情况下,造成开机需要连网输入回复出场设置前登陆的google账户,无法跳过setupwirzd的问题,导致kill-switch,一键锁死,限制新用户注册本机,未经验证的新用户无法刷机

kill-switch工具原理:

该工具貌似供应商会提供,不过大部分由OEM自行维护,功能比较简单,其主要作用是擦除用户数据和擦除config/userdata分区

工具的原理类似于FactoryReset,通过该工具,发送boot-recovery命令进入recovery mode。再发送recovery-wipe-data命令来擦除config和userdata分区,具体发送的命令如下:

             memset(&btMsg,0x00,sizeof(bootloader_message));


                strcpy(btMsg.command,"boot-recovery");


                strcpy(btMsg.recovery , "recovery\n--wipe_data");


                if (!emmcModel.WriteProgram_fh("misc", (char*)&btMsg, partitions[i].first_lba, 1, 0))

FRP和正常factoryReset的差别(也就是该功能作用的意义)

首先,我们要理解信任回复和非信任回复的差别,在Android中,回复出厂设置可以分为:可信任回复  && 不可信任回复

在android中唯一的可信任回复方式:在setting界面中选择恢复出厂设置

通过其余方式(比如recovery双清分区,抑或远程通过google账户登录google play servicer清除用户数据等)都为不可信任回复

So,该功能的意义在于,假如登录了google账号的手机被不可信任回复给reset了,Android会在开机引导界面setupwirzd处会要求验证google账户来确定机主身份,负责不能跳过这个界面,等于软件性的变砖

那么两个reset的原理在于,可信任回复,会连存储google账号的config分区和PersistentDataBlockManager等数据,而不可信任回复不会

FRP实现代码原理:

很遗憾的告诉各位,该功能是由google提供,对第三方隐藏,所以没有源码分析

Google提供了一个实现方式的参考方案。参考实现包括两部分:一个API,用于在功能过程中存储数据,一个是GMS模块,用于将谷歌特定数据写入此平台服务。虽然该功能的实现的大部分是在Google play service,OEM可以参考平台API包含在:
 
android.service.persistentdata.PersistentDataBlockManager

所以可以理解,google提供了一个上层接口给OEM:PersistentDataBlockManager


当创建有一个google账户时,FRP会创建一个重置的标志位和key保存在这个block里面,可以用通过其他的android设备登陆你的google账户定位或者锁定,远程清空手机,回复出场设置等

上层逻辑原理:

(参考qcom源码:frameworks/base/services/core/java/com/android/server/PersistentDataBlockService.java)

[Android][FRP]Factory Reset Protection_第1张图片

(注:该图转载自CSDN博友所画流程图,由于时间太久,暂时不能提供出处)

如上图,其中最为关键的是Account Data Blocks,其实就是一个独立的存储分区(500kb),该分区在fatctory reset时不能进入,通过系统中的ro.frp.pst来制定该分区的路劲(通常默认的路劲都是/dev/block),对其的R/W操作是通过API——也就是android.service.persistentdata.PersistentDataBlockManager来操作的


值得注意的是:

FRP功能存在于任何登录了google账号以及打开了oem unlock功能的手机上。(oem-unlock功能存在于开发者选项中,默认是enable的,据了解该功能也是google开发,主要用处在于lock bootloader镜像)分区的最后一个字节应该用于信号的OEM-UNLOCK状态。如果字节为0,OEM-UNLOCK位DISABLE。即,当此字节设置为0,​fastboot oem unlock应该​失败。 该字节必须在出厂时设置为0。enable/disbale OEM-UNLOCK只能通过PersistentDataBlockManager这个API来更改(相当于更改分区最后一byte)。


(本来这个博客是想保存和记录工作三年来自行学习记录下的历程和工作经验,同时也可以给有需要的朋友做个简介,文档中可能会出现的错别字等小问题请忽略,如果涉及原理性的问题,请留言告知,不慎感激)


你可能感兴趣的:(Security)