Güvenlik

“Insecure Data Storage” Güvenlik Zafiyetleri

Sistemde kullanılan veriler, ticari değeri yüksek ya da mahrem olabilir. Veri hırsızlıklarını önlemek için güvenliği yüksek sistemler oluşturulmalıdır.

Bu makale OWASP Foundation Top 10 Mobil güvenlik tehdidinden ikincisi olan “Insecure Data Storage” konusunu Android yapıları üzerinden açıklayacaktır.

Dilerseniz bir önceki bölümdeki “Improper Platform Usage” Güvenlik Zafiyetleri adlı makalemi inceleyebilirsiniz.

“Insecure Data Storage” Anlamı Nedir?

Insecure Data Storage konusu, mobil uygulamanızdaki verilerin cihazda tutulduğunda oluşabilecek güvenlik zafiyetlerinden bahsetmektedir.

En iyi güvenlik yöntemi herhangi bir türde hassas veriyi cihazda saklamaktan kaçınmaktır. Hassas veriler, bir kullanıcının kişisel bilgileri, API key vb. dir. Fakat bazı zamanlarda bu verileri cihazda tutmamız gerekebilir. Bu durumda kullanacağımız depolama yapılarını güvenlikli hale getirmeliyiz.

Android uygulamalarda çoğunlukla kullanılan veri depolama yöntemleri için güvenlik tehditlerine çözümler üreteceğim. Makale de bahsedeceğim veri depolama yöntemleri:

  1. Room veritabanı
  2. SharedPreferences
  3. Jetpack’s DataStore

Room Veritabanı

Room, SQLite veritabanı üzerinde bir soyutlama katmanıdır. Geliştiricilerin kolayca tablolar oluşturmasına, sorgular yazmasına ve veritabanları için standart CRUD işlemlerini otomatik olarak yapılmasında kolaylık sağlar.

Bir üretim uygulamasında kullanıcı kimliği, adı ve soyadı gibi kullanıcı verilerini içeren insecure-database adında çok basit bir veritabanı oluşturduğumuzu varsayalım. Komut satırında sqlite3 kullanarak veritabanını inceleyebilir, tabloları listeleyebilir ve içindekileri içeren tablo verilerini gösterebiliriz. Daha detaylı dokümanı sqlite.org bulunmaktadır.

Herhangi bir şifreleme yapısı kullanılmıyorsa veriler veritabanında düz metin olarak içerir. Bu durumda hayli tehlikelidir.

Room Veritabanı Şifreleme

Android veritabanı dosyalarını şifrelemek için SQLCipher adlı şifreleme yapısı bulunmaktadır.

Android Studio Ide ile oluşturduğum projemin app dizinin altındaki build.gradle dosyasını açıyoruz. Dependencies kod bloklarının arasına aşağıdaki kodları yerleştirerek SQLCipher kütüphanesini yüklüyoruz.

Room örneğinizi oluştururken SQLCipher kullanmak için, şifreleyeceğimiz veriyi SupportFactory ve SupportSQLiteOpenHelper.Factory sınıflarını birlikte kullanarak uygulayalım.

Veritabanı dosyasının AES şifrelemesi/şifresinin çözülmesi için benzersiz bir anahtar oluşturmak üzere sağlanan ‘ passphrase ‘ değişkenini kullanır. Bu durum SQLCipher dokümantasyonunda daha ayrıntılı açıklanmıştır.

Şifreleme işlemenin sonucunu doğrulamak için sqlcipher komutu ile “secure database” açabiliriz. PRAGMA key’i kodunuzda sağlanan aynı parola ile kullanarak, veritabanının şifresini çözmek ve içeriği bir kez daha düz metin olarak okumak mümkündür.

Verilerimizi minimum geliştirme çabasıyla güvenli bir şekilde sakladığımızı görmüş olduk.

“Android’de SQLite Veritabanı Şifreleme” adlı makalemde SQLCipher ile SQLite şifrelemenin örneğini inceleyebilirsiniz.

Shared Preferences

SharedPreferences API, Android 1 sürümünden bu yana kullanılan local veri depolama yapılarından biridir. Geliştiricilerin verilerini key-value (KVP) şeklinde bir depolanmaktadır. Örnek kod,

Bu kod, cihazın /data/data/{package name}/shared_prefs klasöründe bir XML dosyası oluşturur. Bu XML dosyasında veriler key-value (KVP) şeklinde kayıt olunur. Shell komut satırlarıyla adb kullanarak XML dosyasının içeriğini görüntüleyelim.

Üstte görüldüğü üzere “mySecretKey” adlı key’in değeri düz metin olarak saklandı.

SharedPreferences’ı Şifrelemek

SharedPreferences kullandığımızda verilerin düz metin olarak depolandığı için ciddi güvenlik zafiyetine sebep olduğunu anlattım. Bunun çözümü Jetpack Security (JetSec) kütüphanesini kullanarak veriyi şifrelemektir. Örnek kod,

Dilerseniz bu konuyu daha detaylı örnekleyen “Jetpack Security API Kullanımı” adlı makalemi inceleyebilirsiniz.

Jetpack Security ile şifrelerseniz XML’de veriler şu şekilde görünecektir.

DataStore

DataStore verileri eşzamansız, tutarlı ve işlemsel olarak depolamak için Kotlin coroutines ve Flow yapılarını kullanır. Örnek kod,

 

adb backup komutu ile DataStore’da bulunan tüm verilere erişmek mümkündür. Backup yöntemini kullandıktan sonra verileri datastore/insecure-data-store.preferences_pb içinde bulabilirsiniz. Bu dosya ilk bakışta biraz tuhaf görünebilir. Ancak Google’ın protobuf kütüphanesini kullanarak dosyanın içeriğini inceleyebilirsiniz.

 

DataStore Şifreleme

Şuanda DataStore şifreleme için resmi bir destek bulunmamaktadır. Fakat encrypted-datastore adında açık kaynak bir şifreleme kütüphanesi bulunmaktadır. Yalnız bu kütüphane bir şahış tarafından geliştirilmiştir. Güvenilir olmama ihtimalinden kaynaklı, kütüphaneyi kullanırken dikkatli olmanızı öneririm.

Kaynaklar

1- https://www.zetetic.net/sqlcipher/

2- https://proandroiddev.com/unpacking-android-security-part-2-insecure-data-storage-71f35107052a

3- https://www.tugbaustundag.com/jetpack-security-api-kullanimi/

 

 

 

Bülten
Bültene abone ol

Bültene abone olarak yeni makalelerimden haberdar olun.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir