Android 8.1 で導入された Weaver Hardware Abstraction Layer(HAL)(IWeaver.aidl)は、PIN、パターン、パスワードなどのロック画面知識要素(LSKF)によるユーザー認証のための安全なインターフェースを提供します。
Weaver は、Gatekeeper の LSKF 検証機能を置き換えます。ただし、ゲートキーパーは引き続きハードウェア認証トークンの生成に使用されます。
Android 9 以降では、CDD 9.11.2 で、StrongBox をサポートするデバイスは、セキュアなユーザー認証を支える専用のセキュア ハードウェアを提供することが求められています。このセキュア ハードウェアを使用して Weaver HAL を実装すると、「セキュアなユーザー認証」の要件を満たします。
専用のセキュア エレメント(SE)がないデバイスでも、Trusty などの高信頼実行環境(TEE)に Weaver を実装できます。
Android 17 以降では、専用のセキュア エレメントがないデバイスでも、Weaver を実装することを強く推奨します。
コンポーネント
Weaver は次の 3 つのコンポーネントで構成されています。
- Weaver AIDL インターフェース(
IWeaver): HAL の正式な仕様。Android 13 以前では、AIDL ではなく HIDL が使用されていました。 - Weaver Hardware Abstraction Layer(HAL)サービス:
IWeaverインターフェースを実装するベンダー固有の Android プロセス。 - Weaver Trusted Application(TA): 安全な環境で実行されるコアロジック。LSKF 検証を行い、レート制限を適用します。HAL サービスは、実装固有のセキュア チャネルを使用して TA と通信します。
インターフェース
Weaver のインターフェースは、固定サイズのキーと固定サイズの値を含む固定サイズの永続スロットの配列を表示します。各スロットは、ID([0, numSlots - 1] の範囲の整数)で識別されます。スロットの値にアクセスできるのは、保存された鍵と一致する鍵が提供された場合のみです。
Weaver のインターフェースは主に次の要素で構成されています。
getConfig(): 実装でサポートされているスロット数、キーサイズ、値のサイズを取得します。write(): 指定されたスロットを新しい Key-Value ペアで上書きします。このオペレーションはアトミックであり、以前のデータは完全に復元できなくなります(安全な削除)。read(): 指定されたスロットの値を取得しようとします。これは、レート制限のタイムアウト(TA によって適用)がアクティブではなく、指定されたキーが保存されたキーと完全に一致する場合にのみ成功します。warmUp(): Android 17 以降で、読み取りまたは書き込みがまもなく発生する可能性があることを示すヒントを伝えます。
インターフェースの完全な仕様については、IWeaver.aidl をご覧ください。
Android による使用
Weaver 実装が利用可能な場合、Android システム サーバーの LockSettingsService はそれを使用してユーザーデータを保護します。デバイス上のすべてのユーザーに対して、LockSettingsService は Weaver スロットを管理します。
- スロットキー(
weaverKey): ユーザーの LSKF のハッシュ。ユーザーが画面ロックを設定していない場合は、デフォルトの文字列が使用されます。 - スロット値(
weaverSecret): エントロピーの高い、ランダムに生成された暗号シークレット。
weaverSecret は、次のいずれかでのみ取得できるように設計されています。
- レート制限ポリシー内で Weaver TA に正しい
weaverKeyを提供する。 - Weaver TA が実行される安全な環境を侵害する。これは非常に難しいことを意図しています。
LockSettingsService は weaverKey と weaverSecret の両方を使用して、ユーザーの合成パスワードを暗号化します。合成パスワードは、ファイルベースの暗号化(FBE)のユーザーの認証情報が暗号化された(CE)ストレージと、Android Keystore の認証情報に関連付けられた鍵を保護するため、Weaver が秘密鍵をリリースするまでデータにアクセスできません。
Android 17 以降では、LSKF の入力が開始されると、LockSettingsService が Weaver の warmUp() メソッドを呼び出します。Weaver の実装では、このシグナルを使用して、セキュア ハードウェアを低電力状態から移行させ、次の read() リクエストのレイテンシを短縮できます。
Weaver と Gatekeeper
これまで、Gatekeeper HAL は、1 回の verify() 呼び出しで 2 つの異なる役割を果たしていました。
- 検証: TEE 適用レート制限で LSKF をチェックします。
- 構成証明:
HardwareAuthTokenを発行して、LSKF 認証が成功したことを KeyMint(以前の Keymaster)に通知します。
Weaver に移行する理由
Android 8.1 で安全なパスコード リセット トークンが導入されたことで、「合成パスワード」が主要な暗号化シークレットになりました。上記の 2 つのロールは、userId + 100000 の LSKF と userId の合成パスワードの別々の Gatekeeper 登録で処理されるようになりました。
Weaver は、セキュア エレメント(SE)ベースの実装をサポートする、よりシンプルな HAL インターフェースを使用して、最初の役割を引き継ぐために導入されました。
| 機能 | Weaver | ゲートキーパー |
|---|---|---|
| 安全な削除 | 安全な削除が必要であり、インターフェースは固定サイズの固定数のスロットを使用するため、簡単に実装できます。 | セキュア削除は必須ではありません。また、インターフェースが登録数を無制限にサポートしているため、実装が困難です。 |
| ハードウェア | SE 向けに最適化されていますが、TEE でも動作します。 | 事実上 TEE のみ。現在の設計では、SE に実装してもセキュリティ上のメリットはありません。 |
| エラー処理 | エラーコードの明確化 | 曖昧なエラーコード。その結果、ロック画面は正しくない LSKF と無関係な障害を区別しません。 |
| アトミック性 | Weaver を使用する LockSettingsService のコードは、LSKF の変更をアトミックに実行します。新しいデータは新しい Weaver スロットに書き込まれ、古いスロットは安全な場合にのみ消去されます。 |
Gatekeeper を使用する LockSettingsService のコードは、LSKF の変更をアトミックに実行しません。LSKF の変更中に問題が発生すると、すべてのユーザーデータが失われる可能性があります。 |
参照コード
AOSP には、Weaver の 2 つのリファレンス実装が含まれています。
-
Android 17 以降では、
system/weaver/に一般的な安全な環境向けの Weaver 実装が含まれています。 -
Android 8.1 以降では、
external/libese/に ISO/IEC7816-4 互換のセキュア エレメントの Weaver 実装が含まれています。
テスト
Weaver の実装を検証するには、VtsHalWeaverTargetTest を使用します。
atest VtsHalWeaverTargetTest
または
vts-tradefed run vts -m VtsHalWeaverTargetTest