Weaver

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 が実行される安全な環境を侵害する。これは非常に難しいことを意図しています。

LockSettingsServiceweaverKeyweaverSecret の両方を使用して、ユーザーの合成パスワードを暗号化します。合成パスワードは、ファイルベースの暗号化(FBE)のユーザーの認証情報が暗号化された(CE)ストレージと、Android Keystore の認証情報に関連付けられた鍵を保護するため、Weaver が秘密鍵をリリースするまでデータにアクセスできません。

Weaver と Gatekeeper

これまで、Gatekeeper HAL は、1 回の verify() 呼び出しで 2 つの異なる役割を果たしていました。

  1. 検証: TEE でレート制限が適用された LSKF をチェックします。
  2. 構成証明: 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