顔認証 HIDL

概要

顔認証を使用すると、ユーザーがデバイスを正面から見るだけでロック解除が可能です。Android 10 では、カメラフレームを安全に処理できる新しい顔認証スタックのサポートが追加されており、サポート対象のハードウェアにおける顔認証時にセキュリティとプライバシーを保護します。また Android 10 は、オンライン バンキングなどのトランザクションのためのアプリケーション統合を、セキュリティで保護された実装で簡単に実現します。

Android 顔認証スタックは、Android 10 で新たに実装されました。新しい実装では、IBiometricsFace.halIBiometricsFaceClientCallback.haltypes.hal インターフェースが導入されています。

アーキテクチャ

BiometricPrompt API には、顔、指紋、虹彩のすべての生体認証が含まれています。Face HAL は以下のコンポーネントに影響を与えます。

生体認証スタック
図 1. 生体認証スタック

FaceManager

FaceManager はプライベート インターフェースで、FaceService との接続を維持します。カスタム UI で顔認証にアクセスするために、KeyGuard が使用します。アプリは FaceManager にはアクセスせず、代わりに BiometricPrompt を使用する必要があります。

FaceService

顔認証ハードウェアへのアクセスを管理するフレームワーク実装です。基本的な登録と認証のステートマシン、またその他のさまざまなヘルパー(例: 列挙)が含まれます。安定性とセキュリティ上の理由から、ベンダーコードはこのプロセスでは実行できません。ベンダーコードには、すべて Face 1.0 HIDL インターフェース経由でアクセスします。

faced

Linux の実行可能ファイルで、FaceService で使用される Face 1.0 HIDL インターフェースを実装しています。FaceService が見つけられるよう、IBiometricsFace@1.0 として自身を登録します。

実装

顔認証 HIDL

顔認証 HIDL を実装するには、IBiometricsFace.hal のすべてのメソッドをベンダー特有のライブラリ内に実装する必要があります。

エラー メッセージ

エラー メッセージはコールバックによって送信され、送信後にステートマシンをアイドル状態に戻します。ほとんどのメッセージには、エラーについてユーザーに知らせる文字列が含まれていますが、すべてのエラーに含まれているわけではありません。エラー メッセージについて詳しくは、types.halをご覧ください。 すべてのエラー メッセージは終了状態を表します。つまり、エラー メッセージの送信後に HAL がアイドル状態に戻ることを前提としています。

取得メッセージ

取得メッセージは、登録または認証中に配信され、ユーザーが登録または認証を完了できるようにするものです。各段階には、FaceAuthenticationManager.java ファイルからの関連メッセージが含まれます。対応するヘルプ文字列が提供されていれば、ベンダー固有のメッセージを追加できます。取得メッセージは、それ自体の終了状態ではありません。HAL は、現在の登録または認証を完了するのに必要な数だけ送信することが想定されています。取得メッセージが進行できない終了状態になった場合、HAL は取得メッセージに続けてエラー メッセージを表示してください。たとえば、画像が暗すぎて進行できないままになる場合にエラー メッセージを表示する状況などです。この場合、何回か試行しても進行できなければ、UNABLE_TO_PROCESS を送信するのが合理的です。

ハードウェア

Android 10 の生体認証の要件にデバイスを準拠させるには、顔データの整合性確保と最終的な認証の比較のために安全なハードウェアが必要です。Android Compatibility Definition Document(Android の互換性定義に関するドキュメント、CDD)には、必要なセキュリティ レベルと適切な Spoof Acceptance Rate(SAR)の概要が記載されています。信頼できる処理と認識のため、Trusted Execution Environment(TEE)が必要です。さらに、顔認証に対するインジェクション攻撃を防ぐには、安全なカメラが必要です。たとえば、画像データの関連するメモリページに権限を設定して読み取り専用にすると、カメラのみが更新できるようになります。TEE とハードウェア以外のプロセスはアクセスできないようにするのが理想的です。

顔認証のハードウェアは多岐にわたるため、特定のデバイスのアーキテクチャに応じて、顔認証を行うハードウェア固有のドライバを開発する必要があります。このため、faced のリファレンス実装はありません。

メソッド

以下のメソッドはすべて非同期であり、フレームワークにすぐに戻る必要があります。そうでない場合はシステムが遅くなり、ウォッチドッグがリセットされる可能性があります。呼び出し元をブロックしないよう、複数のスレッドを持つメッセージ キューを用意することをおすすめします。GET リクエストは必ず可能な限り情報をキャッシュして、呼び出し元のブロック時間を最短にするようにします。

メソッド 説明
setCallback() FaceService によって呼び出され、精査のためにすべてのメッセージを自分自身に戻します。
setActiveUser() 以降のすべての HAL オペレーションが適用されるアクティブ ユーザーを設定します。 このメソッドが再び呼び出されるまで、このユーザーは常に認証されます。
revokeChallenge() generateChallenge() によって生成されるチャレンジを無効化することにより、安全なトランザクションを終了します。
enroll() ユーザーの顔を登録します。
cancel() 現在のオペレーション(登録、認証、削除、列挙など)をキャンセルし、faced をアイドル状態に戻します。
enumerate() アクティブ ユーザーに関連付けられている顔テンプレートをすべて列挙します。
remove() アクティブ ユーザーに関連付けられている顔テンプレートのいずれかまたはすべてを削除します。
authenticate() アクティブ ユーザーを認証します。
userActivity() このメソッドは、HAL が認証またはスタンバイ状態の場合にのみ使用してください。HAL がこれらのいずれかの状態にないときにこのメソッドを使用すると、OPERATION_NOT_SUPPORTED が返されます。HAL がすでに認証中のときにこのメソッドを呼び出すと、システムが顔を認識する時間が長くなることがあります。
resetLockout() 顔が認証されない回数が多すぎる場合、faced はロックアウト状態(LOCKOUT または LOCKOUT_PERMANENT)に入る必要があります。その場合は、残りの時間をフレームワークに送信し、ユーザーに表示する必要があります。setFeature() と同様に、このメソッドでは、内部状態を安全にリセットするためにアクティブな Hardware Authentication Token(ハードウェア認証トークン、HAT)が必要です。現在のユーザーのロックアウトのみリセットします。

残りの 3 つのメソッドはすべて同期的であり、フレームワークをストールさせるのを防ぐためにブロックする時間を最小限に抑える必要があります。

メソッド 説明
generateChallenge() セキュリティで保護されたトランザクションの開始を示す固有の暗号による安全なランダムトークンを生成します。
setFeature() 現在のユーザーについて、機能を有効または無効にします。セキュリティ上の理由から、HAT は上記のチャレンジに対して、ユーザーの PIN、パターン、またはパスワードを確認する必要があります。
getFeature() デフォルトまたは上記の setFeature() への呼び出しで指定される機能の現在の有効化状態を取得します。顔 ID が無効な場合、実装は ILLEGAL_ARGUMENT を返す必要があります。
getAuthenticatorId() 現在の顔セットに関連付けられている ID を返します。 顔が追加されるたびにこの識別子を変更する必要があります

ステート図

フレームワークには、次に示すステート図に従うために faced が必要になります。

ステート図
図 2. 顔認証ステートのフロー