Full-Disk Encryption

Full-disk Encryption は、Android デバイス上のすべてのユーザー データを暗号化キーを使用してエンコードする処理です。 デバイスが暗号化されると、ユーザーが作成したすべてのデータは、ディスクにコミットする前に自動的に暗号化され、すべての読み取りは、呼び出しプロセスにデータを返す前に自動的に復号化されます。

フルディスク暗号化は 4.4 で Android に導入されましたが、Android 5.0 ではこれらの新機能が導入されました:

  • 高速暗号化は、最初の起動時間が長くなるのを避けるためにデータ パーティションの使用ブロックのみを暗号化して作成されました。 現在、ext4 および f2fs ファイルシステムのみが高速な暗号化をサポートしています。
  • 初回起動時に暗号化するための forceencrypt fstab フラグを追加しました。
  • パスワードなしのパターンと暗号化のサポートを追加しました。
  • Trusted Execution Environment (TEE) の署名機能 (TrustZone など) を使用した、暗号化キーのハードウェアバックアップされたストレージを追加しました。 詳しくは、暗号化キーの保存を参照してください。

注意。 注意:Android 5.0にアップグレードして暗号化されたデバイスは、工場出荷時のデータリセットにより暗号化されていない状態に戻る可能性があります。

How Android full-disk encryption works

Android full-disk encryption is based on dm-crypt, which is a kernelfeature that works at the block device layer. このため、暗号化は、ブロックデバイスとしてカーネルに自分自身を提示Embedded MultiMediaCard(eMMC)とsimilarフラッシュデバイスで動作します。 暗号化は、rawNANDフラッシュチップと直接対話するYAFFSでは不可能です。

暗号化アルゴリズムは128 Advanced Encryption Standard (AES) withcipher-block chaining (CBC) and ESSIV:SHA256を使用します。 マスターキーは、OpenSSLライブラリの呼び出しにより128ビットAESで暗号化されます。 鍵は128ビット以上を使用する必要があります(256ビットはオプション)。

Note: OEM はマスター キーを暗号化するのに 128 ビット以上を使用できます。

  • デフォルト
  • ピン
  • パスワード
  • パターン

最初の起動時に、デバイスはランダムに生成された128ビットマスターキーを作り、デフォルトパスワードと保存されているソルトでハッシュ化します。 デフォルトのパスワードは「default_password」ですが、結果のハッシュは TEE (TrustZone など) を通して署名され、署名のハッシュを使用してマスター キーを暗号化します。

デフォルトパスワードは、Android オープン ソース プロジェクト cryptfs.cppfile に定義されています。 (つまり、ユーザーのPIN/パス/パターンの変更は、ユーザーデータの再暗号化を引き起こしません。) 管理されたデバイスは、PIN、パターン、またはパスワードの制限の対象となる可能性があることに注意してください。 システムの他の部分は、ステータスの報告、パスワードの要求、致命的なエラーの場合の工場出荷時のプロンプトなどのタスクを実行するために、プロパティも参照します。 voldの暗号化機能を呼び出すために、システムはコマンドライン・ツールvdccryptfsコマンドを使用します。 checkpw,restart,enablecrypto,changepw,cryptocomplete,verifypw,setfield,getfield,mountdefaultencrypted,getpwtype,getpw,clearpw.

暗号化、復号、ワイプするには /data をマウントしてはいけない。 しかし、ユーザー インターフェイス (UI) を表示するには、フレームワークが起動し、フレームワークが /data を実行する必要があります。 この難問を解決するために、一時ファイルシステムを/dataにマウントします。これにより、Androidは必要に応じてパスワードを要求したり、進捗状況を表示したり、データ消去を提案したりすることができます。 しかし、一時ファイルシステムから本当の/dataファイルシステムに切り替えるために、システムは一時ファイルシステム上でファイルを開いているすべてのプロセスを停止し、本当の/dataファイルシステム上でそれらのプロセスを再起動しなければならないという制限を課せられています。 これを行うには、すべてのサービスが3つのグループのいずれかに属している必要があります。

  • core: 起動後にシャットダウンしない。
  • main: シャットダウンし、ディスクパスワード入力後に再起動します。
  • late_start:

これらのアクションをトリガするために、vold.decrypt プロパティに様々な文字列が設定されます。

  • class_start: サービスを再起動します。
  • class_stop: サービスを停止し、SVC_DISABLED フラグを追加します。 停止したサービスはclass_startに応答しません。
  • フロー

    暗号化されたデバイスには、4つのフローが存在します。 デバイスは一度だけ暗号化され、その後は通常のブートフローをたどります。

    • 以前に暗号化されていないデバイスを暗号化する。
      • forceencryptで新しいデバイスを暗号化します。 最初のブート時に暗号化を必須とする (Android L から)。
      • 既存のデバイスを暗号化します。 ユーザー主導の暗号化 (Android K およびそれ以前)。
    • 暗号化されたデバイスをブートします。
      • Starting an encrypted device with no password: パスワードが設定されていない暗号化デバイスを起動する (Android 5.0 以降のデバイスに関連)。
      • Starting an encrypted device with a password: セットされたパスワードを持つ暗号化されたデバイスを起動します。

      これらのフローに加えて、デバイスが暗号化に失敗することもあります/data。それぞれのフローを以下に詳しく説明します。

      Encrypt a new device with forceencrypt

      これは Android 5.0 の通常の最初のブートにあたります。

      1. Detect unencrypted filesystem with forceencrypt flag

        /data is not encrypted but needs to be because forceencrypt mandates it.Unmount /data.This is normal first boot for Android 5.0 device.

        1. Detect unencrypted filesystem with forceencrypt flag/data with forceencrypt commandes.
        2. /data

          vold.decrypt = "trigger_encryption" の暗号化を開始すると、init.rc が起動し、vold がパスワードなしで /data を暗号化します (新しいデバイスであるため None が設定されています。)。)

        3. Mount tmpfs

          vold は tmpfs /data をマウントし (ro.crypto.tmpfs_options の tmpfs オプションを使用)、プロパティ vold.encrypt_progress を 0 に設定します。vold は暗号化されたシステムを起動するために tmpfs /data を準備し、プロパティ vold.decrypt を設定します。 trigger_restart_min_framework

        4. Bring up framework to show progress

          デバイスには暗号化するデータがほとんどないため、暗号化が非常に速く行われるため、プログレスバーが実際に表示されないことがよくあります。

        5. /data が暗号化されたら、フレームワークを停止して

          vold vold.decrypttrigger_default_encryption に設定し、defaultcrypto サービスを開始します。 (trigger_default_encryption/dataがパスワード付きで暗号化されているか、パスワードなしで暗号化されているかを確認するために、暗号化のタイプをチェックします。 Android 5.0 デバイスは初回起動時に暗号化されるため、パスワードは設定されていないはずです。したがって、復号化して /data をマウントします。

        6. Mount /data

          init は、/data を tmpfs RAMDisk 上にマウントし、ro.crypto.tmpfs_options から拾ったパラメーターは init.rc で設定されているものとします。

        7. Start framework

          Set vold to trigger_restart_framework, whichcontontinue the usual boot process.これは、通常のブートプロセスを継続します。

        Encrypt an existing device

        L に移行された暗号化されていない Android K 以前のデバイスを暗号化すると、このようなことが起こります。 ユーザーがデバイスの暗号化を選択すると、UIはthebatteryが完全に充電され、ACアダプタが接続されていることを確認し、暗号化プロセスを完了するのに十分な電力があることを確認します。 警告: 暗号化が完了する前にデバイスの電源が切れ、シャットダウンした場合、ファイル データは部分的に暗号化された状態で残ります。

        インプレース暗号化を有効にするには、voldループを開始し、リアルブロックデバイスの各セクタを読み取り、それを暗号ブロックデバイスに書き込むようにします。 voldでは、読み書きの前にセクタが使用中であるかどうかを確認するため、データがほとんどない新しいデバイスでも暗号化を高速に実行できます。

        デバイスの状態。

        1. Check password

          UI はコマンド cryptfs enablecrypto inplacevold を呼び出し、passwd はユーザーのロック画面のパスワードです。

        2. Take down the framework

          vold はエラーがないかチェックし、暗号化できない場合は -1を返し、ログに理由を記録します。 暗号化できる場合は、プロパティ vold.decrypttrigger_shutdown_framework に設定する。 これにより、init.rcはクラスlate_startmainのサービスを停止させる。

        3. 暗号フッターの作成
        4. パンくずファイルの作成
        5. 再起動
        6. パンくずファイルの検出
        7. 暗号化の開始 /data

          vold次に暗号マッピングをセットアップする。 これは、実際のブロックデバイスにマッピングする仮想の暗号ブロックデバイスを作成するが、書き込む際に各セクタを暗号化し、読み込む際に各セクタを復号化するものである。 vold は、暗号化メタデータを作成し、書き出します。

        8. 暗号化中に、mount tmpfs

          vold は tmpfs /data をマウントし (ro.crypto.tmpfs_options の tmpfs オプションを使用)、プロパティ vold.encrypt_progress を 0 に設定します。vold では暗号化システムのブートに備えて tmpfs/data を用意し、プロパティvold.decrypt に設定しています。 trigger_restart_min_framework

        9. Bring up framework to show progress

          trigger_restart_min_framework causes init.rc to start the main class of services.を起動します。 暗号化ループは、パーティションの別のパーセントを暗号化するたびに vold.encrypt_progress を更新します。

        10. When /data is encrypted, update the crypto footer

          When /data is successfully encrypted, vold clearsthe the flag ENCRYPTION_IN_PROGRESS in the metadata.

          デバイスのロック解除に成功すると、パスワードがマスターキーの暗号化に使用され、crypto footerが更新されます。

          何らかの理由で再起動に失敗すると、voldはプロパティvold.encrypt_progresserror_reboot_failedに設定して、UIに再起動するためのボタンをユーザーに押すように求めるメッセージが表示されるはずです。 Android 5.0 デバイスは初回起動時に暗号化されるため、パスワードの設定はないはずで、したがって、これがデフォルトの暗号化状態です。

          1. Detect encrypted /data with no password

            Detect the Android device is encrypted because /dataannot be mounted and one of the flags encryptable or forceencrypt is set.

            vold sets vold.decrypt totrigger_default_encryption, which starts the defaultcrypto service.Detect the Android devices with no password.Detect the Android devices is encrypted. trigger_default_encryptionは暗号化のタイプをチェックし、/dataがパスワード付きかパスワードなしかを確認する。

          2. Decrypt /data

            Creates the dm-crypt device over the block device so the device is ready for use.

          3. Mount /data

            vold then mount the decrypted real /data partition and then prepares the new partition.これは、暗号化解除された本物の /data パーティションをマウントし、新たなパーティションを準備します。 プロパティvold.post_fs_data_doneを0に設定し、vold.decrypttrigger_post_fs_dataに設定します。 これにより、init.rcpost-fs-data コマンドを実行します。 これらは必要なディレクトリやリンクを作成し、vold.post_fs_data_done を 1 に設定します。

            vold がこのプロパティに 1 を見つけると、プロパティ vold.decrypt を設定します。 trigger_restart_framework. これにより、init.rc は再び main クラスのサービスを開始し、起動以来初めて late_start クラスのサービスも開始します。

          4. Start framework

            これで、フレームワークは復号された /data を使用してすべてのサービスを起動し、システムは使用できるようになりました。

          Starting an encrypted device without default encryption

          setpassword を持つ暗号化デバイスを起動すると、このようなことが起こります。 デバイスのパスワードは、ピン、パターン、またはパスワードです。

          1. Detect encrypted device with a password

            Detect that the Android device is encrypted because the flagro.crypto.state = "encrypted"

            vold sets vold.decrypt totrigger_restart_min_framework because /data isencrypted with a password.

          2. Mount tmpfs

            init sets five properties to save the initial mount optionsgiven for /data with parameters passed from init.rc.This is what happens to boot up the encrypted device with password.vold はこれらのプロパティを使用して、暗号マッピングを設定します。

            1. ro.crypto.fs_type
            2. ro.crypto.fs_real_blkdev
            3. ro.crypto.fs_mnt_point
            4. ro.crypto.fs_options
            5. ro.crypto.fs_flags (0x で始まる8桁の16進数)
          3. Start framework to prompt for password

            framework が起動すると vold.decrypttrigger_restart_min_framework と設定されていることが確認できます。 これは、フレームワークが tmpfs /data ディスク上で起動しており、ユーザーパスワードを取得する必要があることを伝えます。

            しかしながら、最初に、ディスクが適切に暗号化されていることを確認する必要があります。 voldは暗号化が正常に完了した場合は0、内部エラーの場合は-1、暗号化が正常に完了しなかった場合は-2を返します。 voldは、暗号化メタデータでCRYPTO_ENCRYPTION_IN_PROGRESSフラグを検索することでこれを判断します。 設定されている場合、暗号化プロセスは中断され、デバイスにネーザブルなデータが存在する。 vold がエラーを返した場合、UI はユーザーにデバイスの再起動と工場出荷時のリセットを促すメッセージを表示し、そのために押すボタンを表示します。

          4. Decrypt data with password

            cryptfs cryptocomplete が成功すると、ディスクパスワードを要求する UI がフレームワークに表示されます。 UIはcryptfs checkpwからvoldにコマンドを送信してパスワードを確認する。 パスワードが正しい場合(暗号化された/dataを一時的にマウントし、その後アンマウントすることで判断されます)、voldは暗号化解除されたブロックデバイスの名前をプロパティro.crypto.fs_crypto_blkdevに保存し、ステータス0をUIに返します。

          5. Stop framework

            UIは、暗号ブートグラフィックを表示し、コマンドcryptfs restartvoldを呼び出します。 voldはプロパティvold.decrypttrigger_reset_mainに設定し、init.rcclass_reset mainを実行させます。 これにより、メイン・クラスのすべてのサービスが停止し、tmpfs /data がアンマウントされるようになりました。

          6. Mount /data

            vold は、暗号化されていない本当の /data パーティションをマウントし、新しいパーティション (firstrelease ではサポートされていない wipe オプションで暗号化されていた場合は準備されていなかったかもしれません) を用意します。 プロパティ vold.post_fs_data_done を 0 に設定し、vold.decrypttrigger_post_fs_data に設定します。 これにより、init.rcpost-fs-dataコマンドを実行します。 このコマンドは必要なディレクトリやリンクを作成し、vold.post_fs_data_doneを1に設定します。 vold はこのプロパティに 1 を設定すると、vold.decrypt プロパティを trigger_restart_framework に設定します。 これにより、init.rc はクラス main のサービスを再び開始し、起動以来初めてクラス late_start のサービスも開始します。

          7. Start full framework

            これで、フレームワークは復号化された /data ファイルシステムを使用してすべてのサービスを起動し、システムを使用する準備ができました。

          Failure

          復号化に失敗したデバイスは、いくつかの理由で異常が発生している可能性があります。

          1. Detect encrypted device with a password
          2. Mount tmpfs
          3. Start framework to prompt for password

          しかし、フレームワークを開いた後、デバイスはいくつかのエラーに遭遇する可能性があります。

          • Password matches but cannot decrypt data
          • User enters wrong password 30 times

          If these errors are not resolved, prompt user to factory wipe:

          If vold detect an error during encryption process, and if no data has been destroyed yet and the framework is up, vold setsthe property vold.encrypt_progress to error_not_encrypted.UI はユーザーに再起動を促し、暗号化プロセスが開始されないことを警告します。 フレームワークが破壊された後、プログレスバー UI が表示される前にエラーが発生した場合、vold はシステムを再起動します。 再起動に失敗すると、vold.encrypt_progresserror_shutting_down を設定し、-1 を返しますが、エラーをキャッチするものはありません。

          vold が暗号化処理中にエラーを検出した場合、vold.encrypt_progresserror_partially_encrypted を設定し、-1 を返します。 UI は、暗号化に失敗したというメッセージを表示し、ユーザーがデバイスを工場出荷時にリセットするためのボタンを提供する必要があります。

          暗号化キーの保存

          暗号化キーは、cryptoメタデータに保存されます。 ハードウェアによるバックアップは、Trusted Execution Environment(TEE)の署名機能を使用して実装されています。以前は、ユーザーのパスワードと保存されているソルトにscryptを適用して生成したキーでマスターキーを暗号化しました。 オフボックス攻撃に耐える鍵にするため、このアルゴリズムを拡張し、結果の鍵に保存されたTEE鍵で署名する。 署名の結果は、scryptをもう1回適用することで、適切な長さの鍵に変換されます。 この鍵は、マスターキーの暗号化および復号化に使用される。 この鍵は、

          1. ランダムな16バイトのディスク暗号化キー(DEK)と16バイトのソルトを生成することで保存されます。
          2. ユーザーパスワードとソルトにscryptを適用して、32バイトの中間鍵1(IK1)を生成します。
          3. IK1をハードウェア結合秘密鍵(HBK)のサイズに0バイトでパッドする。具体的には、次のようにパッドする。 00 || IK1 || 00..00; 1つのゼロ・バイト、32 IK1バイト、223ゼロ・バイト。
          4. IK1をHBKでパディングし、256バイトのIK2を生成することに署名します。
          5. IK2にscryptを適用し、ソルト(ステップ2と同じソルト)を適用して、32バイトのIK3を生成します。
          6. IK3の最初の16バイトをKEKとして、最後の16バイトをIVとして使用します。
          7. 鍵KEKと初期化ベクトルIVを使用して、AES_CBCでDEKを暗号化します。

          パスワードの変更

          ユーザーが設定のパスワードを変更または削除することを選択すると、UIはコマンドcryptfs changepwvoldに送り、voldは新しいパスワードでディスクマスターキーを再暗号化します。

          Encryption properties

          voldinit は、プロパティを設定することによって相互に通信します。 以下は、暗号化に使用できるプロパティのリストです。

          Vold properties

          The progress bar UI should display the message that encryption completed, and give the button to reboot the device.

          The progress bar UI is not running, so who will respond to this error is unclear.

          プロパティ 説明
          vold.decrypt trigger_encryption パスワードなしでドライブを暗号化する。vold.decrypt を trigger_restart_min_framework に設定します。
          vold.decrypt trigger_reset_main ディスクパスワードを要求するUIをシャットダウンするようにvoldが設定。
          vold.decrypt trigger_restart_framework 実際のフレームワークとすべてのサービスを開始するためにvoldによって設定されます。
          vold.decrypt trigger_shutdown_framework 暗号化を開始するためにフレームワークを完全にシャットダウンするためにvoldによって設定されます。
          vold.decrypt trigger_restart_min_framework Vold により、ro.crypto.state の値に応じて、暗号化のためのプログレスバー UI またはパスワードのプロンプトを開始するように設定されます。
          vold.encrypt_progress このプロパティが設定されている場合、フレームワークの起動時にプログレスバーUIモードを開始します。
          vold.encrypt_progress 0 to 100 プログレスバーUIには設定されたパーセント値が表示されるはずです。
          vold.encrypt_progress error_partially_encrypted The progress bar UI should display the message that the encryption failed, and give the option to factory reset the device.
          vold.encrypt_progress error_reboot_failed UI that the progress bar UI to the encryption completed and give the option to device…
          UI to factory reset the devices…
          vold.encrypt_progress error_not_encrypted The progress bar UI should display a message saying an erroroccurred, no data was encrypted orlost, and give the button to reboot system.
          vold.encrypt_progress error_shutting_down The progress bar UI is not running, and the user is for the button to reboot system. そして、いずれにせよ絶対にあってはならないことです。
          vold.post_fs_data_done 0 タスクvold.decrypttrigger_post_fs_dataに設定する直前にvoldで設定。
          vold.post_fs_data_done 1 タスクpost-fs-data終了後にinit.rcinit.rcで設定。

          init properties

          Property Description
          ro.crypto.fs_crypto_blkdev vold コマンド checkpw によって、後の vold コマンドrestart で使うためにセットされる。
          ro.crypto.state unencrypted このシステムが暗号化されていない /data ro.crypto.state encrypted で動作していると init により設定される。 2026>

          ro.crypto.fs_type
          ro.crypto.fs_real_blkdev
          ro.crypto.fs_mnt_point
          ro.crypto.fs_options
          ro.crypto.fs_flags

          これら5つのプロパティは、initinit.rc から渡されたパラメータで /data をマウントしようとする際に設定されます。 vold はこれらを使用して暗号マッピングを設定します。
          ro.crypto.tmpfs_options tmpfs /data ファイルシステムのマウント時に使用するオプションを init.rc が設定します。

          Init アクション

    コメントを残す

    メールアドレスが公開されることはありません。