Android のすべてのリリースで、ユーザーを保護するためにさまざまなセキュリティ機能が強化されています。Android 10 では、セキュリティとプライバシーが強化されています。 Android 10 の変更点の一覧については、Android 10 リリースノートをご覧ください。
セキュリティ
BoundsSanitizer
Android 10 は、Bluetooth とコーデックで BoundsSanitizer(BoundSan)をデプロイします。BoundSan は、UBSan の境界サニタイザを使用します。 この緩和は、モジュール単位で有効になります。Android の重要なコンポーネントを安全に保護するものであり、無効にすることはできません。BoundSan は、次のコーデックで有効になっています。
libFLAC
libavcdec
libavcenc
libhevcdec
libmpeg2
libopus
libvpx
libspeexresampler
libvorbisidec
libaac
libxaac
実行専用メモリ
デフォルトでは、AArch64 システム バイナリの実行可能コード セクションは、コードの再利用による Just-In-Time 攻撃を防ぐための強化緩和策として実行専用(読み取り不可)としてマークされています。データとコードを混在させたコードおよび、意図的にこれらのセクションを検査するコード(メモリ セグメントを最初に読み取り可能として再マップしない場合も含む)は機能しなくなりました。Android 10 のターゲット SDK を使用したアプリの API レベル 29 以降は、実行専用メモリ(XOM)セクションを読み取り可能にする必要はありません。
拡張アクセス
Trust Agent は、Smart Lock などの二次的な認証メカニズムの基盤となるメカニズムであり、Android 10 でのみロック解除を拡張できます。ロックされたデバイスのロックを Trust Agent で解除することはできなくなりました。また、デバイスをロック解除状態に保てるのは最長 4 時間です。
顔認証
顔認証を使用すると、ユーザーがデバイスを正面から見るだけでロック解除が可能です。Android 10 では、カメラフレームを安全に処理できる新しい顔認証スタックのサポートが追加されており、サポート対象のハードウェアにおける顔認証時にセキュリティとプライバシーを保護します。また Android 10 では、簡単にセキュリティ要件を満たせる実装方法が用意されており、オンライン バンキングなどのサービス トランザクションでセキュリティ機能をアプリケーションに統合できます。
整数オーバーフローの無害化
Android 10 では、ソフトウェア コーデックで整数オーバーフローの無害化(IntSan)が有効になりました。デバイスのハードウェアでサポートされていないコーデックに対して、再生パフォーマンスが許容可能であることを確認します。IntSan は、次のコーデックで有効になっています。
libFLAC
libavcdec
libavcenc
libhevcdec
libmpeg2
libopus
libvpx
libspeexresampler
libvorbisidec
モジュラー システム コンポーネント
Android 10 は、一部の Android システム コンポーネントをモジュール化しており、Android の通常のリリース サイクル以外で更新できます。モジュールには次のものがあります。
- Android ランタイム
- Conscrypt
- DNS Resolver
- DocumentsUI
- ExtServices
- メディア
- ModuleMetadata
- ネットワーキング
- PermissionController
- Time Zone Data
OEMCrypto
Android 10 は OEMCrypto API バージョン 15 を使用します。
Scudo
Scudo は、ヒープ関連の脆弱性に対する耐性を高めるために設計された、動的なユーザーモード メモリ アロケータです。標準的な C の割り当て、割り当て解除のプリミティブ、C++ のプリミティブを提供します。
ShadowCallStack
ShadowCallStack
(SCS)
は LLVM インストゥルメンテーション モードです。関数の戻りアドレスを非リーフ関数の関数プロローグに別々に割り当てられた ShadowCallStack
インスタンスに保存し、戻りアドレスを関数エピローグの ShadowCallStack
インスタンスから読み込むことで、戻りアドレス(スタック バッファなど)に対する上書きを回避します。
WPA3 と Wi-Fi Enhanced Open
Android 10 には、Wi-Fi Protected Access 3(WPA3)と Wi-Fi Enhanced Open のセキュリティ標準に対するサポートが追加され、既知の攻撃に対するプライバシーと堅牢性が強化されました。
プライバシー
Android 9 以前をターゲットとするアプリのアクセス
Android 9(API レベル 28)以前をターゲットとしているアプリが Android 10 以降で実行されている場合、プラットフォームでは次の動作が適用されます。
- アプリが
ACCESS_FINE_LOCATION
またはACCESS_COARSE_LOCATION
について<uses-permission>
要素を宣言した場合、インストール中にACCESS_BACKGROUND_LOCATION
に<uses-permission>
要素が自動的に追加されます。 - アプリが
ACCESS_FINE_LOCATION
またはACCESS_COARSE_LOCATION
のいずれかをリクエストした場合、そのリクエストに対してACCESS_BACKGROUND_LOCATION
が自動的に追加されます。
バックグラウンドでのアクティビティ制限
Android 10 以降、バックグラウンドからのアクティビティの起動に関する制限が設定されました。この動作変更により、ユーザーに対する割り込みを最小限に抑え、ユーザーは画面内の表示内容により集中できるようになります。ユーザー操作の直接の結果としてアプリがアクティビティを起動する場合、アプリがこの変更の影響を受けることはまずありません。
バックグラウンドからのアクティビティ起動に代わるおすすめの手段について詳しくは、タイミングが重要なイベントをユーザーに通知する方法をご覧ください。
カメラのメタデータ
Android 10 では、getCameraCharacteristics()
メソッドによってデフォルトで返される情報の範囲が変更されています。特に、このメソッドの戻り値に含まれる可能性のあるデバイス固有のメタデータにアクセスするには、アプリに CAMERA
権限が必要です。
これらの変更について詳しくは、権限を必要とするカメラ フィールドに関するセクションをご覧ください。
クリップボード データ
デフォルトのインプット メソッド エディタ(IME)のアプリまたは現在フォーカスのあるアプリでない限り、Android 10 以降ではクリップボード データにアクセスできません。
デバイスの位置情報
位置情報に対するアプリのアクセス権限をユーザーが詳細に制御できるようにするため、Android 10 では ACCESS_BACKGROUND_LOCATION
権限が導入されています。
ACCESS_FINE_LOCATION
権限や ACCESS_COARSE_LOCATION
権限とは異なり、ACCESS_BACKGROUND_LOCATION
権限が位置情報へのアプリのアクセスを制御するのは、そのアプリがバックグラウンドで実行しているときのみです。以下の条件のいずれかに該当する場合を除き、アプリはバックグラウンドで位置情報にアクセスしていると見なされます。
- 対象アプリに属するアクティビティが表示されている。
- フォアグラウンド サービスのタイプ
location
を宣言したフォアグラウンド サービスをアプリが実行している。
アプリのサービスに対してフォアグラウンド サービス タイプを宣言するには、アプリのtargetSdkVersion
またはcompileSdkVersion
を29
以上に設定する必要があります。フォアグラウンド サービスで、位置情報へのアクセスを必要とするユーザー開始アクションを実行し続ける方法についての説明をご覧ください。
外部ストレージ
デフォルトでは、Android 10 以降をターゲットとするアプリには外部ストレージに対するスコープ アクセス、つまり対象範囲別ストレージが付与されます。このようなアプリの場合、次のファイルの種類については、ストレージ関連のユーザー権限をリクエストしなくても外部ストレージ デバイスに表示されます。
- アプリ固有のディレクトリ内にあり、
getExternalFilesDir()
を使用してアクセスするファイル。 - アプリによってメディアストアから作成された写真、動画、音声クリップ。
対象範囲別ストレージについて、および外部ストレージ デバイスに保存されたファイルを共有、アクセス、変更する方法について詳しくは、外部ストレージでファイルを管理する方法、およびメディア ファイルにアクセスして変更する方法をご覧ください。
MAC アドレスのランダム化
Android 10 以降が実行されているデバイスでは、デフォルトでランダム MAC アドレスが送信されます。
エンタープライズ ユースケースを扱うアプリ向けに、プラットフォームには MAC アドレスに関連する操作を行うための API が用意されています。
- ランダムな MAC アドレスを取得する: デバイス所有者アプリとプロフィール所有者アプリは、
getRandomizedMacAddress()
を呼び出すことで、特定のネットワークに割り当てられたランダムな MAC アドレスを取得できます。 - 実際の出荷時 MAC アドレスを取得する: デバイス オーナー アプリでは、
getWifiMacAddress()
を呼び出すことで、デバイスの実際のハードウェア MAC アドレスを取得できます。このメソッドは、大量のデバイスをトラッキングする際に便利です。
再設定不可能なデバイス ID
Android 10 以降で IMEI とシリアル番号の両方を含む再設定不可能なデバイス ID にアクセスするには、アプリに READ_PRIVILEGED_PHONE_STATE
特権が必要です。
Build
TelephonyManager
権限を持たないアプリが再設定不可能な ID に関する情報を求めようとした場合、プラットフォームの応答はターゲット SDK のバージョンによって異なります。
- アプリが Android 10 以降を対象にしている場合、
SecurityException
が発生します。 - アプリが Android 9(API レベル 28)以下を対象にしている場合、アプリに
READ_PHONE_STATE
権限があれば、このメソッドはnull
またはプレースホルダ データを返します。それ以外の場合は、SecurityException
が発生します。
運動認識
Android 10 では、ユーザーの歩数を検出したり、徒歩、サイクリング、車の運転など、ユーザーの運動を分類したりする必要があるアプリ向けに android.permission.ACTIVITY_RECOGNITION
ランタイム権限が導入されています。このアクセス権限は、デバイスのセンサーデータが [設定] 内でどのように使用されているのかをユーザーに表示するように設計されています。
Google Play 開発者サービス内のライブラリの中には、Activity Recognition API や Google Fit API など、ユーザーがアプリに対してこの権限を付与していない限り結果を提供しないものがあります。
デバイス上の組み込みセンサーのうち、この権限の宣言を求めるのは、歩数計と歩行検出のセンサーのみです。
Android 9(API レベル 28)以前をターゲットとしているアプリの場合、アプリが次の条件をすべて満たしていれば、必要に応じてシステムが android.permission.ACTIVITY_RECOGNITION
権限をアプリに自動的に付与します。
- マニフェスト ファイルには
com.google.android.gms.permission.ACTIVITY_RECOGNITION
権限が含まれます。 - マニフェスト ファイルには
android.permission.ACTIVITY_RECOGNITION
権限は含まれません。
システムが android.permission.ACTIVITY_RECOGNITION
権限を自動的に付与した場合、アプリが Android 10 をターゲットにするよう更新された後もアプリはこの権限を保持します。ただし、ユーザーはいつでもシステム設定でこの権限を取り消すことができます。
/proc/net ファイルシステムの制限
Android 10 以降が実行されているデバイスでは、デバイスのネットワーク状態に関する情報が格納されている /proc/net
にアプリがアクセスすることはできません。VPN など、この情報にアクセスする必要のあるアプリは、NetworkStatsManager
クラスや ConnectivityManager
クラスを使用する必要があります。
UI から削除された権限グループ
Android 10 の時点で、UI 内で権限がどのようにグループ化されているかをアプリでは検索できません。
連絡先アフィニティの削除
Android 10 以降、プラットフォームでは連絡先アフィニティ情報を管理しません。そのため、アプリによってユーザーの連絡先に対して検索が行われても、その検索結果はインタラクションの頻度では並べ替えられません。
ContactsProvider
に関するガイドには、Android 10 以降すべてのデバイスでサポートが終了したフィールドとメソッドに関する注意事項が記載されています。
画面コンテンツに対するアクセスの制限
ユーザーの画面コンテンツを保護するため、Android 10 では READ_FRAME_BUFFER
、CAPTURE_VIDEO_OUTPUT
、CAPTURE_SECURE_VIDEO_OUTPUT
の各権限の範囲を変更することで、デバイスの画面コンテンツへのサイレント アクセスを防止します。Android 10 の時点で、これらの権限は signature アクセス専用です。
デバイスの画面コンテンツにアクセスする必要があるアプリでは、MediaProjection
API を使用する必要があります。この API により、ユーザーに同意を求めるプロンプトが表示されます。
USB デバイスのシリアル番号
Android 10 以降をターゲットとしているアプリの場合、ユーザーがアプリに対して USB デバイスや USB アクセサリへのアクセス権限を付与するまで、シリアル番号を読み取ることができません。
USB デバイスの操作の詳細については、USB ホストを設定する方法をご覧ください。
Wi-Fi
Android 10 以降をターゲットとするアプリは、有効 / 無効を切り替えることができません。WifiManager.setWifiEnabled()
メソッドは常に false
を返します。
Wi-Fi の有効 / 無効を切り替えるようにユーザーに促す必要がある場合は、設定パネルを使用します。
設定済み Wi-Fi ネットワークへの直接アクセスに関する制限
ユーザーのプライバシーを保護するために、Wi-Fi ネットワーク リストの手動設定は、システムアプリと Device Policy Controller(DPC)のみに制限されています。特定の DPC をデバイス オーナーまたはプロファイル オーナーのいずれかに指定できます。
Android 10 以降をターゲットとしている、システムアプリでも DPC でもないアプリの場合、次のメソッドでは有用なデータが返されません。
getConfiguredNetworks()
メソッドからは常に空のリストが返されます。- 整数値を返すネットワーク操作メソッド(
addNetwork()
およびupdateNetwork()
)はいずれも常に「-1」を返します。 - ブール値を返すネットワーク操作メソッド(
removeNetwork()
、reassociate()
、enableNetwork()
、disableNetwork()
、reconnect()
、disconnect()
)は、常に「false
」を返します。