🤯

TAB-A05-BDとBA1をいかにして攻略したのか パート2

2024/05/15に公開

TAB-A05-BDとTAB-A05-BA1がついにBLUができるようになりました。

Exploitの部分についてはまだ完全に理解できていないので、ExploitからいかにしてBLUにつなげたのかの部分になります。

そのためパート2から書き始めます。

まず、前提知識としてAndroidの標準実装でBLUがどのように行われているか調べていきましょう。

AOSP ブートローダーのロックとロック解除

まずOEMアンロックの解除 get_unlock_ability というフラグがあります。

このフラグは

[設定] > [システム] > [開発者向けオプション] メニューを開き、[OEM ロック解除]

と同期しています。基本的にはこのオプションを有効にすると

fastboot oem flashing unlock

によってBootloaderのUnlockが行えます。

ですが、こちらのオプションはandroid.service.oemlock.OemLockManagerにあるisOemUnlockAllowedByCarrierがfalseの場合グレーアウトされます。

例えばVRZから販売されているPixelシリーズや、国内でSIMロックがかかっているPixelシリーズではこのオプションがグレーアウトしています。

LineageOSの設定アプリの実装

LineageOSのOemLockManagerの実装

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によってサービスとして呼び出すことができます。

AIDL サービスの動的な実行

IOemLockService

service call oem_lock 1

このコマンドを発行することでIOemLockServiceのgetLockNameを実行できます。

ただしどちらも権限管理されており、MANAGE_USER_OEM_UNLOCK_STATEの権限が必要になります。

LineageOS での権限定義

    <permission android:name="android.permission.MANAGE_USER_OEM_UNLOCK_STATE"
        android:protectionLevel="signature|privileged" />

AOSP 権限の宣言について

signature|privilegedなのでシステムの鍵で署名されていないとこのサービス/APIは呼び出せません。

長くなりましたので残りはパート3で書きます。

Discussion