Niezabezpieczone odbiorniki

Kategoria OWASP: MASVS-PLATFORM: Platform Interaction

Omówienie

Niewłaściwie zaimplementowane odbiorniki transmisji mogą umożliwić atakującemu wysłanie złośliwego komunikatu, który spowoduje, że podatna aplikacja wykona działania, które nie są przeznaczone dla zewnętrznych wywołujących.

Wrażliwość dotyczy głównie sytuacji, w których odbiornik transmisji jest eksportowany przypadkowo, np. przez ustawienie android:exported="true" w AndroidManifest lub tworzenie odbiornika transmisji za pomocą programowania, co powoduje, że odbiornik jest domyślnie publiczny. Jeśli odbiorca nie zawiera żadnych filtrów intencji, domyślną wartością jest "false", ale jeśli zawiera co najmniej 1 filtr intencji, domyślną wartością android:exported jest "true".

Celowo wyeksportowane odbiorniki transmisji bez odpowiedniej kontroli dostępu mogą być wykorzystywane w nieuprawniony sposób, jeśli deweloper nie zamierzał udostępniać ich wszystkim aplikacjom.

Wpływ

Niebezpieczne odbiorniki transmisji mogą zostać wykorzystane przez atakującego do uzyskania nieautoryzowanego dostępu do działania aplikacji, którego deweloper nie zamierzał udostępniać osobom trzecim.

Środki zaradcze

Unikanie problemu

Aby całkowicie rozwiązać ten problem, ustaw exported jako false:

<receiver android:name=".MyReceiver" android:exported="false">
    <intent-filter>
        <action android:name="com.example.myapp.MY_ACTION" />
    </intent-filter>
</receiver>

Używanie wywołań i wywołań zwrotnych

Jeśli odbiorniki transmisji były używane do celów wewnętrznych aplikacji (np. do powiadomienia o zakończeniu zdarzenia), możesz zmienić strukturę kodu, aby przekazywały one funkcję wywołania zwrotnego, która będzie wywoływana po zakończeniu zdarzenia.

Detektor zakończenia zdarzenia

Kotlin

interface EventCompletionListener {
    fun onEventComplete(data: String)
}

Java

public interface EventCompletionListener {
    public void onEventComplete(String data);
}
Bezpieczne zadanie

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");
        }
    }
}
Główna aktywność

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

Zabezpieczanie odbiorników transmisji za pomocą uprawnień

Rejestruj dynamiczne odbiorniki tylko w przypadku chronionych transmisji (transmisje, które mogą wysyłać tylko aplikacje na poziomie systemu) lub z samodzielnie zadeklarowanymi uprawnieniami na poziomie podpisu.

Materiały