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
- Wyeksportowane elementy odbiornika
- Dokumentacja dotycząca uprawnień odbiornika transmisji danych
- Ochrona intencji w ramach transmisji