実際に脆弱性のあるソースコードを確認し、修正してみましょう。
まず、「ソースコードを開く」ボタンをクリックし、「AndroidManifest.xml」と「
MainActivity.java」を開いてください。
ソースコードを開く
修正前:
プロジェクト |
ComponentBroadcast |
ソースファイル |
AndroidManifest.xml |
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.go.ipa.sample.component.broadcast"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="8"/>
<application
android:allowBackup="true"
<receiver
android:name="jp.go.ipa.sample.component.broadcast.MessageReceiver">
<!-- ▼▼▼脆弱性のあるソースコード▼▼▼ -->
<intent-filter>
<action android:name="sampleapp.message.receiver"/>
</intent-filter>
<!-- ▲▲▲脆弱性のあるソースコード▲▲▲ -->
</receiver>
|
ソースコードを開く
修正前:
プロジェクト |
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);
// ▲▲▲脆弱性のあるソースコード▲▲▲
}
|
ComponentBroadcastには、脆弱性対策を行うべき箇所が1箇所あります。修正例は以下の通りです。
-
AndroidManifest.xml:10行目
まず、送信側に求めるPermissionの使用を宣言します。
修正前ソースコードの10行目と11行目の間に以下のコードを追加してください。
<uses-permission android:name="jp.go.ipa.sample.component.broadcast.permission.receive"/>
引き続き、Permissionを宣言します。
<permission
android:name="jp.go.ipa.sample.component.broadcast.permission.receive"
android:protectionLevel="signature"/>
修正後ソースコードの12行目から〜16行目にあたります。
なお、修正前ソースコードの30行目〜32行目は、BroadcastReceiverの定義を行っている部分ですが、今回の対策ではBroadcastReceiverの定義は修正しません。
ComponentBroadcastSenderには、脆弱性対策を行うべき箇所が1箇所あります。修正例は以下の通りです。
-
MainActivity.java:70行目
発行するBroadcastにPermissionを設定するために、sendBroadcastの第2引数にPermissionの定義を追加します(赤文字部分)。
これにより、同一のPermissionを持ったアプリにのみBroadcastの受信を許可します。
sendBroadcast(intent,"jp.go.ipa.sample.component.broadcast.permission.receive");
修正後:
プロジェクト |
ComponentBroadcast |
ソースファイル |
AndroidManifest.xml |
<!-- ▼▼▼脆弱性を修正したソースコード▼▼▼ -->
<uses-permission android:name="jp.go.ipa.sample.component.broadcast.permission.receive" />
<permission
android:name="jp.go.ipa.sample.component.broadcast.permission.receive"
android:protectionLevel="signature" />
<!-- ▲▲▲脆弱性を修正したソースコード▲▲▲ -->
|
修正後:
プロジェクト |
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,"jp.go.ipa.sample.component.broadcast.permission.receive");
// ▲▲▲脆弱性を修正したソースコード▲▲▲
}
|