脆弱性対策方法

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

脆弱性の原因

本シナリオでの脆弱性の原因は以下となります。
  • openFileOutput()を呼び出してファイルを作成する際に「MODE_WORLD_READABLE」モードを使用している。
    ファイルを作成する際のアクセスモード設定を変更する事が対策となります。

対策方法の概要

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

ソースコードを開く

修正前:
プロジェクト FileaccessData
ソースファイル RegisterActivity.java
try {
	// ▼▼▼脆弱性のあるソースコード▼▼▼
	// ファイルを開く処理
	outputStream = openFileOutput(STRAGE_FILE_NAME, MODE_WORLD_READABLE | MODE_APPEND);
	// ▲▲▲脆弱性のあるソースコード▲▲▲

このアプリには脆弱性対策を行うべき箇所が1箇所あります。
  • 51行目
    ファイルを作成する際のアクセスモードを修正します。
    アクセスモードの指定によってファイルへのアクセスを制限することができます。
    アクセスモードをMODE_WORLD_READABLEからMODE_PRIVATEに修正することで、作成されるファイルは他アプリからアクセスすることができなくなります。
    51行目を以下のようにMODE_PRIVATE(赤文字部分)に修正します。
    outputStream = openFileOutput(STRAGE_FILE_NAME, MODE_PRIVATE | MODE_APPEND);
修正例は以下の通りです。

修正後:
プロジェクト FileaccessData
ソースファイル RegisterActivity.java
try {
	// ▼▼▼脆弱性を修正したソースコード▼▼▼
	// ファイルを開く処理
	outputStream = openFileOutput(STRAGE_FILE_NAME, MODE_PRIVATE | MODE_APPEND);
	// ▲▲▲脆弱性を修正したソースコード▲▲▲

対策のまとめ

「内部ストレージのアクセス制限不備」による脆弱性について、対策は以下のとおりです。
  • 対策
    ファイルのアクセス権設定を、他のアプリからはアクセスできない設定にする。
  • 修正方法
    MODE_WORLD_READABLEをMODE_PRIVATEに変更する。

他のアプリから書き込みができる「MODE_WORLD_WRITEABLE」モードもあります。
「MODE_WORLD_READABLE」モード同様に使用しないことをお勧めします。
なお、APIレベル17(Android4.2)以降ではこれらのモードは廃止され、使用しないように求められています。
(ただし、2014年3月末時点ではAPIレベル17のAPIを使用していても、「MODE_WORLD_READABLE」や「MODE_WORLD_WRITEABLE」を使用できる状況です。)
端末のバージョン MODE_WORLD_WRITEABLE
Android4.1 (APIレベル16)以前
使用可能
Android4.2 (APIレベル17)以降 使用可能だが、使用しないように求められている

端末のバージョン MODE_WORLD_READABLE
Android4.1 (APIレベル16)以前
使用可能
Android4.2 (APIレベル17)以降 使用可能だが、使用しないように求められている

他のアプリと情報の共有をしたい場合は、ContentProviderやBroadcastReceiver、Serviceの利用を検討しましょう。