脆弱性対策方法

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

脆弱性の原因

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

対策方法の概要

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

ソースコードを開く

修正前:
プロジェクト FileaccessPreference
ソースファイル MainActivity.java
        private void initPreference() {

        	// ▼▼▼脆弱性のあるソースコード▼▼▼
        	// SharedPreferences型インスタンスを取得
        	preferences = getSharedPreferences(PREFERENCE_NAME, MODE_WORLD_READABLE);
			// ▲▲▲脆弱性のあるソースコード▲▲▲

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

修正後:
プロジェクト FileaccessPreference
ソースファイル MainActivity.java
     private void initPreference() {

		// ▼▼▼脆弱性を修正したソースコード▼▼▼
       	// SharedPreferences型インスタンスを取得
		preferences = getSharedPreferences(PREFERENCE_NAME, MODE_PRIVATE);
		// ▲▲▲脆弱性を修正したソースコード▲▲▲

対策のまとめ

「Preferenceファイルのアクセス制限不備」による脆弱性について、対策は以下のとおりです。
  • 対策
    ファイルのアクセス権設定を、他のアプリからはアクセスできない設定にする。
  • 修正方法
    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)以降 使用可能だが、使用しないように求められている

開発者は、ファイルを作成する際、MODE_WORLD_WRITEABLE、MODE_WORLD_READABLEを使用しないように注意しなければなりません。