OWASP カテゴリ: MASVS-PLATFORM: プラットフォームのインタラクション
概要
ブロードキャスト レシーバが正しく実装されていないと、攻撃者が悪意のあるインテントを送信し、脆弱なアプリケーションが外部呼び出し元を意図していないアクションを実行する可能性があります。
通常、この脆弱性は、AndroidManifest で android:exported="true"
を設定するか、デフォルトでレシーバを公開するブロードキャスト レシーバをプログラムで作成することで、ブロードキャスト レシーバが意図せずエクスポートされるケースを指します。レシーバにインテント フィルタが含まれていない場合、デフォルト値は "false"
ですが、レシーバにインテント フィルタが 1 つ以上含まれている場合、android:exported のデフォルト値は "true"
です。
適切なアクセス制御なしで意図的にエクスポートされたブロードキャスト レシーバは、すべてのアプリから呼び出されることの意図がない場合に不正使用される可能性があります。
影響
安全に実装されていないブロードキャスト レシーバは、攻撃者によって不正使用され、不正なアクセス権を取得して、デベロッパーがサードパーティに公開する意図のない動作をアプリで実行する可能性があります。
リスクの軽減
問題を完全に回避する
このジレンマを完全に解決するには、exported
を false
に設定します。
<receiver android:name=".MyReceiver" android:exported="false">
<intent-filter>
<action android:name="com.example.myapp.MY_ACTION" />
</intent-filter>
</receiver>
呼び出しとコールバックを使用する
アプリ内部の目的でブロードキャスト レシーバを使用している場合(イベント完了通知など)、コードを再構成して、イベント完了後に呼び出されるコールバックを渡すようにできます。
イベント完了リスナー
Kotlin
interface EventCompletionListener {
fun onEventComplete(data: String)
}
Java
public interface EventCompletionListener {
public void onEventComplete(String data);
}
セキュアタスク
Kotlin
class SecureTask(private val listener: EventCompletionListener?) {
fun executeTask() {
// Do some work...
// Notify that the event is complete
listener?.onEventComplete("Some secure data")
}
}
Java
public class SecureTask {
final private EventCompletionListener listener;
public SecureTask(EventCompletionListener listener) {
this.listener = listener;
}
public void executeTask() {
// Do some work...
// Notify that the event is complete
if (listener != null) {
listener.onEventComplete("Some secure data");
}
}
}
メイン アクティビティ
Kotlin
class MainActivity : AppCompatActivity(), EventCompletionListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val secureTask = SecureTask(this)
secureTask.executeTask()
}
override fun onEventComplete(data: String) {
// Handle event completion securely
// ...
}
}
Java
public class MainActivity extends AppCompatActivity implements EventCompletionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SecureTask secureTask = new SecureTask(this);
secureTask.executeTask();
}
@Override
public void onEventComplete(String data) {
// Handle event completion securely
// ...
}
}
権限でブロードキャスト レシーバを保護する
動的なレシーバーは、保護されたブロードキャスト(システム レベルのアプリのみが送信できるブロードキャスト)または自己宣言型の署名レベルの権限を持つブロードキャストに対してのみ登録してください。