OWASP kategorisi: MASVS-CODE: Kod Kalitesi
Genel Bakış
Android, uygulamalar arasında veri kopyalama ve yapıştırma için pano olarak adlandırılan güçlü bir çerçeve sunar. Bu özelliğin yanlış uygulanması, kullanıcıyla ilgili verileri yetkisiz kötü amaçlı aktörlere veya uygulamalara maruz bırakabilir.
Pano verilerinin açığa çıkmasıyla ilişkili risk, uygulamanın niteliğine ve işlediği kimliği tanımlayabilecek bilgilere (PII) bağlıdır. Ödeme verilerini açığa çıkarabilecekleri veya iki faktörlü kimlik doğrulama (2FA) kodlarını işleyen uygulamalar nedeniyle etki özellikle finansal uygulamalarda yüksektir.
Pano verilerini sızdırmak için kullanılabilecek saldırı vektörleri, Android sürümüne göre değişir:
- Android 10'dan (API düzeyi 29) eski Android sürümlerinde arka plan uygulamalarının ön planda çalışan uygulama pano bilgilerine erişmesine izin verilir. Bu durum, kötü niyetli kişilerin kopyalanan verilere doğrudan erişmesine olanak tanıyabilir.
- Android 12'den (API düzeyi 31) itibaren, bir uygulama her panodaki verilere erişip bunları yapıştırdığında kullanıcıya bir kısa mesaj gösterilir. Bu sayede saldırıların fark edilmeden devam etmesi zorlaşır. Ayrıca, kimliği tanımlayabilecek bilgileri korumak için Android,
ClipDescription.EXTRA_IS_SENSITIVEveyaandroid.content.extra.IS_SENSITIVEözel işaretini destekler. Bu sayede geliştiriciler, klavye GUI'sindeki pano içeriği önizlemesini görsel olarak karartabilir. Böylece, kopyalanan verilerin açık metin olarak görsel şekilde gösterilmesi ve kötü amaçlı uygulamalar tarafından çalınması önlenir. Yukarıda belirtilen işaretlerden birinin uygulanmaması, saldırganların omuz üzerinden gözetleme veya arka planda çalışırken ekran görüntüsü alan ya da meşru bir kullanıcının etkinliklerinin videosunu kaydeden kötü amaçlı uygulamalar aracılığıyla panoya kopyalanan hassas verileri çalmasına olanak tanıyabilir.
Etki
Yanlış pano kullanımının kötüye kullanılması, kullanıcıyla ilgili hassas veya finansal verilerin kötü amaçlı kişiler tarafından çalınmasına neden olabilir. Bu durum, saldırganların kimlik avı kampanyaları veya kimlik hırsızlığı gibi başka işlemler yapmasına yardımcı olabilir.
Çözümler
Hassas Verileri İşaretleme
Bu çözüm, klavye GUI'sindeki pano içeriği önizlemesini görsel olarak karartmak için kullanılır. Şifreler veya kredi kartı verileri gibi kopyalanabilen hassas veriler, ClipboardManager.setPrimaryClip() çağrılmadan önce ClipDescription.EXTRA_IS_SENSITIVE veya android.content.extra.IS_SENSITIVE ile işaretlenmelidir.
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);
En Yeni Android Sürümlerini Zorunlu Kılma
Uygulamanın Android 10 (API 29) veya sonraki Android sürümlerinde çalışmasını zorunlu kılmak, arka plan işlemlerinin ön plandaki uygulamadaki pano verilerine erişmesini engeller.
Uygulamanın yalnızca Android 10 (API 29) veya sonraki sürümlerde çalışmasını zorunlu kılmak için Android Studio'daki projenizde Gradle derleme dosyalarındaki sürüm ayarları için aşağıdaki değerleri ayarlayın.
Modern
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"
...
}
...
}
...
Pano içeriğini belirli bir süre sonra silme
Uygulamanın Android 10'dan (API düzeyi 29) daha düşük Android sürümlerinde çalışması amaçlanıyorsa herhangi bir arka plan uygulaması, pano verilerine erişebilir. Bu riski azaltmak için belirli bir süre sonra panoya kopyalanan tüm verileri temizleyen bir işlev uygulamak yararlı olur. Bu işlev, Android 13'ten (API düzeyi 33) itibaren otomatik olarak gerçekleştirilir. Daha eski Android sürümlerinde bu silme işlemi, uygulamanın koduna aşağıdaki snippet'i ekleyerek gerçekleştirilebilir.
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);
Kaynaklar
- Pano çerçevesi
- Uygulamanız pano verilerine eriştiğinde gösterilen sistem bildirimi
- Hassas içeriği panoya ekleme
- Android 10'daki gizlilik değişiklikleri
- Uygulama sürümü bilgilerini ayarlama