NTT DATA TECH
🙄

Android 16のKey sharing APIはAndroid Keystoreの何を変えるか

に公開

はじめに

Android 16は、予定通りであれば6月ということで例年よりも早い時期でのリリースが予定されています。
Android 16を搭載した端末も、例年より早くリリースされるのかなど、気になる点は多いです。

そんなAndroid 16で導入予定の新しい機能のうち、セキュリティは「Key sharing API」という一つの項目が公式サイトに掲載されています。
(プライバシーの項目としては他にありますし、動作変更についてセキュリティ機能が該当する内容は存在します。)
このAPIは、Android Keystoreシステムで作られた鍵へのアクセスを他のアプリと共有するために導入されるものです。

本記事では、Key sharing APIについての解説を目的とし、以下の項目を扱います。

  • Android Keystoreとは
  • Key sharing APIの概要
  • Key sharing APIを使用するにあたって注意点

Android Keystoreとは

Android Keystoreは、アプリに、アプリ専用の鍵を生成、保存、使用するための仕組みです。以下のような代表的な特徴があります。

  • インストールされたアプリごとの鍵の生成、保存、使用。
  • 鍵の抽出困難なコンテナへの格納。TEEやSecure Elementへの鍵の可機能が可能。
  • 鍵の使用制限。使用方法の制限や、有効期間の設定、セキュアロックによるユーザ認証など。

コンテナの実装や、細かなモード設定、鍵保護のための消去機能とその条件など、細かな点を挙げればキリがない機能です。
ここでは、Androidには、そのアプリだけが利用できる鍵を生成・保存し、その鍵は端末から持ち出すことは基本的に出来ない、と理解してください。

Key sharing APIの概要

こうした前提を踏まえると、今回取り上げるKey sharing APIが、Android Keystoreの特徴から外れる機能であることが分かります。
Key sharing APIを使用することで、鍵を生成したアプリが、その鍵を他のアプリからもアクセス出来るようになる為です。
なお、あくまで、鍵そのものを共有するのではなく、アクセスを共有する、つまりアクセス許可を与えるという点がポイントです。

Key sharing APIは、android.security.keystore.KeyStoreManagerクラスにて提供されるメソッドで構成されています。
主なメソッドとして以下のものがあります。

  • grantKeyAccess (String alias, int uid):aliasで指定した鍵へのアクセスを、uidで指定したアプリケーションに許可する。返り値として、long型でidが設定される。明示的に取り消されるまで有効。
  • revokeKeyAccess (String alias, int uid):aliasで指定した鍵へのアクセスを、uidで指定したアプリケーションから取り消す。
  • getGrantedKeyFromId (long id):idに紐づけられた共通鍵を取得する。
  • getGrantedKeyPairFromId (long id):idに紐づけられた公開鍵、秘密鍵を取得する。

単純に鍵へのアクセス許可、取り消し、鍵の取得という点では非常にシンプルな構成になっています。
grantKeyAccess、revokeKeyAccessが鍵のアクセスを許可するアプリが使用するメソッド、getGrantedKeyFromId、getGrantedKeyPairFromIdが許可されたアプリが使用するメソッドです。ですので、grantKeyAccessが返すidを、安全な経路にて受け渡す必要があります。

詳細や他のメソッドは以下のリンクから確認してください。
https://developer.android.com/reference/android/security/keystore/KeyStoreManager

Key sharing APIを使用するにあたって注意点

ここからが本題となります。
概要でお話しした通り、Key sharing APIは、Android Keystoreで提供される鍵の特徴である、作成したアプリでしか使えない、という制限を超えるものです。
これが意味するのは、Key sharing APIの使い方次第で、セキュリティレベルを低下させる恐れがあるということです。
鍵へのアクセスを共有して、何を行うのか、というユースケースにもよりますが、想定される注意点をいくつか挙げてみます。これ以外にも、注意点は出てくる可能性はあります。

  1. 信頼出来るアプリへの許可
    当たり前ではありますが、信頼できるアプリケーションにのみ、鍵へのアクセスを許可する必要があります。grantKeyAccessで、鍵へのアクセスを許可するアプリケーションを指定するには、uidが必要ですが、uidはインストールされた端末ごとに異なる値であるため、固定値での指定はできません。そのため、許可したいパッケージからuidを取得する必要がありますが、Androidの場合、パッケージ名だけでは真正性を担保できないため、別の手段でアプリの真正性の検証が必要です。
  2. 許可したアプリケーションの管理
    現在、Key sharing APIには、許可した鍵を管理しておくようなAPIは用意されていません。どのアプリに鍵の利用を許可したかが分からなくなってしまう恐れがあります。そのため、許可したアプリを管理する必要がある場合は、独自にリストを作成し、保有しておく必要があります。
  3. 許可期限の設定
    現在、鍵の許可は、一度許可したらそのままで、自動的に期限を設けて取り消すことはできません。鍵を許可した後に、許可したアプリの更新時にマルウェアが紛れ込む、または脆弱性が発見され利用されることで、本来想定していない形で鍵へのアクセスが行われる可能性があります。そのため、長期間許可を与えておく必要がないユースケースでは、一定期間経過後に許可を取り消すようなロジックを組み込むことも検討して良いかもしれません。

まとめ

今回は、Android 16で導入予定のKey sharing APIについて、その概要と注意点を解説しました。
出たばかりの機能であり、本来あってもよい機能が実装されていない点なども含め、今後ユースケースが具体化していくにつれて、内容が変わっていく可能性があります。特筆すべき事例が出ましたら、本ブログでも改めて解説していきたいと思います。

NTT DATA TECH
NTT DATA TECH
設定によりコメント欄が無効化されています