macOS Uygulama Güvenliği: Sandbox Mimarisi ve Çalışma Mantığı
macOS Sandbox (App Sandbox), Apple'ın işletim sistemi düzeyinde sunduğu ve uygulamaların sisteme veya kullanıcı verilerine verebileceği zararı minimize etmeyi amaçlayan bir erişim kontrol teknolojisidir. Bir uygulamanın "sandbox" içinde olması, onun hayali bir cam fanus içinde çalışması gibidir; dış dünyayı görebilir ama izin verilmedikçe hiçbir şeye dokunamaz.
1. Temel Kavram: "Minimum Ayrıcalık" İlkesi
Geleneksel işletim sistemlerinde bir uygulama, onu çalıştıran kullanıcının tüm yetkilerine sahiptir. Eğer siz fotoğraflarınıza erişebiliyorsanız, çalıştırdığınız basit bir hesap makinesi uygulaması da teknik olarak fotoğraflarınızı silebilir veya internete yükleyebilir.
macOS Sandbox bu mantığı değiştirir. Bir uygulama, yalnızca işini yapması için mutlaka gereken kaynaklara erişebilir. Geri kalan her şey varsayılan olarak yasaktır (Deny by Default).
2. Sandbox Nasıl Çalışır? (Teknik Bileşenler)
macOS Sandbox, kernel (çekirdek) seviyesinde çalışan karmaşık bir yapıdır. Süreç şu bileşenlerle yönetilir:
TrustedBSD MAC Framework: Sandbox, sistem çağrılarını (syscall) denetlemek için bu alt yapıyı kullanır. Bir uygulama "dosya aç" dediğinde, bu istek önce kernel'daki sandbox filtresine takılır.
Sandbox.kext: Kernel seviyesindeki bu uzantı, kuralları zorla uygular (enforcement).
Entitlements (Yetkiler): Uygulamanın içinde gömülü olan XML formatındaki dijital izin belgeleridir. Geliştirici, "Bu uygulama kamerayı kullanacak" veya "Sadece ağ çıkışı yapacak" gibi beyanlarda bulunur.
Container (Konteyner): Her sandboxed uygulama için
~/Library/Containers/altında özel bir klasör oluşturulur. Uygulama burayı kendi "Ana Dizini" (Home Directory) sanır.
3. Sandboxing Mekanizmasının Katmanları
A. Dosya Sistemi İzolasyonu (Containers)
Sandboxed bir uygulama, kullanıcının gerçek ana dizinine (Documents, Desktop vb.) doğrudan erişemez. Bunun yerine ona özel bir klasör yapısı sunulur.
Uygulama
/Users/Adiniz/Documentsklasörüne yazmak istediğinde, sistem bunu otomatik olarak~/Library/Containers/UygulamaID/Data/Documentsyoluna yönlendirir.
B. Yetkilendirme (Entitlements)
Bir uygulama Sandbox içindeyken standart sistem kaynaklarına erişmek için "anahtarlara" ihtiyaç duyar. Örneğin:
com.apple.security.network.client: İnternete bağlanma izni.com.apple.security.device.camera: Kamera erişim izni.com.apple.security.files.user-selected.read-write: Kullanıcının diyalog penceresiyle seçtiği dosyaya erişim izni.
C. Powerbox (Kullanıcı Onaylı Erişim)
Peki, sandbox içindeki bir uygulama nasıl oluyor da bizim seçtiğimiz bir fotoğrafı açabiliyor? Burada devreye Powerbox girer.
Siz "Dosya Aç" dediğinizde, o pencereyi uygulama değil macOS'in kendisi (güvenilir bir süreç) açar. Siz dosyayı seçtiğiniz anda, macOS geçici olarak o spesifik dosya için uygulamaya bir "güvenlik bileti" (token) verir.
4. Sandbox'ın Faydaları ve Sınırlamaları
| Özellik | Faydası |
| Zararlı Yazılım Koruması | Bir uygulama hacklense bile saldırgan sadece o uygulamanın konteynerine hapsolur. |
| Sistem Kararlılığı | Uygulamalar sistem dosyalarını değiştiremez veya silemez. |
| Gizlilik | Uygulamalar mikrofon, kamera veya rehber gibi verilere izinsiz erişemez. |
Sınırlamalar:
Performans: Her sistem çağrısının denetlenmesi çok küçük bir gecikmeye (overhead) neden olur.
Geliştirici Zorluğu: Uygulamalar arası veri paylaşımı (IPC) daha karmaşık hale gelir.
5. Uygulamanın Sandbox Durumu Nasıl Kontrol Edilir?
Kendi bilgisayarınızda hangi uygulamaların sandbox içinde olduğunu görebilirsiniz:
Etkinlik Monitörü'nü (Activity Monitor) açın.
Sütun başlıklarına sağ tıklayın ve "Sandbox" seçeneğini işaretleyin.
Listede uygulamaların yanında "Evet" veya "Hayır" yazdığını göreceksiniz. (App Store'dan inen tüm uygulamalarda bu "Evet" olmak zorundadır.)
Özet
macOS Sandbox, "güven ama doğrula" yerine "güvenme ve sınırla" mantığıyla çalışır. Bu sayede kullanıcı, indirdiği bir uygulamanın tüm sistemi ele geçirmeyeceğinden emin olur.
Özellikle Xcode üzerinden uygulama geliştirenler veya sistem yöneticileri için Sandbox'ın mutfağına, yani Entitlements ve Sandbox Profile (.sb) dosyalarına biraz daha yakından bakalım.
5. Uygulama İzinlerinin Beyanı: Entitlements
Bir uygulamayı Sandbox'a dahil etmek için derleme aşamasında bir .entitlements dosyası oluşturulur. Bu, aslında anahtar-değer (key-value) çiftlerinden oluşan bir listedir.
Örneğin, uygulamanızın hem internete çıkmasını hem de kamerayı kullanmasını istiyorsanız, dosyanız şu şekilde görünür:
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
</dict>
Kritik Bilgi: Eğer uygulamanızda com.apple.security.app-sandbox anahtarı true ise ama ağ izni tanımlı değilse, uygulamanız kod düzeyinde hatasız olsa bile internete erişmeye çalıştığı anda sistem tarafından engellenir (Crashes or Silent Failure).
6. Arka Plandaki Dil: Sandbox Profile (.sb)
macOS, hangi uygulamanın neye erişebileceğini tanımlamak için Sandbox Profile Language (SPL) adı verilen, Lisp tabanlı bir dil kullanır. Sistemdeki yerleşik servislerin kuralları /System/Library/Sandbox/Profiles/ dizininde .sb uzantılı dosyalarda saklanır.
Örnek bir kural mantığı şöyledir:
;; Sadece belirli bir klasöre okuma yetkisi ver
(allow file-read* (subpath "/Library/Fonts"))
;; Ağ bağlantısını tamamen yasakla
(deny network*)
Geliştiriciler genelde bu dosyaları elle yazmaz (Xcode bunu halleder), ancak sistem seviyesinde çalışan servisler (daemons) için Apple bu profilleri çok katı bir şekilde tanımlar.
7. Sandbox ve Container Yapısı (Derinlemesine)
Uygulama Sandbox içine girdiğinde, sistem ona özel bir "ev" oluşturur. Bu yapı sayesinde uygulama, sistemin geri kalanından izole edilir.
Gerçek Yol:
/Users/nuri/Library/Containers/com.uygulama.id/Data/Görünen Yol: Uygulama için bu dizin
/Users/nuri/(Home) gibi davranır.
Bu klasörün içinde Documents, Library, SystemData gibi standart klasörlerin sembolik bağlarını (symlink) görürsünüz. Uygulama bir dosya kaydettiğinde aslında bu "sahte" ev klasörünün içine yazar. Uygulamayı sildiğinizde, bu konteyner da silinir ve sistemde çöp kalmaz.
8. Güvenlik Duvarı: Securityd ve Sandboxd
Sistemde iki önemli süreç bu trafiği yönetir:
securityd: Uygulamanın dijital imzasını ve yetkilerini (entitlements) kontrol eder. İmzası bozuk bir uygulama Sandbox kurallarına uysa bile çalıştırılmaz.sandboxd: Bir kural ihlali olduğunda (örneğin uygulama izinsiz bir klasöre yazmaya çalıştığında) bunu loglar ve işlemi durdurur.
İpucu: Eğer bir uygulamanın neden düzgün çalışmadığını merak ediyorsanız, Console (Konsol) uygulamasını açıp sandbox terimini aratabilirsiniz. Burada "Violation: deny file-write-data" gibi hata raporlarını görebilirsiniz.
Özellikle Pardus ETAP üzerinde projelerdeki deneyiminle (Python, Flutter ve Tauri), bu uygulamaları macOS dünyasına taşırken Sandbox yapısına uyumlu hale getirmek işin en kritik kısmıdır.
İşte adım adım bir uygulamanın "Sandboxed" olarak paketlenme ve dağıtılma süreci:
1. Uygulama Kimliği ve İmzalama (Code Signing)
macOS üzerinde bir uygulamanın Sandbox içinde çalışabilmesi için Apple tarafından tanınan bir geliştirici sertifikasıyla imzalanması şarttır.
Pardus/Linux'ta: Bir binary dosyasını doğrudan çalıştırabilirsiniz.
macOS'ta: İmzasız ve Sandbox'sız bir uygulama "Tanımlanamayan Geliştirici" uyarısı verir ve Gatekeeper tarafından engellenir.
2. Framework Bazlı Sandbox Yapılandırması
Hangi teknolojiyi kullandığına bağlı olarak Sandbox'ı aktif etme yöntemlerin değişir:
A. Python (PyQt6/PySide6) Uygulamaları için
Python scriptlerini bir .app paketine dönüştürmek için genelde PyInstaller veya briefcase kullanılır.
Bir
entitlements.plistdosyası oluşturun.PyInstaller ile build alırken
--codesign-identityve--entitlementsparametrelerini ekleyin.Kritik: Python yorumlayıcısının kendisini de Sandbox içinde çalışacak şekilde imzalamanız gerekir.
B. Flutter Uygulamaları için
Flutter, macOS için yerel Xcode projesi oluşturur.
macos/Runner/DebugProfile.entitlementsveRelease.entitlementsdosyalarını açın.com.apple.security.app-sandboxdeğerini<true/>yapın.Uygulamanızın ihtiyaç duyduğu (dosya okuma, ağ vb.) diğer yetkileri Xcode arayüzündeki "Signing & Capabilities" sekmesinden işaretleyin.
C. Tauri Uygulamaları için
Tauri zaten güvenlik odaklı olduğu için Sandbox ile çok barışıktır.
src-tauri/tauri.conf.jsoniçindebundle > macOS > entitlementsyoluna dosyanızı ekleyin.Tauri build alırken otomatik olarak Apple'ın Sandbox gereksinimlerini paketine dahil eder.
3. Dosya Erişimi ve "User-Selected" Mantığı
Sandbox içindeki bir Python veya Flutter uygulaması, kullanıcıdan bağımsız olarak /Users/nuri/Documents/notlar.txt dosyasını açamaz. Eğer uygulamanızın bir dosya seçmesi gerekiyorsa:
Powerbox Kullanımı: Uygulama içinde standart bir "Dosya Aç" (File Picker) penceresi tetiklenir.
Geçici İzin: Kullanıcı dosyayı seçtiği anda macOS, uygulamanın o dosyaya özel bir "Security-Scoped Bookmark" (güvenli bilet) oluşturmasına izin verir.
Sonuç: Uygulama sadece o spesifik dosyaya erişebilir, tüm klasöre değil.
4. Sandbox'ı Test Etme ve Hata Ayıklama
Bir uygulama Sandbox'a alındığında genelde "dosya yazamıyor" veya "internet bağlantısı yok" gibi hatalar verir. Bunu debug etmek için terminali kullanabilirsin:
# Sandbox ihlallerini canlı izlemek için (Terminal üzerinden)
log stream --predicate 'subsystem == "com.apple.sandbox.reporting"' --level debug
Bu komut, uygulamanızın hangi kurala takıldığını (örneğin: deny file-write-data /private/var/tmp/...) anlık olarak gösterir.
5. Dağıtım: App Store vs. Ad-Hoc
App Store: Tüm uygulamaların Sandbox içinde olması zorunludur. Apple'ın inceleme ekibi (App Review) tüm entitlements listesini kontrol eder.
Dışarıdan Dağıtım (Developer ID): Sandbox zorunlu değildir ancak güvenlik ve kullanıcı güveni için yapılması şiddetle önerilir. Ayrıca Notarization (Apple'ın uygulamayı tarayıp onaylaması) süreci Sandbox ile daha sağlıklı ilerler.
Bir Sonraki Adım
Özellikle Pardus Sınıf Asistanı ve Osmanlıca İmla projelerin düşünüldüğünde, macOS Sandbox yapısında karşına çıkacak en önemli iki senaryo SQLite veritabanı yönetimi ve harici cihaz (USB) etkileşimidir.
İşte bu projeleri macOS'a taşırken dikkat etmen gereken teknik detaylar:
1. SQLite Veritabanı ve Dosya Yazma (Osmanlıca İmla Projesi)
Osmanlıca İmla uygulaman Python/Flutter tabanlı olduğu ve bir SQLite veritabanı kullandığı için şu kurallara uyman gerekir:
Veri Yolu Hatası: Eğer veritabanı dosyasını uygulamanın yanına (executable yanına) koymaya çalışırsan, Sandbox buna izin vermez. Uygulama "Read-only file system" hatası verir.
Çözüm (Application Support): Veritabanını mutlaka
~/Library/Application Support/UygulamaAdı/dizini altına oluşturmalısın. Sandboxed uygulama buraya tam erişim yetkisine sahiptir.Entitlement: Eğer kullanıcıdan bir Excel listesi alıp veritabanına işleyeceksen,
com.apple.security.files.user-selected.read-writeyetkisini ekleyerek kullanıcının dosyayı seçmesini sağlamalısın.
2. USB Algılama ve Harici Medya (Sınıf Asistanı Projesi)
Pardus Sınıf Asistanı projesinde USB takıldığında uyarı verme gibi özellikler macOS tarafında Sandbox engeline takılabilir:
Erişim Kısıtlaması: Sandboxed uygulamalar, sistemdeki tüm USB aygıtlarını kafasına göre göremez.
Çözüm (Hardware Access): USB aygıtlarıyla doğrudan iletişim kurmak veya bir dosya sistemi olarak USB'ye erişmek için
com.apple.security.device.usbyetkisini tanımlaman gerekir.USB'den Dosya Okuma: Eğer USB içindeki bir dosyayı okuyacaksan, kullanıcıya o USB klasörünü bir kez seçtirmen gerekebilir (Powerbox aracılığıyla).
3. Zamanlanmış Görevler ve Kapatma (Tahta Kilit Paneli)
Interactive whiteboard projende kullandığın "belirli saatte kapatma" veya "ekranı kilitleme" özellikleri Sandbox içinde en çok kısıtlanan alanlardır:
Sistem Komutları: Sandbox içindeki bir uygulama
shutdown -h nowveyaosascript(AppleScript) üzerinden sistem ayarlarını değiştiremez.Çözüm: Bu tür işlemler için uygulamanın yanına küçük bir "Helper Tool" yazılması ve bu tool'un Sandbox dışında (Privileged Helper) çalışması gerekebilir. Ancak bu, App Store için geliştirilen uygulamalarda kabul edilmeyen bir yöntemdir.
Uygulama İçin Pratik Öneri
Şu an üzerinde çalıştığın projelerden birini (örneğin Osmanlıca İmla) macOS için paketlemeyi denemek istersen;
Flutter kullanıyorsan
macosklasöründeki.entitlementsdosyalarını düzenleyebiliriz.Python kullanıyorsan
PyInstallerile özel birspecdosyası oluşturup imzalama sürecini simüle edebiliriz.

Yorumlar