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 を実装できます。
コンポーネント
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 によって適用)がアクティブではなく、提供されたキーが保存されたキーと完全に一致する場合にのみ成功します。
インターフェースの完全な仕様については、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 が秘密鍵をリリースするまでデータにアクセスできません。
Weaver と Gatekeeper
これまで、Gatekeeper HAL は、1 回の verify() 呼び出しで 2 つの異なる役割を果たしていました。
- 検証: TEE でレート制限が適用された LSKF をチェックします。
- 構成証明:
HardwareAuthTokenを発行して、LSKF 認証が成功したことを KeyMint(以前の Keymaster)に通知します。
Weaver に移行する理由
Android 8.1 で安全なパスコード リセット トークンが導入されたことで、「合成パスワード」が主要な暗号化シークレットになりました。上記の 2 つのロールは、userId + 100000 の LSKF と userId の合成パスワードの別々の Gatekeeper 登録で処理されるようになりました。
Weaver は、最初の役割を引き継ぐために導入されました。よりシンプルな HAL インターフェースを使用し、セキュア エレメント(SE)ベースの実装をサポートします。
| 機能 | Weaver | ゲートキーパー |
|---|---|---|
| 安全な削除 | 安全な削除が必要であり、インターフェースは固定サイズの固定数のスロットを使用するため、簡単に実装できます。 | セキュア削除は必須ではありません。また、インターフェースが登録数を無制限にサポートしているため、実装が困難です。 |
| ハードウェア | SE 向けに最適化されていますが、TEE でも動作します。 | 事実上 TEE のみ。現在の設計では、SE に実装してもセキュリティ上のメリットはありません。 |
| エラー処理 | エラーコードの明確化 | 曖昧なエラーコード。その結果、ロック画面は、正しくない LSKF と無関係な障害を区別しません。 |
| アトミック性 | Weaver を使用する LockSettingsService のコードは、LSKF の変更をアトミックに実行します。新しいデータは新しい Weaver スロットに書き込まれ、古いスロットは安全な場合にのみ消去されます。 |
Gatekeeper を使用する LockSettingsService のコードは、LSKF の変更をアトミックに実行しません。LSKF の変更中に問題が発生すると、すべてのユーザーデータが失われる可能性があります。 |
参照コード
ISO/IEC7816-4 互換のセキュア エレメントにおける Weaver 実装のリファレンス コードは、AOSP の external/libese/ で入手できます。
テスト
Weaver の実装を検証するには、VtsHalWeaverTargetTest を使用します。
atest VtsHalWeaverTargetTest
または
vts-tradefed run vts -m VtsHalWeaverTargetTest