TAB-A05-BDとBA1をいかにして攻略したのか パート2
TAB-A05-BDとTAB-A05-BA1がついにBLUができるようになりました。
Exploitの部分についてはまだ完全に理解できていないので、ExploitからいかにしてBLUにつなげたのかの部分になります。
そのためパート2から書き始めます。
まず、前提知識としてAndroidの標準実装でBLUがどのように行われているか調べていきましょう。
まずOEMアンロックの解除 get_unlock_ability というフラグがあります。
このフラグは
[設定] > [システム] > [開発者向けオプション] メニューを開き、[OEM ロック解除]
と同期しています。基本的にはこのオプションを有効にすると
fastboot oem flashing unlock
によってBootloaderのUnlockが行えます。
ですが、こちらのオプションはandroid.service.oemlock.OemLockManagerにあるisOemUnlockAllowedByCarrierがfalseの場合グレーアウトされます。
例えばVRZから販売されているPixelシリーズや、国内でSIMロックがかかっているPixelシリーズではこのオプションがグレーアウトしています。
isOemUnlockAllowedByCarrierをtrueにする関数はあるのですが
@RequiresPermission[android.Manifest.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE]
public void setOemUnlockAllowedByCarrier[boolean allowed, @Nullable byte[] signature] {
try {
mService.setOemUnlockAllowedByCarrier[allowed, signature];
} catch [RemoteException e] {
throw e.rethrowFromSystemServer[];
}
}
signatureが引数として要求されます。
とはいえ、isOemUnlockAllowedByCarrierがチェックされるのは画面にボタンをだす場合のみであるため、これを迂回してget_unlock_abilityをtrueにすればBootloaderのUnlockが行えます。
@RequiresPermission[android.Manifest.permission.MANAGE_USER_OEM_UNLOCK_STATE]
public boolean isOemUnlockAllowedByUser[] {
try {
return mService.isOemUnlockAllowedByUser[];
} catch [RemoteException e] {
throw e.rethrowFromSystemServer[];
}
}
そしてこれらはAIDLによってサービスとして呼び出すことができます。
service call oem_lock 1
このコマンドを発行することでIOemLockServiceのgetLockNameを実行できます。
ただしどちらも権限管理されており、MANAGE_USER_OEM_UNLOCK_STATEの権限が必要になります。
<permission android:name="android.permission.MANAGE_USER_OEM_UNLOCK_STATE"
android:protectionLevel="signature|privileged" />
signature|privilegedなのでシステムの鍵で署名されていないとこのサービス/APIは呼び出せません。
長くなりましたので残りはパート3で書きます。
Discussion