Androidで作るセキュアなアプリのポイントとは
2.4 著作権保護
アプリケーション自体も著作物であり、著作権保護の対象となりますが、ここではアプリケーションが内蔵しているデータの著作権保護について見ていきます※2。アンドロイドアプリは他のアプリケーションのリソースに簡単にアクセスできるため、リソースデータを取り出して外部ファイルに保存するといった処理を実装できます。著作権が設定されていて第三者に渡ってはならないデータがアプリケーションに含まれている場合は、データの取り出し自体を防ぐことはできないという前提に立って、取り出されても利用できないような措置を取る必要があります。著作権が設定されていることが想定できるデータとしては、次が挙げられます。
- 画像
- 動画
- 音楽
- 文字列
- 電子書籍
それぞれを保護するレベルに応じて、暗号化やライセンスサーバの利用などを検討する必要があります。また、これらの情報を送受信する際には、個人情報と同様にパケット盗聴への対策が必要となります。
※ 2 アプリケーション自体の保護については、「2.6 アプリケーションの不正利用抑止」を参照のこと。
2.5 アプリケーションの悪用抑止
アプリケーションの機能に外部からアクセスされ、本来の目的以外に悪用されることが考えられます。単純な例を挙げると、接続先と接続先に送るデータをインテント経由で受け取って通信を行うようなアクティビティは、適切なパーミッションで保護されていないと、悪意のあるアプリケーションから送られたデータをそのまま転送する踏み台として悪用される恐れがあります。
リスト2-1 受け取ったインテントの内容を他へ送信するアクティビティ
<activity android:name=".service.WriteServiceActivity"> <intent-filter> <action android:name="jp.co.somecompany.action.DATA_SEND" /> </intent-filter> </activity>
マニフェストの内容から、すべてのアプリケーションがこのアクティビティに対して処理を要求できることがわかります。仮に、アクティビティ側に適切なチェックが記述されていないとすれば、アプリケーションは悪意のあるデータを送出した犯人にされてしまいます。
リスト2-2 受け取ったデータを盲信し、処理してしまう例
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); String destinationURL = intent.getStringExtra(DESTINTION_URL, null); String data = intent.getStringExtra(DATA_TO_SEND, null); // 渡されたデータは正しいと信じて送信処理を実行 // doSend()の中でチェックしてればよいが... doSend(destinationURL, data); }
また、決まった時刻に自動的に処理を行うアプリケーションは、アラームマネージャからのインテント通知に応じて起動するように設計されますが、起動時の処理の内容によっては、インテントが偽装された場合の対策が必要になります。
たとえば、毎晩午前0時に端末の情報をサーバへ送信するようなアプリケーションがあるとしましょう。この処理の実行開始をアラームマネージャからのインテント通知だけを引き金として実装してしまった場合、悪意のあるアプリケーションが偽装されたインテントをアラームマネージャに登録すれば、アプリケーションはサーバへのデータ送信を任意のタイミングで繰り返し実行させられることになります。このケースでは、悪意のあるデータをサーバへ送信することは難しいものの、サーバに負荷をかけたり、想定外のタイミングでデータ送信を行ったりすることで、サーバ側のデータで不整合を引き起こす可能性があります。
これについては、以下の対策が考えられます。
- 機能の呼び出し元を確認する
- 外部から呼び出せないようにパーミッションを設定する