サンプルアプリの脆弱性説明

サンプルアプリの脆弱性

サンプルアプリ「07画像送信」に存在している脆弱性について詳しく説明します。
具体的にどのような実装が脆弱性につながっているのか、ソースコードを確認してみましょう。

脆弱性のあるソースコード

プロジェクト ComponentBroadcast
ソースファイル AndroidManifest.xml
<receiver
	android:name="jp.go.ipa.sample.component.broadcast.MessageReceiver">
	 <!-- ▼▼▼脆弱性のあるソースコード▼▼▼ -->
	<intent-filter>
	    <action android:name="sampleapp.message.receiver"/>
	</intent-filter>
	 <!-- ▲▲▲脆弱性のあるソースコード▲▲▲ -->
</receiver>
脆弱性の原因となっている処理は以下の点です。
  • 暗黙的Intentを受信可能になっている
    発行する暗黙的Intentが他のアプリに取得されてしまう問題です。
    「jp.go.ipa.component.intentfilter.broadcast.MessageReceiver」という名前のBroadcast ReceiverにIntentFilterが定義されており、暗黙的Intentを受信可能になっている事が分かります。
    このため、同じIntentFilterを持つ他アプリのBroadcastReceiverがメッセージを傍受する事が可能になっており、これが脆弱性の原因です。

プロジェクト ComponentBroadcastSender
ソースファイル MainActivity.java
    /*
	 * 送信ボタンタップ
	 */
	public void onClickSend(View v) {
		// 送信先の取得
		ListView listFriend = (ListView) findViewById(R.id.listFriend);
		int pos = listFriend.getCheckedItemPosition();

		// 送信先が指定されていない場合は以降の処理は行わない
		if (pos <  0) {
			Toast toast = Toast.makeText(this, "送信先を選択してください", Toast.LENGTH_SHORT);
			toast.setGravity(Gravity.AXIS_CLIP, 0, 0);
			toast.show();
			return;
		}
		String pictureName = (String) listFriend.getItemAtPosition(pos);

        // ▼▼▼脆弱性のあるソースコード▼▼▼
		// 暗黙的Intentを使用
		Intent intent = new Intent("sampleapp.message.receiver");

		intent.putExtra("pictureName", pictureName);
		sendBroadcast(intent);
		// ▲▲▲脆弱性のあるソースコード▲▲▲
	}

  • 暗黙的Intentを使用して情報のやり取りを行っている
    発行する暗黙的Intentが他のアプリに取得されてしまう問題です。
    暗黙的Intentに画像ファイル名を設定している事が分かります。
    このため、同じIntentFilterを持つ他アプリのBroadcastReceiverが画像ファイル名を傍受する事が可能になっており、これが脆弱性の原因です。

次は、脆弱性の修正方法について説明します。