問題への対策方法

開発者の不注意や確認不足が、脆弱性につながることが理解できたと思います。
次は、サンプルコードを基に対策方法を学んでいきましょう。

問題の原因

本シナリオでの問題の原因は以下となります。
  • 必要のない権限に対するPermissionを使用宣言している。
    アプリが必要とする権限を確認し、不必要な権限に対するPermissionの使用宣言を削除する事が対策となります。

対策方法の概要

実際に問題のあるソースコードを確認し、修正してみましょう。
まず、「ソースコードを開く」ボタンをクリックし、「AndroidManifest.xml」を開いてください。

ソースコードを開く

修正前:
プロジェクト Permission
ソースファイル AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.go.ipa.permission"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />
    <!-- ▼▼▼マルウェアと誤解される可能性のあるソースコード▼▼▼ -->
    <!-- 完全なインターネットアクセス -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- 連絡先データの読み取り -->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <!-- カレンダーの予定の読み取り -->
    <uses-permission android:name="android.permission.READ_CALENDAR"/>
    <!-- 単語リストの読み込み -->
    <uses-permission android:name="android.permission.READ_USER_DICTIONARY"/>
    <!-- ブラウザの履歴とブックマークを書き込む -->
    <uses-permission android:name="android.permission.WRITE_HISTORY_BOOKMARKS"/>
    <!-- 機密ログデータの読み取り -->
    <uses-permission android:name="android.permission.READ_LOGS"/>
    <!-- 実行中のプロセスの数を制限 -->
    <uses-permission android:name="android.permission.SET_ALWAYS_FINISH"/>
    <!-- SMSメッセージの送信 -->
    <uses-permission android:name="android.permission.SEND_SMS"/>
    <!-- 電話番号発信 -->
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <!-- SMSの受信 -->
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <!-- SMSの読み取り -->
    <uses-permission android:name="android.permission.READ_SMS"/>
    <!-- 精細な位置情報(GPS) -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <!-- おおよその位置情報(ネットワーク基地局) -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <!-- BLUETOOTH接続の作成 -->
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <!-- SDカードのコンテンツを修正/削除する -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!-- 録音 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <!-- 写真と動画の撮影 -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <!-- システムの全般設定の変更 -->
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <!-- 実行中のアプリの取得 -->
    <uses-permission android:name="android.permission.GET_TASKS"/>
    <!-- タイムゾーンの設定 -->
    <uses-permission android:name="android.permission.SET_TIME_ZONE"/>
    <!-- 外部ストレージのフォーマット -->
    <uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS"/>
    <!-- キーロックを無効にする -->
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
    <!-- Wi-Fi状態の変更 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <!-- BLUETOOTHの管理 -->
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <!--▲▲▲マルウェアと誤解される可能性のあるソースコード▲▲▲ -->


このアプリには問題の対策を行うべき箇所が1箇所あります。
  • 11~58行目
    不要なPermissionを削除します。
    このアプリは権限を全く使用しませんので、11~58行目にある不必要な権限に対するPermissionの使用宣言を全て削除します。
    利用者は、アプリ詳細画面からアプリが取得している権限をいつでも確認できます。
    不要な権限を取得しないようにPermissionの使用宣言を削除することで、利用者からマルウェアと誤解される可能性は低くなります。
    また、アプリに広告モジュールを組み込むことで、アプリ本体は必要としない権限を取得しなければならない場合、 あらかじめ利用者に対し「広告モジュール使用のため、○○の権限を取得しています」といったような説明をしておくことが望ましいと言えます。
修正例は以下の通りです。

修正後:
プロジェクト Permission
ソースファイル AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.go.ipa.permission"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />
<!--▼▼▼マルウェアと誤解される可能性のないソースコード▼▼▼ -->

<!--▲▲▲マルウェアと誤解される可能性のあるソースコード▲▲▲ -->

対策のまとめ

「マルウェアと誤解される可能性のあるPermissionの使用」による問題について、対策は以下のとおりです。
  • 対策
    不必要な権限に対するPermissionの使用宣言を行わない。
  • 修正方法
    アプリで使用していない権限に対するPermissionの使用宣言を「AndroidManifest.xml」から削除する。