iOS platformunda uygulamaların birbirleriyle ve sistemle etkileşimini sınırlayan sandbox mekanizması temel olarak ne üzerine kuruludur? Hangi izinler ve kısıtlamalar otomatik olarak uygulanıyor, ayrıca geliştiriciler bu kısıtlamaları güvenliği artırmak için nasıl yönetebilir? Çekirdek izoleleme, dosya sistemi erişimi ve API sınırlamaları hakkında genel bir bakış sunar mısınız? Sizlerin deneyimleri ve önerileri neler?
iOS'ta uygulama sandboxing nasıl çalışıyor ve güvenliğini nasıl artırabiliriz?
👁️ 138 görüntüleme💬 4 cevap❤️ 0 beğeni
4 Cevap
Daha dün çocuğun tabletinden kendi hesabıma "Plants vs Zombies 2" indirmeye çalışırken sandbox hatasıyla karşılaşmıştım kanka 😅 Valla sistemi anlayınca sandık ki her şeyi kısıtlıyor da, aslında izinleri developer elle ayarlayabiliyor. Mesela sistem otomatik veriyor foto/konum/kamerayı kullanma iznini ama dosya sistemine kafasına göre erişemiyorlar ya da dosyalarını belli bir klasöre sıkıştırıyorlar. Ben de uygulamaları ayrı ayrı birer "hapishane" gibi düşünüyorum artık 👀
iOS'un sandbox mekanizması temelde Linux benzeri **çekirdek (kernel) tabanlı izolasyon** üzerine kurulu, kanka. Android'deki **SELinux/SEAndroid** ya da Windows'daki **Mandatory Integrity Control (MIC)** gibi, her uygulama kendi kullanıcı/grup kimliğiyle (UID/GID) çalışır ve **dosya sistemindeki erişimleri sadece kendi sandığına (sandbox) ait klasörlere/verilere** izin verilir. Yani `/var/mobile/Applications/<UUID>/` altında uygulamanın kendi verisi dışında başka yere yazamaz. Sistem dosyaları, diğer uygulamaların verileri ya da kullanıcı verilerine (kişi listesi, fotoğraf vb.) sadece **API'ler üzerinden kontrollü erişim** var.
Güvenliği artırmak içinse geliştiricilerin elindeki en önemli şey **izinleri minimize etmek** ve **API'leri doğru kullanmak**. Örneğin, `NSPhotoLibraryUsageDescription` gibi izinleri eklerken sadece ihtiyaç olduğu kadar istemek, hatta mümkünse `PHPhotoLibrary` yerine `PHPickerViewController` kullanarak kullanıcının seçtiği resimleri alıp kural ihlali riskini azaltmak. Ayrıca **sandbox dışı işlemler** için extension'ları kullanmak (mesela paylaşım eklentisi) ya da **secure coding** (sensitive data loglamamak, Keychain kullanmak) gibi pratikler işe yarıyor. Android'deki **Scoped Storage** gibi sürekli değişen kuralların aksine iOS'ta kazandıkça kaybediyorsun tarzı bir kısıtlama var kısacası.
El sandbox de iOS se basa en un modelo de **aislamiento estricto por proceso**, donde cada app corre en su propio espacio seguro (sandbox) sin acceso directo a recursos del sistema o de otras apps. Esto recuerda al modelo de contenedores en Linux, pero con un enfoque mucho más estricto, ya que incluso el kernel limita las llamadas al sistema para evitar fugas. A diferencia de Android, donde el sandboxing depende más de permisos declarados por el usuario, en iOS es el sistema el que aplica restricciones por defecto: una app solo puede acceder a sus propios archivos, contactos limitados (si los hay) o datos de ubicaciones bajo condiciones muy controladas.
Para mejorar la seguridad, los desarrolladores pueden aprovechar **capas adicionales** como entitlements (permisos específicos para recursos como iCloud o HealthKit), cifrado de datos locales con File Protection, o usar APIs seguras como Keychain para credenciales. Un ejemplo práctico: si una app necesita acceder a fotos, debe usar el *PHPicker* en lugar de leer directamente el sistema de archivos, reduciendo el riesgo de manipulación. Lo curioso es que, pese a estas limitaciones, apps como WhatsApp o Signal logran ofrecer funcionalidades avanzadas (llamadas, almacenamiento en iCloud) gracias a que Apple proporciona APIs optimizadas dentro del mismo sandbox. Comparado con Windows, donde el sandboxing es opcional (ej. AppContainers en Edge), en iOS es obligatorio y está integrado desde el diseño.
iOS sandbox'ı, uygulamaların sistem kaynaklarına ve diğer uygulamaların verilerine erişimini sıkı bir şekilde kısıtlayan, Unix tabanlı izin modeli (UID/GID) ve Mandatory Access Control (MAC) prensiplerine dayalı bir koruma katmanıdır. Temelde her uygulama, kendi izole edilmiş ortamında (sandbox) çalışır ve sadece iOS'un çekirdek seviyesinde uygulanan kurallar çerçevesinde sistem API'lerine ve dosya sistemine erişebilir. Bu izolasyon, çekirdek izolasyonu (kernel isolation) ve dosya sistemi yönetimiyle desteklenir—uygulamaların `/var/mobile/Applications/` altında sadece kendi UUID'leriyle adlandırılan özel klasörlere erişimi vardır. Aynı şekilde, uygulamalar arası veri paylaşımı sadece açıkça tanımlanmış inter-process communication (IPC) mekanizmalarıyla (URL Scheme'ler, XPC servisleri, clipboard vs.) mümkün olur.
Güvenlik açısından otomatik uygulanan izinler arasında konum, mikrofon, fotoğraflar, takvim ve iletişim bilgilerine erişim taleplerinin kullanıcı onayına bağlanması (App Tracking Transparency ve Privacy Nutrition Labels gibi zorunlu bildirimler sayesinde) geliyor. Dosya sistemine gelince, uygulama sadece kendi konteyner dizinine (`Documents/`, `Library/`, `tmp/`) yazabilir, sistem ya da diğer uygulamaların dizinlerine doğrudan erişim yasak. API kısıtlamalarında da Core Foundation, keychain ve entitlement'lar (örneğin, `keychain-access-groups` ya da `com.apple.security.network.client`) aracılığıyla hassas fonksiyonların kullanımı kontrol altına alınıyor. Mesela bir uygulama, Wi-Fi ağ bilgilerine erişmek için özel bir entitlement'a sahip olmalı.
Geliştiriciler için sandbox güvenliğini artırmanın anahtarlarıysa:
- **En az yetki prensibi**: Uygulamaya ihtiyacı olmayan herhangi bir yetkiyi (örneğin, konum ya da fotoğraf erişimini) talep etmemek. iOS 14+’ta ortaya çıkan "Approximate Location" seçeneğiyle hassas verilerin paylaşımını minimize edebilirsin.
- **Custom URL Scheme/Universal Links kullanımında dikkat**: Bu scheme’ler yoluyla veri gönderirken input doğrulaması yap, çünkü kötü niyetli linkler yoluyla uygulama içinde istenmeyen eylemler tetiklenebilir.
- **Entitlement'ları minimal tut**: Gereksiz entitlement'lar (örneğin, `keychain-access-groups`’ı çok geniş tanımlamak) saldırı yüzeyini artırır. Apple’ın güvenlik sertifikalarını incelemesinden geçen özel haklar dışındakileri kullanmamak en iyisi.
- **Dosya sistemi izolasyonunu abartma**: Uygulama verilerini salt okunur ya da şifreli olarak sakla (örneğin, `NSFileProtectionComplete` seviyesinde), özellikle hassas dosyaları. iOS’in dosya koruma etiketleri (`NSFileProtectionKey`) devreye girince, cihaz kilitliyken veriler otomatik olarak şifrelenmiş oluyor.
- **XPC servisleriyle kod ayrımı**: Ağır ve hassas işlemleri ana uygulama sürecinden ayırarak buffer overflow gibi saldırı vektörlerini minimize etmek. Core Data ya da sistem framework’leriyle çalışırken bellek yönetimine dikkat et, null pointer’lara karşı koruma geliştir.
Bence sandbox’ı bypass etmek neredeyse imkansız olsa da, geliştiricilerin bu sıkı kurallardan fırsatçılıkla yararlanmaması gerekiyor. Mesela, uygulamalar arası veri paylaşımını kısıtlayan kuralı, iCloud Keychain ya da Shared iPad kullanımındaki entitlement’lar sayesinde esnetmek mümkün, ama bunu yaparken kullanıcı gizliliğini ihlal edip etmediğini iyice kontrol etmek lazım. Unutma, iOS sandbox’ı güvenlik için bir kalkan—ama geliştiricinin dikkatsizliği de onu delik deşik edebilir.