Androidにおけるセキュリティ設計と動作(前編)
3.3 ユーザIDとファイルアクセス
アプリケーションのインストール時に、アプリケーションごとに一意なユーザIDが付与されます。別のアンドロイド端末に同じアプリケーションをインストールしても、同じIDは付与されません。また、一度アンインストールしてから再びインストールした場合も、同じIDが付与されるとは限りません。なお、ユーザIDはアプリケーションがアンインストールされるまで変更されません。
アンドロイドで作成されるファイルへのアクセスは、このユーザIDによって制御されます。アプリケーションが作成する主なファイルはデータベースファイルやプリファレンスファイルなどですが、アプリケーションごとにユーザIDが異なることにより、アプリケーションが明示的に許可しない限り、そのアプリケーションが作成したファイルに他のアプリケーションがアクセスすることはできません。また、アプリケーションは一般に別プロセスで動作するため、互いのメモリ空間にアクセスすることもできません。
3.4 パーミッション
アンドロイド端末には、電話をかけたり、SMSを送ったり、通信を行ったりする機能や電話帳などの機能があります。これらの機能がアプリケーションから無制限に利用できてしまうと、アプリケーションが勝手に電話をかけて料金を発生させたり、電話帳からデータを抜き出して外部のサーバにアップロードしたりする恐れがあります。このためアンドロイドでは、アプリケーションのインストール時にアプリケーションがどのような機能を使用するのかを表示し、ユーザに確認とインストールの許可を求めます(図3-4)。
図3-4:インストール時にユーザに許可を求める(クリックで拡大) |
ユーザが許可を与えなかった場合、アプリケーションはインストールされません。ユーザが許可を与えた場合、アプリケーションはアンインストールされるまでの間、許可された機能を使用できます。機能の使用について許可を求めるのはインストール時だけであり、それらのパーミッションをインストール後に変更することはできません。
アプリケーションが使用するパーミッションはAndroidManifest.xmlファイルに記載されます。アプリケーションがそれらの機能を使用することを宣言するには、
リスト3-2 AndroidManifest.xmlへの電話をかけるパーミッションの記載例
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.co.taosoftware.android.sb.contentprovider" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.READ_CONTACTS" /> ... </manifest>
アンドロイドOSが提供するパーミッションはAndroid DevelopersサイトのManifest.permissionに記載されています。アンドロイドOS 4.0の時点で、110種類以上のパーミッションが存在します。
表3-1 代表的なパーミッション
権限 | 説明 |
---|---|
CALL_PHONE | 電話発信 |
CAMERA | カメラの使用 |
READ_CONTACTS | 電話帳データの読み取り |
INTERNET | ネットワークの利用 |
ACCESS_NETWORK_STATE | ネットワーク状態の取得 |
BATTERY_STATS | バッテリー状態の取得 |
WRITE_EXTERNAL_STORAGE | 外部記憶装置(SDカードなど)の利用 |
3.4.1 パーミッションによるアクセス制限
- Activityパーミッション
要素に記述します。アクティビティの呼び出しを制限します。呼び出し元がパーミッションを持っていない場合は、呼び出し元でSecurityExceptionを発生させます。 - Serviceパーミッション
要素に記述します。サービスの開始とバインドを制限します。呼び出し元がパーミッションを持っていない場合は、呼び出し元でSecurityExceptionを発生させます。 - BroadcastReceiverパーミッション
要素に記述します。ブロードキャストの受信が可能かどうかを制限します。SecurityExceptionが発生してもキャッチできない場合があります。 - ContentProviderパーミッション
要素に記述します。コンテントプロバイダが提供するデータのアクセスを制限します。コンテントプロバイダではより細かなアクセス制限が可能です。他のパーミッションとは異なり、読み込み(android:readPermission)と書き込み(android:writePermission)の2種類の属性が存在します。その呼び出し元がパーミッションを持っていない場合はSecurityExceptionを発生させます。
コンテントプロバイダでは、URIパーミッションを使ってアクセスを制限することに加えて、さまざまな方法でアクセスを制限することが可能です。詳しくは「第7章 コンテントプロバイダ」を参照してください。
3.4.2 パーミッションの作成
アンドロイドOSが用意しているパーミッションに加えて、独自のパーミッションを作成し、使用することもできます。
独自のパーミッションを作成することはあまりありませんが、他のアプリケーションからコンテントプロバイダへのアクセスを禁止したい場合や、複数のアプリケーションが連動するようなシステムを作成し、システム内のアプリケーションやデータに外部からアクセスできないようにしたい場合に使用できます。
リスト3-3 パーミッションの定義例
<uses-permission android:name="jp.co.taosoftware.android.sb.contentprovider.permission.READ_DATA" /> <permission android:name="jp.co.taosoftware.android.sb.contentprovider.permission.READ_DATA" android:protectionLevel="dangerous" android:label="@string/permlab_read_data" android:description="@string/permdesc_read_data" android:permissionGroup="android.permission-group.COST_MONEY" />
AndroidManifest.xmlに
Android Security 安全なアプリケーションを作成するために
システムの脆弱性を突くスパイウェアの手法を学び、ユーザの個人情報や企業データを情報漏洩のリスクから守る。セキュリティ対策チェックシートや用語集も収録! アンドロイドアプリの開発者が知っておくべき実践ノウハウが満載の一冊です。Android 4.0:Ice Cream Sandwich(APIレベル14)に関する最新情報にも対応!
タオソフトウェア株式会社 著
価格:3,360円 (本体 3,200円+税)
発売日:2012年01月06日発売
ISBN:978-4-8443-3134-6
発行:インプレスジャパン