安全でないブロードキャスト レシーバ

OWASP カテゴリ: MASVS-PLATFORM: プラットフォームのインタラクション

概要

ブロードキャスト レシーバが適切に実装されていない場合、攻撃者は悪意のあるインテントを送信して、外部の呼び出し元を想定していないアクションを脆弱なアプリケーションに実行させることができます。

この脆弱性は通常、ブロードキャスト レシーバが 意図せずエクスポートされるインスタンスを指します。これは、AndroidManifest で android:exported="true" を設定するか、ブロードキャスト レシーバをプログラムで作成してレシーダをデフォルトで公開することで発生します。レシーバにインテント フィルタが含まれていない場合、デフォルト値は"false"ですが、レシーバにインテント フィルタが 1 つ以上含まれている場合、android:exported のデフォルト値は"true"です。

適切なアクセス制御を行わずにブロードキャスト レシーバを意図的にエクスポートした場合、デベロッパーがすべてのアプリケーションから呼び出されることを想定していないと、悪用される可能性があります。

影響

安全に実装されていないブロードキャスト レシーバは、攻撃者によって悪用され、デベロッパーがサードパーティに公開することを意図していないアプリケーションの動作を実行するための不正なアクセス権を取得する可能性があります。

リスクの軽減

問題を完全に回避する

このジレンマを完全に解決するには、exportedfalse に設定します。

<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
        // ...
    }
}

権限でブロードキャスト レシーバを保護する

保護されたブロードキャスト(システムレベルのアプリケーションのみが送信できるブロードキャスト)または自己宣言型の署名レベルの権限に対してのみ、動的レシーバを登録します。

リソース