Android - Factory Reset Protection(FRP)

Purpose:

Google want to “reduce the value of a stolen device” by factory reset protection

可选性:

GMS强制要求frp,依赖于Google Play Service 6.7.x+

如何打开该功能:

当且仅且满足如下条件:

Google Account exists on a device
OEM locked (Settings->Developer Option)

时,frp会打开。默认打开。

需要一个raw分区, 指定frp分区(factory reset protection)

ro.frp.pst=/dev/block/platform/sdhci-tegra.3/by-name/PST
ro.frp.pst=/dev/block/platform/msm_sdcc.1/by-name/frp

shamu:

PRODUCT_PROPERTY_OVERRIDES += \
    ro.frp.pst=/dev/block/platform/msm_sdcc.1/by-name/frp

大小:500K-2M
格式: raw
权限:只有指定的system进程可以访问。用overlay配置config_persistentDataPackageName, 用GMS的话就是com.google.android.gms
分区最后一个byte用来指定OEM lock状态。0 - locked (fastboot oem unlock执行会失败)。工厂必须默认0.

功能:

  • 只要有google账户,有网络,就可以远程通过Android Device Manager(ADM)锁屏
  • frp打开后,如下操作会提示密码:在主用户上添加google账户;删除最后一个google账户
  • frp打开后,只有在Settings下做factory reset才会清除reset token,重新打开setup wizard时才不需要密码 (trusted factory reset)
  • frp打开后,bootloader下或者ADM下做factory reset不会清除reset token,重新打开setup wizard时会提示输入密码。 (untrusted factory reset), 只要输入的账户/密码符合之前任意一个google账户即可。

术语

Trusted Factory Reset:指的是PersistentDataBlockService#wipe(),实际上就是ioctl(fd, BLKSECDISCARD, &range)

实现

Platform API:存储frp数据PersistentDataBlockManager
GMS core module:在分区上写入google自己数据

API

  • IPersistentDataBlockService.aidl
    service
  • PersistentDataBlockManager.java
  • PersistentDataBlockService.java
  • com_android_server_PersistentDataBlockService.cpp

用户设置:

Setting需要如下权限:”android.permission.OEM_UNLOCK_STATE”

D/PersistentNotificationBroadcastReceiver( 1198): Received intent: Intent { act=android.intent.action.BOOT_COMPLETED flg=0x8000010 cmp=com.google.android.gms/.common.notification.PersistentNotificationBroadcastReceiver (has extras) }