Bak dostum, gel biraz dertleşelim. LinkedIn'de veya konferanslarda herkes 'Shift Left' diyor, 'Otomatik güvenlik taramaları devrim yarattı' diyor. Hatta bazıları var ki, MobSF'ten aldığı PDF raporunu doğrudan müşteriye veya yönetime 'Alın, tertemiz, güvenliyiz' diye sunuyor. İşte tam o noktada büyük bir yanılgı başlıyor. Herkes MobSF övüyor, herkes 'Statik analiz her şeyi çözer' sanıyor ama prod ortamında, gerçek bir saldırganın karşısında o statik raporlar sadece kağıt israfından ibaret. Bir aracı çalıştırmakla siber güvenlik uzmanı olunmaz; o aracın neden 'temiz' dediği halde uygulamanın patladığını anlamakla olunur.
Mobil güvenlik, sadece kodun içinde 'password' kelimesini aratmak değildir. O sandbox dediğimiz yapının, işletim sisteminin sunduğu o sözde güvenli limanın içinde ne fırtınalar kopuyor, beraber bakalım. testCompany bünyesinde yaptığımız simülasyonlarda gördük ki, en büyük açıklar kodun syntaktik yapısında değil, mantık akışında ve geliştiricinin 'Buraya kimse erişemez' dediği yerlerde saklı.
Yerel Depolama: 'Güvenli' Sanılan Kara Delik
Android tarafında SharedPreferences, iOS tarafında UserDefaults... Geliştirici arkadaşım buraya session token'ı, kullanıcı verilerini hatta bazen API anahtarlarını 'Nasıl olsa sandbox var, başka uygulama erişemez' diyerek atıyor. Evet, root'suz bir cihazda teorik olarak erişemez. Ama biz Red Team tarafında 'teorik' olanla ilgilenmiyoruz. Cihazın root'lu olduğunu, kullanıcının kötü niyetli bir uygulama yüklediğini veya fiziksel erişim sağlandığını varsayıyoruz.
Bir uygulamanın verilerini nasıl sakladığına bakarken sadece dosyaya yazıp yazmadığına bakmayın. Verinin formatına bakın. Çoğu zaman karşımıza çıkan manzara şu:
<!-- Zararsızlaştırılmış/Defanged Örnek: SharedPreferences içerisinde saklanan hassas veri -->
<map>
<string name="user_session">dGVzdENvbXBhbnlfMTIzNDU2X2FwaV9rZXk=</string>
<boolean name="is_admin" value="false" />
</map>
Yukarıdaki user_session değerine bakıp 'Aaa, encode edilmiş' diyen varsa hemen o terminali kapatsın. Base64 bir şifreleme değildir, bir encoding formatıdır. Bunu base64 -d ile çözdüğünde testCompany_123456_api_key gibi kabak gibi ortada olan bir veriyle karşılaşırsın. Çözüm mü? EncryptedSharedPreferences kullanmak bir lüks değil, zorunluluktur. Ama daha da önemlisi, cihazda ne kadar az veri bırakırsan o kadar güvendesin.
SSL Pinning: Kırılması Çocuk Oyuncağı mı?
Bir diğer efsane de SSL Pinning. 'Biz sertifika sabitledik, kimse trafiğimizi dinleyemez' diyorlar. Gerçekten mi? Burp Suite'i kurup, cihazın sertifikasını sisteme tanıttıktan sonra Frida ile tek bir script çalıştırarak o 'aşılmaz' dediğiniz duvarı saniyeler içinde geçebiliyoruz. SSL Pinning bir güvenlik katmanıdır ama asla tek başına bir çözüm değildir.
Eğer uygulamanız sadece SSL Pinning'e güveniyorsa, biz Frida ile şu tarz bir hook atarak o kontrolü bypass ederiz:
// Zararsızlaştırılmış Frida Mock Script
// testCompany uygulaması için SSL Pinning bypass mantığı
Java.perform(function () {
var CertificatePinner = Java.use('com.testcompany.security.CertificateChecker');
CertificatePinner.verify.implementation = function (host, certificates) {
console.log("[+] Bypassing SSL Pinning for: " + host);
// Kontrolü her zaman 'true' döndürecek şekilde manipüle ediyoruz
return true;
};
});
Bu kod çalıştığında, senin uygulaman 'Tamam, her şey yolunda, güvenli sunucuya bağlandım' sanırken, aradaki saldırgan tüm trafiği (şifreler, tokenlar, kişisel veriler) Cleartext olarak okumaya başlar. Savunma tarafında ne yapmalı? Sadece pinning yapmak yetmez; uygulamanın çalışma zamanında (Runtime) kendi bütünlüğünü kontrol etmesi (RASP - Runtime Application Self-Protection) gerekir.
Hardcoded Sırlar ve Tersine Mühendislik
Bir APK'yı veya IPA'yı açıp içine bakmak, bir web sitesinin 'kaynağı görüntüle' demesinden çok da farklı değil artık. ProGuard veya R8 kullandınız diye kodunuzun 'okunamaz' olduğunu sanıyorsanız, yanılıyorsunuz. Obfuscation sadece işi biraz zorlaştırır, imkansız kılmaz.
Özellikle üçüncü parti kütüphanelerin (Firebase, Stripe, AWS vb.) API key'lerini doğrudan kodun içine gömen arkadaşlara bir çift sözüm var: O key'leri oradan çekmek yaklaşık 30 saniyemizi alıyor.
// YAPILMAMASI GEREKEN (Zararsızlaştırılmış)
public class ApiConfig {
public static final String API_KEY = "prod_testCompany_xyz789_secret";
public static final String BASE_URL = "https://api.example.com/v1";
}
Bunun yerine ne mi yapmalı? Hassas verileri asla ama asla statik olarak tutmamalısın. Backend tarafında dinamik olarak çekilen veya Native katmanda (C++ / NDK) daha karmaşık bir yapıda saklanan (yine de tam güvenli değil ama daha zor) yöntemleri tercih etmelisin. En iyisi mi? O key ile yapılabilecek işlemleri backend tarafında yetkilendirme ile kısıtlamalısın. Key çalınsa bile saldırganın elinde kısıtlı bir yetki kalmalı.
Deep Link Hijacking: Uygulamanın Arka Kapısı
Modern mobil uygulamalar birbirleriyle konuşmayı sever. Deep Linkler bu işin can damarı. Ama sen testcompany://reset-password?token=123 gibi bir yapıyı dikkatsizce kurarsan, cihazdaki kötü niyetli başka bir uygulama bu şemayı dinleyebilir ve kullanıcının şifre sıfırlama token'ını çalabilir.
App Links (Android) ve Universal Links (iOS) kullanmak, bu işin 'hijack' edilmesini engellemek için geliştirildi. Eğer hala eski usul intent-filter kullanıyorsan, aslında kapıyı tam kapatmamışsın demektir.
Gerçek Bir Savunma Stratejisi
Sadece kod yazmak yetmez, yazdığın kodun nasıl saldırıya uğrayacağını da bilmen lazım. Mobil güvenlikte 'Silver Bullet' (Sihirli Değnek) yok. Ama şu adımlar seni %90 oranında kurtarır:
- Kök Dizin Kontrolü (Root/Jailbreak Detection): Sadece 'cihaz root'lu mu?' diye bakma. Frida'nın yüklü olup olmadığını, debug portlarının açık olup olmadığını da kontrol et.
- Bütünlük Kontrolü (Integrity Check): Uygulamanın imzası (Signature) değişmiş mi? Google Play Integrity API veya Apple DeviceCheck gibi modern çözümleri entegre et.
- Veri Minimizasyonu: Cihazda veri saklama. Saklaman gerekiyorsa sadece Keychain/Keystore kullan ve veriyi biyometrik doğrulama şartına bağla.
- Anti-Debugging: Uygulamanın bir debugger'a (gdb, lldb) bağlanmasını zorlaştır.
Şunu unutma; otomasyon araçları sana sadece 'düşük asılı meyveleri' (low-hanging fruits) verir. Gerçek bir Red Team operasyonunda biz o meyvelere değil, ağacın köküne odaklanırız. Eğer sen de sistemlerini korumak istiyorsan, araçların raporlarına değil, saldırganın mantığına odaklanmalısın.
Umarım bu küçük teknik gezi, bir sonraki commit'ini atmadan önce seni biraz düşündürür. Mobil dünya vahşi bir orman ve sandbox sadece bir yanılsama. Güvende kal dostum.
