私はここのAndroidマニュアルから引用していますが、:
注意:
私が使用したソースは、マシュマロには直接関係ありませんが、ロリポップ以上には関係があります。
TL:DR
OPの質問に今すぐ対処します。技術的な詳細が続きます。
デフォルトの暗号化キーは、ハードウェアソース(TPMに類似したチップ)とソースファイルで定義されdefault_password
ているAOSPのデフォルトパスワードから取得されcryptfs.c
ます。以下を参照してください。
はい、デフォルトだけでなく、パスワードはキーになり、TEEと呼ばれるTPMのようなチップに保存されます(「Trusted Execution Environment」の略。詳細は以下を参照)。
デバイスのSoC上のチップにUART / JTAGでアクセスできるハッカーは、技術的にTEEキーにアクセスするか、カスタムカーネルがこの情報をハッカーに漏らす可能性があります。陰謀説の一部の3文字の代理店は、OEMと提携してこれらの安全でないカーネルを実動デバイスで使用できる可能性がありますが、私はそれで多くの店を建てることはしません。繰り返しますが、詳細についてはこの回答の最後のセクションを参照してください。
ハッカーがキーにアクセスできないようにする唯一の方法は、そのために必要な多大な労力です。
- ファームウェア(Googleによる「検証済みブート」と呼ばれる)のハッシュ(チェックサム)のチェックは、実際にはデフォルトでLollipop上で行われ(JellyBean 4.3以降で利用可能)、と呼ばれるカーネルモジュールによって行われます
dm-verity
。ただし、これは暗号化ステータスとは無関係です。
出典: AOSPセキュリティガイドはこちら。
- カスタムパスワードを使用してシステムを復号化するプロセスについては、以下を参照してください。ここで、ユーザーパスワードが暗号化キーの作成と使用の両方に関係していることをお知らせします。
概要
最初の起動時に、デバイスはランダムに生成された128ビットのマスターキーを作成し、デフォルトのパスワードと保存されたソルトでハッシュします。デフォルトのパスワードは「default_password」です。ただし、結果のハッシュはTEE(TrustZoneなど)を介して署名され、署名のハッシュを使用してマスターキーを暗号化します。
Android Open Source Project cryptfs.cファイルで定義されているデフォルトのパスワードを見つけることができます。
ユーザーがデバイスでPIN /パスまたはパスワードを設定すると、128ビットキーのみが再暗号化されて保存されます。(つまり、ユーザーPIN /パス/パターンの変更は、ユーザーデータパーティションの再暗号化を引き起こしません。)
デフォルトの暗号化で暗号化されたデバイスを起動する
これは、パスワードなしで暗号化されたデバイスを起動したときに起こることです。Android 5.0デバイスは初回起動時に暗号化されるため、パスワードを設定しないでください。したがって、これはデフォルトの暗号化状態です。
- パスワードなしで暗号化された/ dataを検出する
/ dataをマウントできず、フラグの1つencryptable
またはforceencrypt
設定されているため、Androidデバイスが暗号化されていることを検出します。
vold
に設定vold.decrypt
するtrigger_default_encryption
と、defaultcrypto
サービスが開始されます。trigger_default_encryption
暗号化タイプをチェックして、/ dataがパスワードありまたはパスワードなしで暗号化されているかどうかを確認します。
- / dataの復号化
dm-crypt
デバイスが使用できるように、ブロックデバイス上にデバイスを作成します。
- / dataをマウント
vold
次に、復号化された実/ dataパーティションをマウントし、新しいパーティションを準備します。プロパティvold.post_fs_data_done
をに設定して0
からに設定vold.decrypt
しtrigger_post_fs_data
ます。これによりinit.rc
、post-fs-data
コマンドが実行されます。必要なディレクトリまたはリンクを作成し、に設定vold.post_fs_data_done
し1
ます。
いったんvold
そのプロパティに1を見て、それがプロパティを設定vold.decrypt
します:trigger_restart_framework
。これによりinit.rc
、クラス内のサービスがmain
再び開始され、ブート後初めてクラスlate_startのサービスも開始されます。
- フレームワークを開始
これで、フレームワークは復号化された/ dataを使用してすべてのサービスを起動し、システムを使用する準備が整いました。
デフォルトの暗号化なしで暗号化されたデバイスを起動する
これは、パスワードが設定されている暗号化されたデバイスを起動すると発生します。デバイスのパスワードは、ピン、パターン、またはパスワードです。
- パスワードで暗号化されたデバイスを検出する
フラグが原因でAndroidデバイスが暗号化されていることを検出する ro.crypto.state = "encrypted"
vold
/ dataはパスワードで暗号化されているために設定さvold.decrypt
れtrigger_restart_min_framework
ます。
- tmpfsをマウントする
init
5つのプロパティを設定して、/ dataに指定された初期マウントオプションを、から渡されinit.rc
たパラメーターとともに保存します。vold
これらのプロパティを使用して暗号マッピングを設定します。
ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(0xが前に付くASCII 8桁の16進数)
- フレームワークを起動してパスワードの入力を求めます
フレームワークが起動し、それvold.decrypt
がに設定されていることを確認しtrigger_restart_min_framework
ます。これは、フレームワークにtmpfs /data
ディスク上で起動しており、ユーザーパスワードを取得する必要があることを伝えます。
ただし、最初に、ディスクが適切に暗号化されていることを確認する必要があります。コマンドcryptfs cryptocomplete
をに送信しvold
ます。vold
暗号化が正常に完了した場合は0、内部エラーの場合は-1、暗号化が正常に完了しなかった場合は-2を返します。vold
これは、CRYPTO_ENCRYPTION_IN_PROGRESS
フラグの暗号メタデータを調べることで決定します。設定されている場合、暗号化プロセスが中断され、デバイスに使用可能なデータがありません。
vold
エラーが返された場合、UIはユーザーにデバイスを再起動して工場出荷時の状態にリセットするためのメッセージを表示し、ユーザーにボタンを押してそのようにします。
- パスワードでデータを復号化する
一度cryptfs cryptocomplete
成功すると、フレームワークは、ディスクのパスワードを要求UIを表示します。UIは、コマンドcryptfs checkpw
をに送信してパスワードを確認しますvold
。パスワードが正しい場合(これは/data
、一時的な場所に復号化されたものを正常にマウントしてからアンマウントすることで決定されます)、voldは復号化されたブロックデバイスの名前をプロパティに保存し、ro.crypto.fs_crypto_blkdev
ステータス0をUIに返します。パスワードが正しくない場合、UIに-1を返します。
- フレームワークを停止
UIは暗号化ブートグラフィックを作成し、コマンドでvoldを呼び出しますcryptfs restart
。vold
プロパティvold.decrypt
をtrigger_reset_main
に設定init.rc
しますclass_reset main
。これmain
により、クラス内のすべてのサービスが停止し、tmpfs /data
アンマウントできるようになります。
- / dataをマウント
vold
次に、復号化された実際の/data
パーティションをマウントし、新しいパーティションを準備します(最初のリリースではサポートされていないワイプオプションで暗号化された場合は準備されなかった可能性があります)。プロパティvold.post_fs_data_done
をに設定して0
からに設定vold.decrypt
しtrigger_post_fs_data
ます。これによりinit.rc
、が実行されますpost-fs-data commands
。必要なディレクトリまたはリンクを作成し、に設定vold.post_fs_data_done
し1
ます。一度vold
見て1
そのプロパティでは、プロパティを設定vold.decrypt
しますtrigger_restart_framework
。これによりinit.rc
、クラス内のサービスがmain
再び開始されlate_start
、起動後初めてクラス内のサービスも開始されます。
- 完全なフレームワークを開始する
これで、フレームワークは復号化された/ dataファイルシステムを使用してすべてのサービスを起動し、システムを使用する準備が整いました。
暗号化されたキーの保存
暗号化されたキーは、暗号化メタデータに保存されます。ハードウェアバッキングは、Trusted Execution Environment(TEE)署名機能を使用して実装されます。以前はscrypt
、ユーザーのパスワードと保存されたソルトに適用して生成されたキーでマスターキーを暗号化しました。
キーをオフボックス攻撃に対して回復力のあるものにするために、保存されたTEEキーで結果のキーに署名することにより、このアルゴリズムを拡張します。次に、結果として生じる署名は、のもう1つのアプリケーションによって適切な長さのキーに変わりますscrypt
。このキーは、マスターキーの暗号化と復号化に使用されます。このキーを保存するには:
- ランダムな16バイトのディスク暗号化キー(DEK)と16バイトのソルトを生成します。
scrypt
ユーザーパスワードとソルトに適用して、32バイトの中間キー1(IK1)を生成します。
- IK1にゼロバイトを埋め込み、ハードウェアバインドされた秘密キー(HBK)のサイズにします。具体的には、次のように埋め込みます:00 || IK1 || 00..00; 1つのゼロバイト、32 IK1バイト、223ゼロバイト。
- 256バイトのIK2を生成するために、IK1にHBKを埋め込みます。
scrypt
IK2およびソルト(ステップ2と同じソルト)に適用して、32バイトIK3を生成します。
- IK3の最初の16バイトをKEKとして使用し、最後の16バイトをIVとして使用します。
- AES_CBC、キーKEK、および初期化ベクトルIVでDEKを暗号化します。