OWASP-Kategorie: MASVS-CODE: Codequalität
Übersicht
Android bietet ein leistungsstarkes Framework, die sogenannte Zwischenablage, zum Kopieren und Einfügen von Daten zwischen Anwendungen. Eine unsachgemäße Implementierung dieser Funktion kann dazu führen, dass nutzerbezogene Daten für unbefugte böswillige Akteure oder Anwendungen freigegeben werden.
Das spezifische Risiko, das mit der Freigabe von Zwischenablagedaten verbunden ist, hängt von der Art der Anwendung und den personenidentifizierbaren Informationen ab, die verarbeitet werden. Die Auswirkungen sind besonders hoch bei Finanzanwendungen, da sie Zahlungsdaten offenlegen können, oder bei Apps, die Codes für die Zwei-Faktor-Authentifizierung (2FA) verarbeiten.
Die Angriffsvektoren, die zum Ausschleusen von Zwischenablagedaten genutzt werden können, variieren je nach Android-Version:
- Bei Android-Versionen älter als Android 10 (API-Level 29) können Hintergrund-Apps auf die Zwischenablageinformationen von Apps im Vordergrund zugreifen. Dies ermöglicht böswilligen Akteuren möglicherweise den direkten Zugriff auf kopierte Daten.
- Ab Android 12 (API-Level 31) wird dem Nutzer jedes Mal, wenn eine Anwendung auf Daten in der Zwischenablage zugreift und sie einfügt, eine Toast-Meldung angezeigt. So wird es schwieriger, unbemerkt Angriffe auszuführen. Zum Schutz personenbezogener Daten unterstützt Android außerdem das spezielle Flag
ClipDescription.EXTRA_IS_SENSITIVE
oderandroid.content.extra.IS_SENSITIVE
. So können Entwickler die Vorschau des Inhalts der Zwischenablage in der Benutzeroberfläche der Tastatur visuell unkenntlich machen, damit kopierte Daten nicht visuell im Klartext angezeigt und potenziell von schädlichen Anwendungen gestohlen werden. Wenn Sie keines der oben genannten Flags implementieren, können Angreifer vertrauliche Daten, die in die Zwischenablage kopiert wurden, durch Shoulder Surfing oder durch schädliche Anwendungen ausspähen, die im Hintergrund Screenshots erstellen oder Videos von den Aktivitäten eines rechtmäßigen Nutzers aufzeichnen.
Positiv beeinflussen
Die Ausnutzung einer unsachgemäßen Zwischenablage kann dazu führen, dass sensible oder Finanzdaten von Nutzern von böswilligen Akteuren abgerufen werden. Dies kann Angreifern helfen, weitere Aktionen wie Phishing-Kampagnen oder Identitätsdiebstahl durchzuführen.
Abhilfemaßnahmen
Sensible Daten kennzeichnen
Mit dieser Lösung wird die Vorschau des Inhalts der Zwischenablage in der Benutzeroberfläche der Tastatur visuell verschleiert. Alle vertraulichen Daten, die kopiert werden können, z. B. Passwörter oder Kreditkartendaten, müssen mit ClipDescription.EXTRA_IS_SENSITIVE
oder android.content.extra.IS_SENSITIVE
gekennzeichnet werden, bevor ClipboardManager.setPrimaryClip()
aufgerufen wird.
Kotlin
// If your app is compiled with the API level 33 SDK or higher.
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
}
}
// If your app is compiled with API level 32 SDK or lower.
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean("android.content.extra.IS_SENSITIVE", true)
}
}
Java
// If your app is compiled with the API level 33 SDK or higher.
PersistableBundle extras = new PersistableBundle();
extras.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true);
clipData.getDescription().setExtras(extras);
// If your app is compiled with API level 32 SDK or lower.
PersistableBundle extras = new PersistableBundle();
extras.putBoolean("android.content.extra.IS_SENSITIVE", true);
clipData.getDescription().setExtras(extras);
Aktuelle Android-Versionen erzwingen
Wenn Sie festlegen, dass die App nur auf Android-Versionen ab Android 10 (API 29) ausgeführt werden darf, wird verhindert, dass Hintergrundprozesse auf Zwischenablagedaten in der App im Vordergrund zugreifen.
Wenn Sie festlegen möchten, dass die App nur auf Android 10 (API 29) oder höher ausgeführt wird, legen Sie die folgenden Werte für die Versionseinstellungen in den Gradle-Builddateien in Ihrem Projekt in Android Studio fest.
Groovy
android {
namespace 'com.example.testapp'
compileSdk [SDK_LATEST_VERSION]
defaultConfig {
applicationId "com.example.testapp"
minSdk 29
targetSdk [SDK_LATEST_VERSION]
versionCode 1
versionName "1.0"
...
}
...
}
...
Kotlin
android {
namespace = "com.example.testapp"
compileSdk = [SDK_LATEST_VERSION]
defaultConfig {
applicationId = "com.example.testapp"
minSdk = 29
targetSdk = [SDK_LATEST_VERSION]
versionCode = 1
versionName = "1.0"
...
}
...
}
...
Inhalte der Zwischenablage nach einem bestimmten Zeitraum löschen
Wenn die Anwendung auf Android-Versionen niedriger als Android 10 (API-Level 29) ausgeführt werden soll, kann jede App im Hintergrund auf Zwischenablagedaten zugreifen. Um dieses Risiko zu verringern, ist es sinnvoll, eine Funktion zu implementieren, die alle Daten löscht, die nach einem bestimmten Zeitraum in die Zwischenablage kopiert wurden. Diese Funktion wird ab Android 13 (API-Level 33) automatisch ausgeführt. Bei älteren Android-Versionen kann diese Löschung durch Einfügen des folgenden Snippets in den Code der Anwendung durchgeführt werden.
Kotlin
//The Executor makes this task Asynchronous so that the UI continues being responsive
backgroundExecutor.schedule({
//Creates a clip object with the content of the Clipboard
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = clipboard.primaryClip
//If SDK version is higher or equal to 28, it deletes Clipboard data with clearPrimaryClip()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
clipboard.clearPrimaryClip()
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
//If SDK version is lower than 28, it will replace Clipboard content with an empty value
val newEmptyClip = ClipData.newPlainText("EmptyClipContent", "")
clipboard.setPrimaryClip(newEmptyClip)
}
//The delay after which the Clipboard is cleared, measured in seconds
}, 5, TimeUnit.SECONDS)
Java
//The Executor makes this task Asynchronous so that the UI continues being responsive
ScheduledExecutorService backgroundExecutor = Executors.newSingleThreadScheduledExecutor();
backgroundExecutor.schedule(new Runnable() {
@Override
public void run() {
//Creates a clip object with the content of the Clipboard
ClipboardManager clipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = clipboard.getPrimaryClip();
//If SDK version is higher or equal to 28, it deletes Clipboard data with clearPrimaryClip()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
clipboard.clearPrimaryClip();
//If SDK version is lower than 28, it will replace Clipboard content with an empty value
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
ClipData newEmptyClip = ClipData.newPlainText("EmptyClipContent", "");
clipboard.setPrimaryClip(newEmptyClip);
}
//The delay after which the Clipboard is cleared, measured in seconds
}, 5, TimeUnit.SECONDS);
Ressourcen
- Zwischenablage-Framework
- Systembenachrichtigung, die angezeigt wird, wenn Ihre App auf Zwischenablagedaten zugreift
- Sensible Inhalte in die Zwischenablage einfügen
- Datenschutzänderungen in Android 10
- Informationen zur App-Version festlegen