Android の組込みアプリ以外のパーミッションの取り扱い
はてなアカウント管理を作るにあたり、最初は Android のパーミッションの仕組みにのっかろうと考えていましたが、調べていくうちにセキュリティリスクがあることがわかったので、別途自力でユーザにオプトインする仕組みを入れました。(はてな以外からリリースされるアプリケーションでは、アカウント管理に情報を渡す際に本当に渡すかをユーザに同意を求めるようになっています)
Android のパーミッションの仕組みは「先に定義したもん勝ち」という感じのようなので、端末デフォルトでインストールされていて、アンインストールが不可能になっているアプリケーションでのみ、安全に働くようでした。なんかやりかたがあるのかよくわかりませんが、そんな感じでしたので、今のところ一番確実な方法を選んでいます。
手元の実機 (Android 1.6) での検証では
- <permission android:name="com.example.permission.FOOBAR" android:protectionLevel="dangerous".../> というパーミッションを定義する、アプリケーションA
- それを uses-permission で定義する、アプリケーションB
- <permission android:name="com.example.permission.FOOBAR" android:protectionLevel="normal".../> というパーミッションを定義する、悪意あるアプリケーションC
A の signature と B, C の signature は別
A → B とインストール
- A インストール
- permission が定義される
- B インストール
- uses-permission の内容が表示される
- B で該当パーミッションAに対し使おうとする
- 成功する
→ 正常
B → A とインストール
- B インストール
- uses-permission は表示されない (Unknown permission)
- A インストール
- permission が定義される
- B で該当パーミッションAに対し使おうとする
- 該当パーミッションは定義されていないためセキュリティエラー Permission Denial
→ 正常 (この場合 B をインストールしなおすしかないのでユーザビリティ的に問題があるため採用できない)
C → A → B とインストール
- C インストール
- permission が定義される (protectionLevel="normal" == ユーザに確認がでないパーミッション)
- A インストール
- permission は定義されない (既に存在するので無視される)
- B インストール
- uses-permission の内容が表示されないが C で定義された permission が grant される
- B で該当パーミッションAに対し使おうとする
- 成功する
Bがユーザへの確認なしに、不正にパーミッションを行使していることになる。