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

ほとんどの Android デバイスはデフォルトで、ブートローダーがロックされた状態で出荷されるため、ユーザーはブートローダーまたはデバイス パーティションをフラッシュできません。必要に応じて、(開発者向けオプションを有効にしているデバイス ユーザーは)ブートローダーをロック解除して、新しいイメージをフラッシュできます。

ブートローダーを開く

fastboot コマンドを発行するには、ブートローダー モードを開く必要があります。その方法の 1 つは、adb コマンド adb reboot bootloader を送信します。一部のスマートフォンでは、デバイスの起動中に特定のキーの組み合わせ(通常は音量小)を押すことで、ブートローダー モードで再起動することもできます。

ブートローダーのロックを解除する

ブートローダー モードを開いた後で、ブートローダーをロック解除してパーティションの再フラッシュを有効にするには、デバイスで fastboot flashing unlock コマンドを実行します。設定すると、再起動を行ってもロック解除モードが維持されます。

get_unlock_ability1 に設定されている場合を除き、fastboot flashing unlock コマンドはデバイスで拒否されます。0 に設定されている場合、ユーザーはホーム画面に移動し、[設定] > [システム] > [開発者向けオプション] メニューを開き、[OEM ロック解除] オプションを有効にする必要があります(これにより get_unlock_ability1 に設定されます)。設定すると、再起動やデータの初期化を行ってもモードが維持されます。

fastboot flashing unlock コマンドが送信されると、非公式のイメージによる問題が発生する可能性についての警告が表示されます。ユーザーが警告を確認した後、デバイスでは不正なデータアクセスを防ぐためにデータの初期化が行われます。ブートローダーは、デバイスを正しく再フォーマットできない場合でも、デバイスの初期化を行います。初期化を行った後にのみ、永続フラグを設定してデバイスの再フラッシュが可能になります。

まだ上書きされていない RAM はすべて fastboot flashing unlock プロセスで初期化されます。これにより、以前の起動から残りの RAM の内容を読み取る攻撃を防止できます。同様に、ロック解除されたデバイスでは、許容できない遅延が生じる場合を除き、毎回起動時に RAM を消去する必要があります。ただし、カーネルの ramoops に使用する領域は残す必要があります。

ブートローダーをロックする

ブートローダーをロックしてデバイスを初期化するには、デバイスで fastboot flashing lock コマンドを実行します。販売用のデバイスは、新しいシステムやブートイメージをインストールしようとする攻撃者によりデバイスが侵害されるのを確実に防ぐために、ロック状態(get_unlock_ability0 が返される)で出荷されています。

ロックとロック解除のプロパティを設定する

ro.oem_unlock_supported プロパティは、デバイスがロック解除のフラッシュに対応するかどうかに基づいてビルド時に設定する必要があります。

  • デバイスがロック解除のフラッシュに対応する場合は、ro.oem_unlock_supported1 に設定します。
  • デバイスがロック解除のフラッシュに対応しない場合は、ro.oem_unlock_supported0 に設定します。

デバイスがロック解除のフラッシュに対応している場合、ブートローダーはカーネル コマンドライン変数 androidboot.flash.locked1(ロックされている場合)、または 0(ロック解除されている場合)に設定することでロック状態を表します。この変数は、Android 12 のカーネル コマンドラインではなく、bootconfig で設定する必要があります。

dm-verity に対応しているデバイスの場合、ro.boot.verifiedbootstate を使用して ro.boot.flash.locked の値を 0 に設定します。これにより、確認付きブートの状態がオレンジであれば、ブートローダーがロック解除されます。

クリティカル セクションを保護する

デバイスは、クリティカル セクション(デバイスをブートローダーにブートするために必要なものとして定義)のロックとロック解除に対応している必要があります。このようなセクションとしては、ヒューズ、センサーハブの仮想パーティション、第 1 ステージのブートローダーなどが挙げられます。クリティカル セクションをロックするには、デバイスで実行されているコード(カーネル、リカバリ イメージ、OTA コードなど)がクリティカル セクションを意図的に変更できないようにするメカニズムを使用する必要があります。デバイスがロック クリティカル状態の場合、OTA はクリティカル セクションのアップデートに失敗します。

ロック状態からロック解除状態に移行するには、デバイスを物理的に操作する必要があります。この操作は、fastboot flashing unlock コマンドを実行した場合と似ていますが、ユーザーがデバイスの物理ボタンを押す必要があります。デバイスは、物理的な操作なしでプログラムによって lock critical から unlock critical に移行できないようにする必要があります。また、デバイスは出荷時に unlock critical 状態にしないでください。