デバイス識別子構成エンジン(DICE)は、Android に採用されている Trusted Computing Group(TCG)仕様です。起動シーケンス中、読み込まれるファームウェアごとに強力で不変の暗号 ID のセットを生成します。これらの ID を使用してデバイスのセキュリティ ポスチャーをリモートで検証でき、これは ROM の侵害によってのみ回避できます。
DICE の導出プロセス
図 1. DICE の導出プロセスの概要
DICE の導出プロセスは、ファームウェアのイメージに対するいかなる変更でも、そのステージとそれ以降のすべてのステージに対して新しい固有識別子をもたらします。これは、読み込まれるファームウェアのステージごとに、次に生成される ID と回避または改ざんを防止する関連付けられている鍵を測定し、証明するためです。読み出し専用メモリ(ROM)は鍵の導出機能(KDF)を使用して測定、構成、固有デバイス シークレット(UDS)を処理し、次に読み込まれるステージのシークレットを導出します。このシークレットのことを、複合デバイス識別子(CDI)といいます。
ステージ 0: 初期化
DICE プロセスは、チップセットの ROM が不変のデータのバンク(通常はヒューズ)から UDS を読み込むと起動します。この UDS は、チップ製造プロセスにおいて暗号論的にランダムな値で安全にプロビジョニングされたものです。ROM は、UDS を読み取った後にベンダー依存ハードウェア ロック メカニズム(ラッチなど)を使用して、次回の起動まで UDS アクセスをロックします。
ステージ 1: 最初の鍵の導出
ROM は UDS を鍵導出関数(KDF)への入力として使用し、特定のデバイスを識別する永続的な非対称の鍵ペアを生成します。ROM は次のファームウェアのステージを測定します。これには、セキュアブートが有効かどうかなど起動環境に関するメタデータが含まれます。次に、ROM は KDF で UDS、ファームウェア測定、構成データを組み合わせて最初の CDI を導出し、この CDI はシークレットとして次のステージに渡されます。
ステージ 2 以降: 再帰的な鍵の導出
その後、このプロセスが繰り返されます。その後のすべてのステージで、前のステージからの CDI は新しい KDF の入力として機能します。この KDF は、CDI と次のファームウェア イメージのハッシュを使用して新しく導出された CDI を生成します。ステージごとに独自の鍵ペアが生成され、それを使用してステージ固有の測定値とその他の関連メタデータを含む証明書に署名します。