OWASP カテゴリ: MASVS-PLATFORM: プラットフォームのインタラクション
概要
Android アプリと Android システムは、ブロードキャストをメッセージ システムとして使用し、他のアプリに関係がありそうなイベントをそれらのアプリに通知できます。スティッキー ブロードキャストとは、ブロードキャストの完了後も、送信されたインテント オブジェクトがキャッシュに残る特別なタイプのブロードキャストです。システムは、スティッキー インテントをその後のレシーバ登録に再ブロードキャストできます。残念ながら、スティッキー ブロードキャスト API にはセキュリティに関する欠点がいくつかあります。Android 5.0(API レベル 21)で非推奨になったのは、それが理由です。
誰でもスティッキー ブロードキャストにアクセスできる
スティッキー ブロードキャストは、特定の権限を保持するレシーバに限定することができません。したがって、機密情報のブロードキャストには適していません。次のようにブロードキャスト Intent
でアプリのパッケージ名を指定すると、BroadcastReceivers
のセットが制限されると考えたくなるかもしれません。
Kotlin
val intent = Intent("com.example.NOTIFY").apply {
setPackage("com.example.myapp")
}
applicationContext.sendBroadcast(intent)
Java
Intent intent = new Intent("com.example.NOTIFY");
intent.setPackage("com.example.myapp");
getApplicationContext().sendBroadcast(intent);
この例では、ブロードキャストが送信されたとき、com.example.myapp
パッケージ内のレシーバのみがインテントを受信します。しかし、インテントがスティッキー キャッシュから再ブロードキャストされるとき、パッケージ名フィルタは適用されません。registerReceiver()
メソッドを使用してレシーバを登録する際は、レシーバが属するパッケージの名前は考慮されずに、指定されたフィルタに一致するスティッキー キャッシュ内のすべてのインテントがレシーバに再ブロードキャストされます。
誰でもスティッキー ブロードキャストを送信できる
アプリがスティッキー ブロードキャストを送信するために必要な権限は android.permission.BROADCAST_STICKY
だけであり、この権限はアプリのインストール時に自動的に付与されます。したがって、攻撃者は任意のレシーバに任意のインテントを送信することができ、別のアプリに対する不正なアクセス権を取得する可能性があります。ブロードキャスト レシーバは、送信元を特定の権限を保持するもののみに制限できます。しかし、そのようにすると、レシーバはスティッキー キャッシュからブロードキャストを受信できなくなります。それらは、送信される際にアプリの識別子に関するコンテキストがなく、権限付きでブロードキャストされないからです。
誰でもスティッキー ブロードキャストを変更できる
インテントがスティッキー ブロードキャストの一部である場合、スティッキー キャッシュ内の同じアクション、データ、型、識別子、クラス、カテゴリを持つ以前のインスタンスは、すべてそのインテントに置き換えられます。したがって、攻撃者は正当なアプリから送信されるスティッキー インテントの追加データを簡単に上書きすることができ、そのデータが他のレシーバに再ブロードキャストされる可能性があります。
sendStickyOrderedBroadcast()
メソッドを使用して送信されたブロードキャストは一度に 1 つのレシーバに配信されるため、優先度の高いレシーバは、より優先度の低いレシーバにブロードキャストが配信される前にそれを消費できます。各レシーバは順番に実行されるので、setResultData()
の呼び出しなどにより、結果を次のレシーバに伝播できます。または、ブロードキャストを中止して、後続のレシーバがブロードキャストを受信できないようにすることもできます。正当なアプリからの順序付けされたスティッキー ブロードキャストを受信できる攻撃者は、優先度の高いレシーバを作成して、ブロードキャスト結果データを改ざんしたり、ブロードキャストを完全に破棄したりできます。
影響
影響は、スティッキー ブロードキャストが使用される方法と、ブロードキャスト レシーバに渡されるデータの内容によって異なります。一般的に、スティッキー ブロードキャストを使用すると、機密データの開示、データの改ざん、別のアプリで動作を実行するための不正なアクセス、サービス拒否を招くおそれがあります。
リスクの軽減
スティッキー ブロードキャストを使用しないでください。ローカル データベースのような別のメカニズムで非スティッキー ブロードキャストを使用し、必要なときに現在の値を取得するパターンをおすすめします。
デベロッパーは、権限を使用するか、インテントにアプリのパッケージ名を設定することにより、誰が非スティッキー ブロードキャストを受信するかを制御できます。さらに、アプリ外のコンポーネントにブロードキャストを送信する必要がない場合は、オブザーバー パターンを実装する LiveData
を使用します。
ブロードキャストのセキュリティ保護について詳しくは、ブロードキャストの概要ページをご覧ください。