Androidは携帯端末のOSで、スマートフォンに適しています。
スマート(Smart)とは「賢い・洗練された」といった意味を持つ形容詞です。
Androidはこの「スマート」をユーザ自身の手で育てることが出来ます。
どのように育てるのか!
それは世界中の開発者からリリースされているアプリをインストールして育てます。
より高機能なアプリ、より使い勝手の良いアプリを探してインストールすれば、あなたのスマートフォンはもっと「スマート」になるでしょう!
しかし、アプリは良心的なものばかりではありません。中には悪意を持ったアプリも存在します。
悪意を持ったアプリから、ユーザを守る仕組みの1つがPermissionです。
ここまではユーザ目線でした。
逆にアプリの開発者目線で言えば、Permissionはアプリの安全性をユーザにアピールする手段でもありあます。
今回は、このPermissionについてまとめます。
Permissionとは
ユーザが人気のメモ帳アプリをGoogle Playからインストールしたとしましょう。
このメモ帳アプリが悪意のある開発者の登録したものであり、ユーザの通話履歴を開発者に送信する機能を持っていたとしたら、通話履歴が漏洩します。
これは重大なプライバシーの侵害です。
そもそも、メモ帳アプリに「通話履歴を読み出す機能」や「ネットにアクセスする機能」は不要です。このアプリはメモ帳としての権限を逸脱してると言えます。
このような問題点を回避するために、アプリに対して必要最低限の機能のみを許可する仕組みがあります。
それがパーミッションシステムです。
パーミッションシステムにおいて、Permissionは「○○する機能」に紐づけられた権限のことです。
アプリがPermissionを取得していれば、アプリは「○○する機能」を実行する権限を持つことになり、「○○する機能」が利用できます。
同様な表現として…
ユーザがPermissionを許可していれば、アプリは「○○する機能」を実行する権限を持つことになり、「○○する機能」が利用できます。
そして、アプリにPermissionを許可するか(拒否するか)どうかは、ユーザが判断します。開発者の判断では無い点がポイントです。
これにより、逸脱した権限はユーザの手で排除できます。
ただし、完全にプライバシーの侵害を回避できるわけではありません。
先の例で言えば、悪意のある「メモ帳アプリ」が「IP電話アプリ」であれば、「通話履歴を読み出す機能」も「ネットにアクセスする機能」も必要になり、漏洩は防げません。
信頼に足りる開発者であるか、信頼に足りるアプリであるか、ユーザの判断が最も重要であることを忘れてはいけません。
プロテクションレベル
Permissionは危険性の種類により分類したプロテクションレベルが設定されています。
以下はその基本タイプです。
レベル | 危険性 | 取得タイミング | 許可⇔拒否の変更 |
---|---|---|---|
dangerous | 高リスクな機能の実行 | アプリの機能の実行時 | ○ |
normal | 低リスクな機能の実行 | アプリのインストール時 | × |
signature | アプリへ不正アクセス | アプリのインストール時 | × |
internal | システムへ不正アクセス | ※未確認 | ※未確認 |
※許可⇔拒否の変更:インストール後の変更、Settings(設定)アプリで行う |
基本タイプに加えて多くのフラグが存在しています。詳細はマニュアル(プロテクションレベル)を参照してください。
Dangerous
高リスクな機能に分類されたPermissionです。カテゴリ毎にGroup分けされています。
以下のような種類があります。
Group | Permission | 許可する機能 |
---|---|---|
ACTIVITY_RECOGNITION | ACTIVITY_RECOGNITION | 身体活動の認識(活動量計で利用) |
CALENDAR | READ_CALENDAR | 予定表の読み出し |
WRITE_CALENDAR | 予定表の書き込み | |
CAMERA | CAMERA | カメラで写真・動画の撮影 |
CONTACTS | READ_CONTACTS | 連絡先の読み出し |
WRITE_CONTACTS | 連絡先の書き込み | |
GET_ACCOUNTS | アカウントプロフィールの取得 | |
LOCATION | ACCESS_FINE_LOCATION | 大まかな地理的位置情報の取得 ※携帯基地局・Wi-Fiスポットデータに基づく |
ACCESS_COARSE_LOCATION | 正確な地理的位置情報の取得 ※GPSデータに基づく |
|
ACCESS_BACKGROUND_LOCATION | バックグラウンドで位置情報の取得 | |
MICROPHONE | RECORD_AUDIO | マイクで音声の録音 |
NEARBY_DEVICES ※API32で追加 ※詳細は未確認 | BLUETOOTH_ADVERTISE ※API31で追加、詳細は未確認 | 他のBluetoothデバイスへ広告 |
BLUETOOTH_CONNECT ※API31で追加、詳細は未確認 | 他のBluetoothデバイスと通信 | |
BLUETOOTH_SCAN ※API31で追加、詳細は未確認 | 他のBluetoothデバイスを捜査 | |
PHONE | READ_PHONE_STATE | 電話の状態の読み出し |
CALL_PHONE | 電話の発信 | |
ANSWER_PHONE_CALLS | 電話の着信 | |
READ_CALL_LOG | 通話履歴の読み出し | |
WRITE_CALL_LOG | 通話履歴の書き込み | |
ADD_VOICEMAIL | ボイスメールの利用 | |
USE_SIP | SIPサービスの利用 | |
PROCESS_OUTGOING_CALLS | 別の番号へ転送 | |
SENSORS | BODY_SENSORS | 人体センサーでヘルスデータの取得 |
SMS | SEND_SMS | SMSメッセージの送信 |
RECEIVE_SMS | SMSメッセージの受信 | |
READ_SMS | SMSメッセージ履歴の読み出し | |
RECEIVE_WAP_PUSH | WAPプッシュの受信 | |
RECEIVE_MMS | MMSメッセージの受信 | |
STORAGE | READ_EXTERNAL_STORAGE | 外部ストレージの読み出し |
WRITE_EXTERNAL_STORAGE | 外部ストレージへ書き込み | |
※Groups:android.permission-group.XXX ※Permission:android.permission.YYY ※SMS:Short Message Service、電話番号を使ったメッセージ交換 ※MMS:Multimedia Message Service、キャリアメールアドレスを使ったメッセージ交換 ※外部ストレージ:サンドボックス外、他のアプリからアクセス可能な領域 ※SIP:IP電話の呼制御プロトコル |
取得タイミングが「アプリの機能の実行時」であることから、別名「Runtime Permission」と呼ばれます。
アプリは機能を実行するタイミングで、ユーザに対してPermissionを申請します。申請が行われると、ダイアログが開かれてユーザに許可・拒否の判定を求めます。
Dangerous Permissionは許可・拒否の判定後も、Settings(設定)アプリにより判定の変更が可能です。※Settings⇒アプリ⇒アプリ情報⇒権限
Normal
低リスクな機能に分類されたPermissionです。
以下のような種類があります。ただし、ここに挙げるのは一部です。
Permission | 許可する機能 |
---|---|
ACCESS_NETWORK_STATE | ネットワーク情報へアクセス |
ACCESS_WIFI_STATE | WiFi情報へアクセス |
BLUETOOTH | ペアリング済みBluetoothデバイスへ接続 ※API≦30で利用 |
BLUETOOTH_ADMIN | Bluetoothデバイスの検出とペアリング ※API≦30で利用 |
CHANGE_NETWORK_STATE | ネットワーク接続状態の変更 |
CHANGE_WIFI_MULTICAST_STATE | Wi-Fiマルチキャスト状態へ変更 |
CHANGE_WIFI_STATE | Wi-Fi状態の変更 |
DISABLE_KEYGUARD | キーガードの無効化 |
FOREGROUND_SERVICE | フォアグラウンドサービスの起動 |
HIGH_SAMPLING_RATE_SENSORS | サンプリングレート≧200Hzでセンサーの使用 |
INTERNET | インターネットへアクセス |
KILL_BACKGROUND_PROCESSES | バックグラウンドプロセスの中断 |
MODIFY_AUDIO_SETTINGS | オーディオ設定の変更 |
NFC | NFCを介したI/O操作 |
NFC_PREFERRED_PAYMENT_INFO | NFC優先支払いサービス情報の受信 |
NFC_TRANSACTION_EVENT | NFCトランザクションイベントの受信 |
READ_SYNC_SETTINGS | 同期アダプター設定の読み出し |
WRITE_SYNC_SETTINGS | 同期アダプター設定の書き込み |
READ_SYNC_STATS | 同期アダプターの状態の読み出し |
RECEIVE_BOOT_COMPLETED | システムブート完了時に発行されるブロードキャストの受信 |
REORDER_TASKS | タスクの表示順(Z-order、Z軸の順序)の変更 |
SET_ALARM | アラームの設定 |
SET_WALLPAPER | 壁紙の設定 |
TRANSMIT_IR | IR送信機の使用(可能であれば) |
USE_BIOMETRIC | 生体認証の使用 |
USE_FINGERPRINT | 指紋認証ハードウェアの使用 |
USE_FULL_SCREEN_INTENT | 全画面アクティビティの起動 |
VIBRATE | バイブレータの使用 |
WAKE_LOCK | 端末の起動状態の維持(スリープ、画面OFFにならない) |
※API≦30で利用:AndroidManifestのPermission宣言でandroid:maxSdkVersion="30"を付加 |
取得タイミングが「アプリのインストール時」であることから、別名「Install-time Permission」と呼ばれます。インストール後に許可・拒否の判定は変更できません。
Signature
アプリ間でアプリケーションコンポーネントを連携させたい場合に、「○○コンポーネントへアクセスする機能」に紐づいたPermissionを、開発者が新規に定義できます。
この時、プロテクションレベルがSignatureであると、同じ鍵で署名された証明書を持つアプリからのみアクセスが許可されます。それ以外のアプリからのアクセスは拒否されます。
取得タイミングが「アプリのインストール時」であることから、「Install-time Permission」に含まれます。インストール後に許可・拒否の判定は変更できません。
次の4つがあります。どれも、AndroidManifestファイルで利用の宣言が必要です。
・Activity
・Service
・Broadcast Reciever
・Content Provider
アプリを一つのコンポーネント(Activity)で構成することもあります。しかし、複数のコンポーネントを連携(呼び出したり、呼ばれたり)させて構成する場合がほとんどです。
連携は同一アプリ内のコンポーネントに限りません。他者アプリのコンポーネントに対しても可能です。
Internal
システムによって内部的に管理されるPermissionです。※詳細は未確認
関連記事: