iOS Pentest Checklist: Pratik Bir Doğrulama Listesi

iOS uygulamalarını test ederken izlenecek adımlar: veri saklama, keychain, ATS, jailbreak tespiti, Frida ve ağ trafiği analizi.

13 dk okuma
ibrahimsql
2.428 kelime

iOS Pentest Checklist: Pratik Bir Doğrulama Listesi#

Çoğu iOS testi hala 2014 tarihli şablonu izliyor: IPA'yı çek, binary içinde grep çalıştır, trafiği proxy'e sok, pinning'i hook'la. Bu şablon çok şey kaçırıyor. iOS 14'ten iOS 26'ya kadar platform sertleştirilmiş keychain varsayılanları, Data Protection sınıfları, App Tracking Transparency, Privacy Manifest'leri, Privacy Nutrition Label'ları, zorunlu universal link davranışı, daha sıkı ATS varsayılanları ve iOS 26 ile URLSession ve Network API'lerinde varsayılan olan TLS 1.3 + X25519MLKEM768 (kuantum güvenli anahtar değişimi) desteği ekledi. Aşağıdaki kontrol listesi 2026'daki gereksinimleri karşılar, 2014 tarihli blog zincirini değil.

Sıra önemlidir. Statik analiz neye bakacağını söyler. Runtime kontrolleri doğrular. Trafik analizi ikisini sunucuya bağlar. Bulgu tek bir katmanda kalıyorsa ikinci bir kontrolde hayatta kalana kadar bulgu değildir.

Tehdit modeli ve korunan varlıklar#

İlk komuttan önce uygulamanın kime güvendiğini yaz. Sonraki her kontrol buna bağlanır.

                        GÜVEN SINIRI
  +---------------------------------------------+
  |                cihaz (iOS 26.x)              |
  |  +-----------+   +----------------------+   |
  |  | uygulama  |   | OS sandbox'ları      |   |
  |  | prosesi   |<--| keychain, data       |   |
  |  |           |   | protection, app      |   |
  |  |           |   | groups, ATS          |   |
  |  +-----+-----+   +----------------------+   |
  +--------|------------------------------------+
           |   HTTPS + token
           v
  +---------------------------------------------+
  |                arka uç                       |
  |  API, token basan servis, push sağlayıcı    |
  +---------------------------------------------+

Saldırganın elde edebilecekleri: kaybolan/çalınan telefon, aynı cihazda kötü niyetli uygulama,
jailbreak'li ortam, ağ konumu (kafe Wi-Fi, MITM), TestFlight yapısı olan içeriden biri.

Her sınır veri veya güven taşıyan bir yerdir. Her birini ayrı test et.

SınırNe geçerDoğrulanacak kontrol
cihazdan ağaAPI çağrıları, token'larATS, pinning, TLS yapılandırması
uygulamadan kullanıcı verisineyerel dosyalar, keychainData Protection sınıfı, dosya izinleri
uygulamadan başka uygulamalarapasteboard, scheme, app groupsentitlement'lar, scheme handler'lar
uygulamadan donanımabiyometri, Secure EnclaveLAContext, keystore semantiği
uygulamadan arka ucakimlik iddiaları, rol ipuçlarısunucu tarafı yetkilendirme

1. Test ortamını hazırlayın#

Güvenli bir lab cihazı seçmek işin temelidir. Üretim hesabı değecek adımları lab cihazında tutun. Test telefonunu sık güncelleyin ki uygulamanın desteklediği minimum iOS sürümüne göre karar verebilin.

  • macOS'ta Xcode Command Line Tools kurulu olmalı.
  • Homebrew ile gereksinimler: brew install --cask burp-suite objection, pip3 install frida-tools, brew install libimobiledevice.
  • Charles veya Burp CA sertifikası cihaza yüklenmeli.
  • Cihaz ayarları: Ayarlar > Genel > Yazılım Güncelleme açık tutulmalı.
  • Lab için bir Apple ID ve ikinci bir test hesabı kullanın.

iOS 26'nın TLS değişimini unutma: URLSession ve Network API'leri artık varsayılan olarak X25519MLKEM768 ile TLS 1.3 konuşur. Hook kullanmadan önce TLS 1.2 veya altına düşen bir uç nokta tek başına bulgudur.

2. Uygulamayı cihazdan çekin#

IPA dosyasını elde etmek için birkaç yol var. TestFlight üzerinden dağıtılan bir iç build varsa en temiz kaynak odur. Yoksa App Store'dan indirilen uygulamanın şifreli IPA'sı jailbroken bir cihazda frida-ios-dump veya ipatool ile çıkarılır.

mkdir -p work && cd work pip3 install ipatool # şifreyi çözüp dışa aktar: ipatool download -b com.example.app -o app.ipa

Paketi açın.

unzip -o app.ipa -d unzipped ls unzipped/Payload/com.example.app/

.app paketi ikili dosyayı, Info.plist'i, gömülü framework'leri ve asset kataloglarını barındırır. Hedef React Native veya Flutter ise pakette Hermes bytecode dosyası veya libapp.so olup olmadığına bak. Bunları geri çevirmek uygun yükleyiciyi gerektirir, sadece Hopper yetmez.

3. Statik analiz: Info.plist ve entitlement'lar#

Info.plist uygulamanın hangi izinleri bildirdiğini, hangi URL scheme'lerini açtığını ve keyfi istekleri nasıl ele aldığını gösterir.

plutil -p unzipped/Payload/com.example.app/Info.plist | head -n 60

Bakılması gereken alanlar:

  • CFBundleURLTypes: deep link yüzeyi.
  • NSAppTransportSecurity: NSAllowsArbitraryLoads: true ise ATS kapalı demektir.
  • UIFileSharingEnabled / LSSupportsOpeningDocumentsInPlace: iTunes üzerinden dosya görünürlüğü.
  • Kamera, mikrofon ve konum kullanım açıklamaları.
  • MinimumOSVersion: eski hedef bilinen hataları taşıyabilir.
  • NSPrivacyTracking ve PrivacyInfo.xcprivacy manifest dosyaları.

Entitlement'lar imzanın gerçekten ne izin verdiğini gösterir.

codesign -d --entitlements :- unzipped/Payload/com.example.app/com.example.app

keychain-access-groups, com.apple.developer.associated-domains, aps-environment, com.apple.security.application-groups ve com.apple.developer.healthkit alanlarına dikkat edin. Geniş bir keychain grubu paylaşımı aynı grupla imzalı tüm uygulamaların ortak öğeleri okumasına izin verir. App Groups paylaşılan konteyner bulgusudur, nezaket özelliği değil.

4. İkili dosya ve kütüphane kontrolleri#

Fat binary arm64 ve x86_64 taşır. lipo ile bakın.

lipo -info unzipped/Payload/com.example.app/com.example.app nm -u unzipped/Payload/com.example.app/com.example.app | head strings unzipped/Payload/com.example.app/com.example.app | grep -i password | head

strings API anahtarlarını, gizli URL'leri, iç host adlarını ve ayrıntılı hata mesajlarını sızdırır. Sabit kodlanmış secret'lar doğrudan rapora girer.

Statik araçlar:

  • class-dump sınıf adlarını ve metod imzalarını çıkarır.
  • Hopper Disassembler veya IDA Free ikili dosyayı açar.
  • MobSF hızlı bir rapor üretir: izinler, şüpheli API kullanımı, ağ profili.

Gömülü framework'lerin kendi plist girdilerini kontrol edin. Üçüncü parti SDK'lar genellikle ana uygulamanın hiç denetlemediği scheme'ler ve ATS istisnaları bildirir.

Deep link'ler sık atlanır. Uygulamayı açan özel bir scheme, crafted bir link üzerinden uygulama içi aksiyonları tetikleme yüzeyidir.

xcrun simctl openurl booted "myapp://transfer?amount=100"

Gerçek cihazda linki Safari veya Notlar'a yapıştırıp dokunun. Universal link tarafında apple-app-site-association dosyasının alan adından nasıl servis edildiğini doğrulayın.

Test edilecek konular:

  • Zorunlu parametre eksikse uygulama yine de aksiyon alıyor mu?
  • URL içinde token taşınıyor mu, taşınıyorsa loglara düşüyor mu?
  • Scheme uygulamayı açtıktan sonra giriş atlanıyor mu?
  • Güvenilmeyen girdi bir WebView'a veriliyor mu?

2026 beklentisi özel scheme'lerin eski yüzey olduğudur. Hassas aksiyonun özel scheme üzerinden çalışması ve universal link tarafının yarım kalması rapora girer.

6. Ağ katmanı: ATS ve trafik#

ATS yanlış yapılandırılmışsa uygulama düz trafiğe düşebilir. Info.plist içinde NSAllowsArbitraryLoads: true zaten bulgudur.

Cihazda Burp veya Charles kurmak için:

Ayarlar > Genel > VPN ve Aygıt Yönetimi > kurulu profil, sonra Ayarlar > Genel > Hakkında > Sertifika Güven Ayarları > köke tam güven.

# cihazda Wi-Fi ayarlarından proxy kurun, sonra host tarafında: frida-ps -Uai # cihazın USB üzerinden göründüğünü doğrula

Uygulamayı açıp trafiği izleyin. Şunlara dikkat:

  • İstekler uçtan uca HTTPS mi?
  • Sertifika doğrulaması zorunlu mu, aşılabiliyor mu?
  • Token her istekte header ile mi taşınıyor, cookie ile mi?
  • Sunucu her yanıtta hangi alanları tekrar ediyor?
  • Happy path'te proxy'nin hiç tetiklemediği cleartext fallback yolu var mı? NSAllowsLocalNetworking ve özel URLProtocol implementasyonlarını avlayın.

Tespit: sunucu erişim logları her istemci bağlantısı için TLS 1.2 veya 1.3 göstermelidir. TLS 1.0 veya 1.1 handshake artışı eski client build'ine ya da pinning bypass denemesine işaret eder.

7. Jailbreak tespiti#

Canlı uygulamalar jailbreak'li cihazı tespit etmeye çalışır. Bu kontrolleri geçmeden lab cihazında ilerleyemezsiniz. İki yol: elle inceleme veya Frida bypass.

frida-ps -Uai frida -U -f com.example.app -l jailbreak_bypass.js --no-pause

Anlaşılan kapsam içinde kalın. Kendi yapınız veya açık izni olan build ile çalışmak işi yasal ve savunulabilir kılar.

Son birkaç iOS döngüsünden beri /Applications/Cydia.app açma gibi naive kontroller çalışmıyor. 2026'nın gerçek durumu: Ağustos 2026'daki Dopamine 3.0, A14-A17/M1-M2'de iOS 16.5.1-17.3.1 ve yalnızca A12/A13'te iOS 26.0-26.0.1'i kapsıyor; palera1n checkm8 cihazları (A8-A11) için ve semi-tethered; iOS 17.4 ve sonrası A14+ cihazlarda - 2026'da modern donanımın çoğu iOS 26.x'te - public jailbreak yok, dolayısıyla o telefonlarda lab çalışması bilinen parolalı şifreli yedekleme, geliştirici modu build'leri veya daha eski bir cihaz üzerinden yürür. TXM (Trusted Execution Monitor) ve PPL, bir kernel exploit'in ikinci bir bütünlük katmanıyla da dövüşmesi demek; public araçların belirli çiplerle sınırlı kalmasının sebebi bu.

Modern tespit karışık bir liste kullanır:

  • uzun bir yolda dosya varlığı
  • canOpenURL("cydia://") varyantları
  • konteyner dışına yazmayı deneme tabanlı sandbox self-check
  • FridaGadget, CydiaSubstrate, Substitute için dyld taraması
  • DYLD_INSERT_LIBRARIES ortam değişkeni kontrolü

Hedefin hangisini kullandığını test edin. Dosya varlığı kontrollerini yamalayan bir bypass dyld taramasını ıskalar, tersi de geçerli. Sadece bypass'ın başarılı olduğunu değil, hangi tekniği yendiğini de raporlayın.

8. SSL pinning bypass#

Birçok uygulama sertifika doğrulamasını sıkılaştırır; bu, uygulamanın ağda konuşurken Burp görünümünün boş kalmasıyla kendini gösterir. Frida script'i deneyin.

frida -U -f com.example.app -l ssl_pinning_bypass.js --no-pause

Script'ler iOS sürümlerine göre farklı davranır. Hata iki nedenden kaynaklanır: özel socket yığını ya da sertifika şeffaflık loglarına bağlı doğrulama döngüsü. İkincisinde script değişmelidir.

Objection burada devreye girer.

objection --gadget com.example.app explore # objection> ios sslpinning disable

Bazı uygulamalar pinning'i SecTrust katmanında, bazıları NSURLSession delegate'inde, bazıları üçüncü parti ağ SDK'sında yapar. Hook seçmeden önce pinning'in yerini bulun. AFNetworking içinde pinning yapan bir uygulamaya SecTrust bypass uygulamak sessizce hiçbir şey yapmaz.

9. Yerel veri saklama#

Uygulama veriyi nerede tutuyor ve kimler okuyabiliyor.

  • NSUserDefaults içinde token veya parola.
  • Documents veya Library/Application Support altında SQLite dosyaları.
  • Keychain öğeleri: kSecAttrAccessible yeterince sıkı mı? kSecAttrAccessibleAfterFirstUnlock yaygındır ve gevşektir. kSecAttrAccessibleWhenUnlockedThisDeviceOnly ile yedekleme hariç tutmayı karşılaştırın.
  • Log çıktısında PII veya token.
idevicesyslog | grep -i exampleapp

Jailbreak'li cihazda keychain'i boşaltın.

security find-generic-password -l exampleapp -w

NSFileProtection eksikse yedek veriyi cihaz silinmeden taşır. iOS'ta Data Protection sınıfları kritiktir: NSFileProtectionComplete ile NSFileProtectionNone arasındaki fark, telefon kilitliyken verinin gitmesiyle açık cihaz adli görüntüsünde hâlâ durması arasındaki farktır.

10. WebView ve JavaScript köprüsü#

WKWebView ana makineyle mesaj alışverişi yaptığında iki yönlü bir saldırı yüzeyi oluşur. Safari > Develop > cihaz > uygulama ile Web Inspector ekleyin.

  • Her evaluateJavaScript yükü doğrulanıyor mu?
  • postMessage origin kontrolü yapıyor mu?
  • Üçüncü parti linkler WebView içinde güvenle açılıyor mu?
  • WKScriptMessageHandler herhangi bir frame'e * origin ile açılıyor mu?

Her origin'e açık bir handler, aynı WebView içindeki düşmanca sayfa tarafından çağrılabilir.

11. Biyometrik ve yerel doğrulama#

Face ID veya Touch ID kullanımını test edin. LAContext evaluatePolicy'i hook'layın ve sonucun çevrilebilir olup olmadığını görün.

Interceptor.attach(ObjC.classes.LAContext["- evaluatePolicy:localizedReason:reply:"].implementation, { onEnter: function(args) { console.log("evaluatePolicy"); } });

Yerel doğrulama aşılabiliyorsa uygulamanın sunucuda ikinci bir faktöre ihtiyacı vardır. Yerel biyometri ödeme yetkilendiriyorsa kendi başına bulgudur.

12. Uygulama geçişi ve arka plan#

Uygulama arka plana giderken kendini maskeliyor mu kontrol edin. applicationDidEnterBackground içinde ekranı temizlemeyi unutan uygulamalar App Switcher'da veri sızdırır.

  • applicationProtectedDataDidBecomeUnavailable işleniyor mu?
  • Kısa bir arka plan molası oturumu açık tutuyor mu?
  • Token'lar kilitli cihazda hâlâ geçerli mi?

13. Push bildirimleri#

Cihaz token'ının nasıl saklandığına ve kullanıldığına bakın. Çalınan token tek başına bu kullanıcıya sahte push göndermez, ama sızan token sunucu temizliğini gevşetir.

  • Token yerel olarak düz metin mi tutuluyor?
  • Token backend'e gönderilirken istemci yanıtı doğruluyor mu?
  • Push gövdesi PII taşıyor mu?

14. Çerez ve oturum yönetimi#

Oturum ömrü, çıkış sonrası token silinmesi, eşzamanlı oturum limiti. Oturum hataları OWASP Mobile Top 10 içinde yüksek sıradadır.

ls ~/Library/Developer/CoreSimulator/Devices/*/data/Library/Cookies

Sunucu tarafında cookie bayrakları HttpOnly, Secure ve SameSite ile ayarlanmalıdır.

15. Kriptografi incelemesi#

Zayıf kriptografi cihaz üstü veri güvenliğini bozar. Keychain ve saklama katmanlarında kullanılan algoritmaları doğrulayın.

  • AES kullanılıyorsa anahtar nereden geliyor. Sabit bir anahtar bulgudur.
  • Base64 kodlamadır, şifreleme değil. strings çıktısında sık base64 görülmesi incelemeye değer.
  • TLS 1.0 veya 1.1'e düşmek bulgudur. iOS 26'da URLSession varsayılan olarak X25519MLKEM768'li TLS 1.3 konuşur, yani 1.0/1.1 düşümü uygulamanın özellikle geri aldığını gösterir.
openssl s_client -connect api.example.com:443 -tls1_1

16. Tersine mühendislik ve Frida hook'ları#

Özel fonksiyonları Frida script'leriyle hook'layın.

Interceptor.attach(Module.getExportByName(null, "CCCrypt"), { onEnter: function(args) { console.log("CCCrypt called"); } });

İmzalama, dosya okuma ve yazma noktalarını hook'lamak bu sınırları geçen parametreleri açığa çıkarır. SecStaticCodeCheckValidity ile sonucun zorlanıp zorlanamayacağını görün. Uygulama ikili dosyasını doğrulamadan açıyorsa değiştirilmiş bir paket aynı process bağlamında çalışabilir.

17. objection, needle, frida-ios-dump#

objection günlük ihtiyaçları karşılar. iOS modülleri keychain dump, SSL pinning disable, dosya sistemi listesi ve pasteboard görüntüleyici içerir.

objection --gadget com.example.app explore # objection> ios keychain dump # objection> ios bundles show_frameworks

needle, frida-ios-dump, class-dump-z ve ipatool seti tamamlar. Her hedef için toolchain sürümünü sabitleyin, Frida ve Objection hızlı değişir.

18. App Groups ve paylaşılan konteyner#

App Group kullanıldığında aynı grupla imzalı tüm uygulamalar konteyneri paylaşır. Entitlement'larda com.apple.security.application-groups sorgulayın.

ls ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Shared/AppGroup

Grup içindeki her plist ve SQLite dosyası gruptaki diğer uygulamalar tarafından okunabilir. Simülatörde bunu incelemek kolaydır; release build'de aynı listeyi doğrulamak için şifresi çözülmüş IPA'yı kullanın.

19. İmza ve bütünlük kontrolleri#

Uygulama kendi imzasını doğruluyor mu. SecStaticCodeCheckValidity'i hook'layıp sonucun true olarak zorlanabildiğini görün.

Interceptor.attach(ObjC.classes.NSFileManager["- fileExistsAtPath:"].implementation, { onLeave: function(retval) { console.log("file check: " + retval); } });

20. Privacy Manifest ve ATT#

2024 baharından beri Apple uygulamalar için Privacy Manifest zorunlu kıldı. Paketten PrivacyInfo.xcprivacy dosyasını okuyun. Zorunlu neden API'lerini (dosya zaman damgası, disk alanı, etkin klavye, sistem ata süresi) bildirir. Uygulama bu API'leri kullanıyor ama manifest boşsa bu hem uyum hem parmak izi yüzeyidir. Bildirilen nedenleri binary içindeki gerçek kullanımla karşılaştırın. Uyumsuzluk uyum bulgusudur ve aynı API'nin parmak izi için erişilebilir olduğunu da gösterir.

NSUserTrackingUsageDescription açık adının bulunduğunu ve IDFA'ya dokunmadan önce requestTrackingAuthorization çağrıldığını kontrol edin. IDFA kullanımda olup prompt eksikse App Review malzemesidir, sadece gizlilik notu değil.

21. Entitlement derin geçişi#

codesign -d --entitlements :- unzipped/Payload/com.example.app/com.example.app codesign -dv unzipped/Payload/com.example.app/com.example.app 2>&1

Şunlara bakın:

  • com.apple.developer.associated-domains: listelenen her alan universal link yüzeyidir, prob'la.
  • aps-environment: release build için production beklenir.
  • com.apple.security.application-groups: paylaşılan konteyner kapsamı, yukarıda işlendi.
  • com.apple.developer.healthkit, com.apple.developer.networking.multipath: her biri ayrı bir prob yolu açar.
  • com.apple.security.application-groups eksikliği paylaşılan konteyneri temize çıkarmaz; yine de dosya sistemine bakın.

22. Mobile ile arka ucu eşleştirin#

İstemci tarafı bulguları API sonuçlarıyla birleştirin. Sunucu istemciden gelen role güveniyorsa istemcinin değiştirebildiği her parametre tahmine dönüşür.

  • Sunucu istemciden gelen role güveniyor mu?
  • Rate limit var mı?
  • Hata mesajları iç durum sızdırıyor mu?
  • Sunucu jailbreak veya pinning kararlarını istemci doğrulamasına bağlamış mı? İstemci tarafı bypass asla sunucu güveni üretmemeli.

Tespit ve azaltma matrisi#

YüzeyTespit sinyaliOlması gereken azaltma
ATS kapalıplist'te NSAllowsArbitraryLoads, loglarda TLS 1.0ATS açık, alan istisnası yok
Lab'da pinning bypass'ıssl_pinning_bypass.js sonrası Burp trafiğiistemcide jailbreak tespiti, sunucu tarafı uygulama durumu
Paylaşılan keychainbirden çok binary de aynı access groupdar access group, cihaza özel öğeler
Düz metin fallback'iNSAllowsLocalNetworking, özel URLProtocolyok, anahtarı kaldır
Saklamada zayıf kriptohook ile sabit anahtarla CCCryptSecure Enclave'e gömülü anahtarlar, imza için SecKey
Scheme handler kötüye kullanımıparametrelerin auth'suz application:openURL:'ya ulaşmasıyalnızca universal link, aksiyondan önce auth

Akış özeti#

1. IPA çek       -> 2. statik analiz (plist, entitlement, strings)
     |                          |
     v                          v
3. lab cihazı         4. trafik + ATS durumu
     |                          |
     v                          v
5. jailbreak bypass -> 6. pinning bypass
     |                          |
     v                          v
7. saklama / keychain / app groups / WebView
     |
     v
8. biyometri / yaşam döngüsü / arka plan
     |
     v
9. arka uç bulgularıyla birleştir -> rapor

Özet#

iOS testi belirli bir sırayla çalışır. Statik analiz, trafik incelemesi ve runtime hook'ları birlikte planlanmak zorundadır; hiçbiri tek başına durmaz. Bu liste geniş bir tarama verir, ama tek bir madde uygulamanın zayıf olduğunu kanıtlamaz. Zaman dar ise öncelik verin: veri sızıntısı, yetkilendirme boşlukları, deep link enjeksiyonu, pinning bypass. Raporu bu dört eksende yazmak anlatıyı temiz tutar.

---
Bu yazıyı paylaş:
TwitterLinkedInFacebook

Ne düşünüyorsun?

Tepki bırakarak geri bildirim ver

İlgili Yazılar