← Blog'a Dön

Android Neden Sandbox Kullanır?

Android Neden Sandbox Kullanır?
Her Uygulamanın Kendi Adası
Telefonunuzda bankacılık uygulaması var. Yanı sıra onlarca oyun, sosyal medya uygulaması, alışveriş platformu. Bunların hepsi aynı cihazda, aynı işlemcide, aynı bellekte çalışıyor.
Bu tablo güvenlik açısından son derece tehlikeli olabilirdi. Ama değil. Çünkü Android başından itibaren her uygulamayı birbirinden yalıtılmış bir ortama — sandbox'a — hapseder.

Sandbox Nedir?
Sandbox, bir uygulamanın çalışabileceği ama dışına çıkamayacağı sınırlı bir ortamdır. Kum havuzu metaforu kasıtlıdır: Çocuklar kum havuzunda istediklerini yapabilir, ama kum havuzunun dışındaki her şey onlara kapalıdır.
Android'de her uygulama kendi sandbox'ında yaşar. Kendi dosyalarına erişebilir, kendi belleğini kullanabilir, kendi işlemlerini yürütebilir. Ama başka bir uygulamanın dosyalarına, belleğine ya da verilerine doğrudan erişemez.
Bu yalıtım hem güvenliği hem de kararlılığı sağlar. Güvenliği sağlar çünkü kötü niyetli bir uygulama diğerlerine zarar veremez. Kararlılığı sağlar çünkü bir uygulamanın çökmesi diğerlerini etkilemez.

Linux'un Temel Katkısı: UID İzolasyonu
Android'in sandbox modeli sıfırdan icat edilmemiştir. Linux'un onlarca yıllık kullanıcı izolasyon mekanizması üzerine inşa edilmiştir.
Linux'ta her kullanıcının benzersiz bir UID (User ID) vardır. Bir kullanıcının dosyaları başka bir kullanıcı tarafından okunamaz, yazılamaz ya da çalıştırılamaz — izin verilmedikçe.
Android bu mekanizmayı uygulamalara uygular. Her uygulama kurulduğunda ona benzersiz bir Linux UID atanır. Bu UID uygulamanın kimliğidir. Dosya sistemi izinleri, bellek alanı, sistem kaynakları — bunların tamamı bu UID üzerinden kontrol edilir.
Yani bankacılık uygulamanız u0_a42 UID'siyle çalışırken oyun uygulamanız u0_a87 UID'siyle çalışır. Linux çekirdeği bu iki kullanıcının birbirinin verilerine erişmesini işletim sistemi düzeyinde engeller. Bu engeli aşmak için Android'i değil, Linux çekirdeğini aşmak gerekir.

Her Uygulama Kendi Sürecinde
Sandbox yalıtımının ikinci boyutu süreç izolasyonudur. Android'de her uygulama varsayılan olarak kendi Linux sürecinde çalışır.
Bir sürecin belleği başka bir süreç tarafından okunamaz. Bu işlemci mimarisi ve işletim sistemi tarafından donanım düzeyinde garanti edilir. Bir uygulama başka bir uygulamanın belleğini okumaya çalışırsa işletim sistemi bu girişimi anında engeller ve süreci sonlandırır.
Bu yalıtım şu anlama gelir: Bir uygulamada ciddi bir güvenlik açığı olsa bile bu açık yalnızca o uygulamanın sandbox'ını etkiler. Saldırgan o uygulamanın verilerine ulaşabilir ama telefonun geri kalanına, diğer uygulamalara ya da sistem dosyalarına geçemez — en azından ek açıklar olmadan.

İzin Sistemi: Sandbox'ın Kapıları
Sandbox mutlak bir hapishane değildir. Uygulamaların dışarıyla iletişim kurması gerekir. Kameraya erişmek, konuma bakmak, kişileri okumak, internet kullanmak — bunların tamamı sandbox dışındaki kaynaklardır.
Android bu erişimleri izin sistemi ile yönetir. Her uygulama hangi dış kaynaklara erişmek istediğini Manifest dosyasında bildirir. Bazı izinler kurulum sırasında otomatik verilir, bazıları kullanıcıdan çalışma zamanında onay gerektirir.
Bu sistem sandbox'a kapılar ekler. Ama her kapının anahtarı farklı birisindedir: Kullanıcı. Kullanıcı onaylamadığı kapıyı uygulama açamaz. Kullanıcı verdiği izni geri alabilir. Ve Android her izin talebini açıkça gösterir — hangi uygulamanın neye erişmek istediği gizlenemez.

SELinux: Sandbox'ın Üzerine Eklenen Katman
Android 4.3'ten itibaren sandbox modeli SELinux (Security-Enhanced Linux) ile güçlendirilmiştir.
SELinux, Linux'un standart izin modelinin ötesine geçen zorunlu erişim kontrolü (mandatory access control) sağlar. Normal Linux izinlerinde bir süreç UID'sine izin verilmiş her şeye erişebilir. SELinux buna ek olarak "bu süreç yalnızca şu tür kaynaklara erişebilir" kurallarını çekirdek düzeyinde zorlar.
Bu ne anlama gelir? Bir uygulama root yetkisi kazansa bile SELinux politikaları onu sınırlamaya devam edebilir. Bir süreç exploit edilse bile SELinux o sürecin yapabileceklerini kısıtlar. Bu katman sandboxing'i çok daha derin ve saldırılara karşı çok daha dayanıklı kılar.

Geliştirici Perspektifinden Bakış
Sandbox modelini anlamak birkaç pratik sonuç doğurur.
Uygulamalar arası veri paylaşımı için özel mekanizmalar kullanılmak zorundadır. Başka bir uygulamanın dosyasına doğrudan erişmek yerine ContentProvider, FileProvider ya da Intent paylaşımı kullanılır. Bu mekanizmalar sandbox'ın kontrollü kapılarıdır.
Kendi uygulamanızın verilerini korumak için ekstra çaba gerekmez — sandbox bunu otomatik yapar. Ama hassas verileri şifrelemek, özellikle cihaz şifresi olmayan ya da root edilmiş cihazlarda ek bir güvence katmanı ekler.
Ve her istenen izni gerçekten kullanıp kullanmadığınızı sorgulayın. Kullanılmayan izinler hem kullanıcı güvenini zedeler hem de gereksiz bir saldırı yüzeyi oluşturur.