この記事はプライバシー エンジニア、Giles Hogben による Android Developers Blog の記事 "Changes to Device Identifiers in Android O" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。  
 
Android O では、ユーザーが識別子の利用を制御しやすくするための改善が行われています。具体的な改善点は次のとおりです。

  • 端末固有のリセットできない識別子の利用が制限されます。
  • Android O Wi-Fi スタックがアップデートされ、合わせて Pixel、Pixel XL、Nexus 5x スマートフォンが使用する Wi-Fi チップセット ファームウェアが変更されます。これにより、プローブ リクエストの MAC アドレスが乱数化されます。
  • アプリがアカウント情報をリクエストする方法がアップデートされ、ユーザーが行える制御が増えます。

端末識別子の変更


Android O での端末識別子に関する主な変更点は、次のとおりです。  
 

Android ID


O では、Android ID(Settings.Secure.ANDROID_ID または SSAID)はアプリおよび端末のユーザーごとに異なる値になります。ユーザーが行える制御を増やすため、端末固有の識別子が必要なデベロッパーは、広告 ID などのリセット可能な識別子を利用する必要があります。広告 ID のユーザー設定も追加され、ユーザーが広告トラッキングを制限することができます。  
 
さらに、Android O では以下のような動作となります。  
 
  • ANDROID_ID の値は、パッケージ名と署名キーが同じである限り、パッケージをアンインストールして再インストールしても変わらなくなります。再インストール後も状態を維持したい場合、アプリでこの値を使うことができます。
  • 以前のバージョンの Android を実行している端末にアプリがインストールされた場合、端末を Android O にアップデートしても Android ID は変わりません。ただし、アプリをアンインストールして再インストールする場合は除きます。
  • Android ID の値は、端末をファクトリー リセットした場合や、アンインストールと再インストールの間に署名キーが変更された場合にのみ変わります。
  • この変更点は、Google Play サービスと広告 ID が搭載される端末のメーカーでのみ必須になります。他の端末メーカーは、リセット可能な別の ID を提供したり、Android ID の提供を続ける可能性があります。

Build.SERIAL


IMEI にアクセスするために必要なランタイム パーミッションとの一貫性を持たせるため、Android O 以降をターゲットとするアプリでの android.os.Build.SERIAL の利用はサポートされなくなります。今後は、新しい Android O API である Build.getSerial() を利用できます。この API は、呼び出し元が PHONE パーミッションを与えられていれば、実際のシリアル番号を返します。将来のバージョンの Android では、Android O をターゲットとしたアプリで Build.SERIAL は "UNKNOWN" になる予定です。以前のアプリの機能が引き続き動作するように、以前のバージョンの Android をターゲットとしたアプリでは、従来どおり端末のシリアル番号を確認できます。  
 

Net.Hostname


Net.Hostname は、端末のネットワーク ホスト名を返します。以前のバージョンの Android では、ネットワーク ホスト名のデフォルト値と DHCP ホスト名オプションの値には、Settings.Secure.ANDROID_ID が含まれていました。Android O では、IETF RFC 7844(匿名プロファイル)に従い、net.hostname は空になり、DHCP クライアントはホスト名を送信しなくなります。  
 

Widevine ID


O が搭載される新規端末では、Widevine クライアント ID はアプリのパッケージ名とウェブオリジン(ウェブブラウザ アプリの場合)ごとに異なる値を返します。  
 

一意のシステムおよび設定プロパティ


Android O では、Build.SERIAL 以外にも、次の設定やシステム プロパティを利用できなくなります。  
  • ro.runtime.firstboot: 最後にワイプした後の初回起動日時、または直近の起動日時を示すミリ秒精度のタイムスタンプ
  • htc.camera.sensor.front_SN: カメラのシリアル番号(HTC 端末の一部で利用可能)
  • persist.service.bdroid.bdaddr: Bluetooth MAC アドレス プロパティ
  • Settings.Secure.bluetooth_address: 端末の Bluetooth MAC アドレス。O では、LOCAL_MAC_ADDRESS パーミッションが与えられているアプリに対してのみ有効になります。

Wi-Fi プローブ リクエストにおける MAC アドレスの乱数化


Google は、セキュリティ研究者と協力1 し、Google Pixel および Nexus 5X 端末のチップセット ファームウェアによる Wi-Fi スキャン トラフィックで堅牢な MAC アドレス乱数化の設計を行いました。その後、Android ネットワーク接続チームがメーカーと協力して、上記の端末で使用される Wi-Fi チップセット ファームウェアをアップデートしました。  
 
Android O では、こういったファームウェアの変更が Android Wi-Fi スタックに組み込まれています。これによって、アップデートされたファームウェアとチップセットを使う Android O 以降の端末で MAC アドレスの乱数化が可能になっています。  
 
O 以降を実行する Pixel、Pixel XL、Nexus 5x ファームウェアに対する変更点の一部を以下に示します。  
 
  • アクセス ポイントから切断されている場合、Wi-Fi スキャンを行うたびにスマートフォンは新しいランダム MAC アドレスを使います(端末がスタンバイ状態かどうかは問いません)。
  • 各スキャンでの最初のパケット連番も乱数化されます。
  • 不要なプローブ リクエスト情報エレメントが削除されます。情報エレメントは、SSID および DS パラメータ セットに限られます。

getAccounts API の変更点


Android O 以降では、GET_ACCOUNTS パーミッションだけでは端末に登録されているアカウントの一覧にアクセスできなくなります。アプリが提供する特定のアカウント種別を管理する API を使うか、アカウント選択アクティビティ経由でアカウントにアクセスするパーミッションをユーザーから得る必要があります。たとえば、Gmail アプリを所有しているのは Google であるため、Gmail は端末に登録されている Google アカウントにアクセスできますが、Gmail が端末に登録されている他のアカウント情報にアクセスする場合、ユーザーが許可を与える必要があります。  
 
Android O 以降を対象としたアプリでは、アカウントにアクセスするために AccountManager#newChooseAccountIntent() または認証システム固有のメソッドを使用する必要があります。ターゲット SDK バージョンが O より前のアプリは、引き続き現在のフローを利用できます。  
 
Android O では、AccountManager.setAccountVisibility() および getVisibility() メソッドを使ってアプリが所有するアカウントの可視性に関するポリシーを管理できます。  
 
さらに、LOGIN_ACCOUNTS_CHANGED_ACTION ブロードキャストはサポートされなくなりますが、Android O では引き続き動作します。アカウント情報のアップデートを実行時に取得したい場合、アプリは指定するアカウント種別のリストに対して addOnAccountsUpdatedListener() を使う必要があります。  
 
詳細は、一意の識別子のベスト プラクティスをご覧ください。  
 


  1. Glenn Wilkinson および英 Sensepost チーム、Célestin Matte、Mathieu Cunche: リヨン大学、フランス国立応用科学院リヨン校、CITI Lab、Inria Privatics、Mathy Vanhoef、KU Leuven 

 
 
Posted by Yuichi Araki - Developer Relations Team