Android Güvenlik Ekibi, Android cihazlarda olası güvenlik sorunlarının önlenmesine ilişkin düzenli olarak bilgi talepleri almaktadır. Ayrıca zaman zaman cihazları tespit edip cihaz üreticilerine ve etkilenen iş ortaklarına olası sorunlar hakkında bilgi veriyoruz.
Bu sayfa, deneyimlerimize dayalı olarak en iyi güvenlik uygulamalarını sağlar, geliştiricilere sunduğumuz Güvenlik için Tasarlama belgelerini genişletir ve cihazlara sistem düzeyinde yazılım oluşturmaya veya yüklemeye özgü ayrıntıları içerir.
Bu en iyi uygulamaların benimsenmesini kolaylaştırmak için Android Güvenlik Ekibi, mümkün olduğu durumlarda testleri Android Uyumluluk Test Paketi (CTS) ve Android Lint'e dahil eder. Cihaz uygulayıcılarını, diğer Android kullanıcılarına yardımcı olabilecek testlere katkıda bulunmalarını teşvik ediyoruz (güvenlikle ilgili testleri root/cts/tests/tests/security/src/android/security/cts
adresinde görüntüleyin).
Gelişme süreci
Geliştirme süreçlerinizde ve ortamınızda aşağıdaki en iyi uygulamaları kullanın.
Kaynak kodunu inceleme
Kaynak kodu incelemesi, bu belgede tanımlananlar da dahil olmak üzere çok çeşitli güvenlik sorunlarını tespit edebilir. Android, hem manuel hem de otomatik kaynak kodu incelemesini şiddetle tavsiye eder. En iyi uygulamalar:
- Android SDK'yı kullanarak tüm uygulama kodlarında Android Lint'i çalıştırın ve belirlenen sorunları düzeltin.
- Yerel kod, arabellek taşmaları ve tek tek hatalar gibi bellek yönetimi sorunlarını tespit edebilen otomatik bir araç kullanılarak analiz edilmelidir.
- Android derleme sistemi, bu amaç için kullanılabilecek AdresSanitizer ve UnDefinitionBehaviorSanitizer gibi LLVM temizleyicilerin çoğunu destekler.
Otomatik testi kullanma
Otomatik test, aşağıda tartışılan çeşitli sorunlar da dahil olmak üzere çok çeşitli güvenlik sorunlarını tespit edebilir. En iyi uygulamalar:
- CTS, güvenlik testleriyle düzenli olarak güncellenmektedir; Uyumluluğu doğrulamak için CTS'nin en son sürümünü çalıştırın.
- Sorunları erken tespit etmek ve düzeltme süresini kısaltmak için CTS'yi geliştirme süreci boyunca düzenli olarak çalıştırın. Android, günde birden çok kez oluşturulan otomatik derleme sürecimizdeki sürekli entegrasyonun bir parçası olarak CTS'yi kullanır.
- Cihaz üreticileri, hatalı biçimlendirilmiş girişlerle yapılan testler (fuzz testi) dahil olmak üzere, arayüzlerin güvenlik testlerini otomatikleştirmelidir.
Sistem görsellerini imzalama
Sistem görüntüsünün imzası, cihazın bütünlüğünün belirlenmesi açısından kritik öneme sahiptir. En iyi uygulamalar:
- Cihazlar herkesin bildiği bir anahtarla imzalanmamalıdır.
- Cihazları imzalamak için kullanılan anahtarlar, sınırlı, denetlenebilir erişim sağlayan bir donanım güvenlik modülü (HSM) de dahil olmak üzere, hassas anahtarların işlenmesine yönelik endüstri standardı uygulamalarla tutarlı bir şekilde yönetilmelidir.
Uygulamaları imzalama (APK'ler)
Uygulama imzaları cihaz güvenliğinde önemli bir rol oynar ve yazılım güncellemelerinin yanı sıra izin kontrolleri için de kullanılır. Uygulamaları imzalamak için kullanılacak anahtarı seçerken, bir uygulamanın yalnızca tek bir cihazda mı yoksa birden fazla cihazda ortak olarak mı kullanılabileceğini dikkate almak önemlidir. En iyi uygulamalar:
- Başvurular kamuya açık bir anahtarla imzalanmamalıdır.
- Uygulamaları imzalamak için kullanılan anahtarlar, sınırlı, denetlenebilir erişim sağlayan bir HSM dahil, hassas anahtarların işlenmesine yönelik endüstri standardı uygulamalarla tutarlı bir şekilde yönetilmelidir.
- Uygulamalar platform anahtarıyla imzalanmamalıdır.
- Aynı paket adına sahip uygulamalar farklı anahtarlarla imzalanmamalıdır. Bu genellikle farklı cihazlar için bir uygulama oluştururken, özellikle de platform anahtarını kullanırken meydana gelir. Uygulama cihazdan bağımsızsa cihazlar arasında aynı anahtarı kullanın. Uygulama cihaza özelse cihaz ve anahtar başına benzersiz paket adları oluşturun.
Uygulamaları yayınlama
Google Play, cihaz üreticilerine tam bir sistem güncellemesi yapmadan uygulamaları güncelleme olanağı sağlar. Bu, güvenlik sorunlarına müdahaleyi ve yeni özelliklerin sunulmasını hızlandırabileceği gibi, uygulamanızın benzersiz bir paket adına sahip olmasını sağlamanın bir yolunu da sağlayabilir. En iyi uygulamalar:
- Tam kablosuz (OTA) güncelleme gerektirmeden otomatik güncellemelere izin vermek için uygulamalarınızı Google Play'e yükleyin. Yüklenen ancak yayınlanmayan uygulamalar kullanıcılar tarafından doğrudan indirilemez ancak uygulamalar yine de güncellenir. Uygulamayı daha önce yüklemiş olan kullanıcılar uygulamayı yeniden yükleyebilir ve/veya diğer cihazlara yükleyebilir.
- Şirketinizin ticari markasını kullanmak gibi, şirketinizle açıkça ilişkilendirilen bir uygulama paketi adı oluşturun.
- Üçüncü taraf kullanıcıların paket adını taklit etmesini önlemek için cihaz üreticileri tarafından yayınlanan uygulamalar Google Play mağazasına yüklenmelidir. Bir cihaz üreticisi, uygulamayı Play Store'da yayınlamadan bir cihaza yüklerse, başka bir geliştirici aynı uygulamayı yükleyebilir, aynı paket adını kullanabilir ve uygulamanın meta verilerini değiştirebilir. Uygulama kullanıcıya sunulduğunda bu ilgisiz meta veriler kafa karışıklığı yaratabilir.
Olaylara yanıt verme
Harici tarafların, cihaza özgü güvenlik sorunları hakkında cihaz üreticileriyle iletişim kurabilme olanağına sahip olması gerekir. Güvenlik olaylarını yönetmek için herkesin erişebileceği bir e-posta adresi oluşturmanızı öneririz. En iyi uygulamalar:
- Security@sirketiniz.com veya benzeri bir adres oluşturun ve bunu duyurun.
- Birden fazla cihaz üreticisinin Android işletim sistemini veya Android cihazlarını etkileyen bir güvenlik sorununun farkına varırsanız, bir Güvenlik hatası raporu göndererek Android Güvenlik Ekibi ile iletişime geçmelisiniz.
Ürün uygulaması
Bir ürünü uygulamaya koyarken aşağıdaki en iyi uygulamaları kullanın.
Kök süreçlerin yalıtılması
Kök süreçler ayrıcalık yükseltme saldırılarının en sık hedefidir; bu nedenle kök süreçlerin sayısını azaltmak ayrıcalık yükseltme riskini azaltır. CTS, kök süreçleri listeleyen bilgilendirici bir test içerir. En iyi uygulamalar:
- Cihazlar gerekli minimum kodu root olarak çalıştırmalıdır. Mümkün olduğunda root işlemi yerine normal bir Android işlemi kullanın. ICS Galaxy Nexus'un yalnızca altı kök süreci vardır: vold, inetd, zygote, tf_daemon, ueventd ve init. Bir işlemin bir cihazda root olarak çalıştırılması gerekiyorsa, genel olarak incelenebilmesi için süreci bir AOSP özellik isteğinde belgeleyin.
- Mümkün olduğunda kök kod, güvenilmeyen verilerden yalıtılmalı ve IPC aracılığıyla erişilmelidir. Örneğin, kök işlevselliğini Binder aracılığıyla erişilebilen küçük bir Hizmete indirin ve imza iznine sahip Hizmeti, ağ trafiğini işlemek için düşük ayrıcalıklara sahip olan veya hiç ayrıcalıkları olmayan bir uygulamaya gösterin.
- Kök süreçlerin bir ağ yuvasını dinlememesi gerekir.
- Kök süreçleri, uygulamalar (örneğin, Java VM) için genel amaçlı bir çalışma zamanı sağlamamalıdır.
Sistem uygulamalarını ayırma
Genel olarak önceden yüklenmiş uygulamalar, paylaşılan sistem UID'siyle çalışmamalıdır. Bununla birlikte, bir uygulamanın sistemin paylaşılan UID'sini veya başka bir ayrıcalıklı hizmetini kullanması gerekiyorsa uygulama, kullanıcılar tarafından yüklenen üçüncü taraf uygulamaların erişebileceği hiçbir hizmeti, yayın alıcısını veya içerik sağlayıcısını dışa aktarmamalıdır. En iyi uygulamalar:
- Cihazlar sistem olarak gerekli minimum kodu çalıştırmalıdır. Mümkün olduğunda, sistem UID'sini yeniden kullanmak yerine, kendi UID'sine sahip bir Android işlemi kullanın.
- Mümkün olduğunda sistem kodu güvenilmeyen verilerden yalıtılmalı ve IPC yalnızca diğer güvenilir işlemlere açık hale getirilmelidir.
- Sistem işlemleri bir ağ yuvasını dinlememelidir.
Yalıtım süreçleri
Android Uygulama Korumalı Alanı, uygulamalara kök işlemler ve hata ayıklayıcılar da dahil olmak üzere sistemdeki diğer işlemlerden izolasyon beklentisi sağlar. Hata ayıklama, uygulama ve kullanıcı tarafından özel olarak etkinleştirilmediği sürece hiçbir uygulama bu beklentiyi ihlal etmemelidir. En iyi uygulamalar:
- Kök süreçleri, belgelenmiş bir Android hata ayıklama yöntemi kullanılmadığı sürece, bireysel uygulama veri klasörlerindeki verilere erişmemelidir.
- Kök süreçler, belgelenmiş bir Android hata ayıklama yöntemi kullanılmadığı sürece uygulamaların belleğine erişmemelidir.
- Cihazlar, diğer uygulamaların veya işlemlerin verilerine veya hafızasına erişen herhangi bir uygulamayı içermemelidir.
SUID dosyalarının güvenliğini sağlama
Yeni setuid programlarına güvenilmeyen programlar tarafından erişilmemelidir. Setuid programları sıklıkla root erişimi elde etmek için kullanılabilecek güvenlik açıklarının bulunduğu konumdur; bu nedenle, setuid programının güvenilmeyen uygulamalar için kullanılabilirliğini en aza indirmeye çalışın. En iyi uygulamalar:
- SUID işlemleri, Android güvenlik modelini atlatmak için kullanılabilecek bir kabuk veya arka kapı sağlamamalıdır.
- SUID programları hiçbir kullanıcı tarafından yazılamaz olmalıdır.
- SUID programları herkes tarafından okunabilir veya çalıştırılabilir olmamalıdır. Bir grup oluşturun, SUID ikili dosyasına erişimi bu grubun üyeleriyle sınırlandırın ve SUID programını yürütebilmesi gereken tüm uygulamaları bu gruba yerleştirin.
- SUID programları, kullanıcıların cihazlara kök salması için yaygın bir kaynaktır. Bu riski azaltmak için SUID programlarının kabuk kullanıcısı tarafından çalıştırılabilir olmaması gerekir.
CTS doğrulayıcı, SUID dosyalarını listeleyen bilgilendirici bir test içerir; CTS testlerine göre bazı setuid dosyalarına izin verilmez.
Dinleme yuvalarının güvenliğini sağlama
Bir aygıt herhangi bir arabirimdeki herhangi bir bağlantı noktasını dinlediğinde CTS testleri başarısız olur. Bir arıza durumunda Android, aşağıdaki en iyi uygulamaların kullanıldığını doğrular:
- Cihazda dinleme portu bulunmamalıdır.
- Dinleme bağlantı noktaları OTA olmadan devre dışı bırakılabilmelidir. Bu bir sunucu veya kullanıcı cihazı yapılandırma değişikliği olabilir.
- Kök işlemler hiçbir bağlantı noktasını dinlememelidir.
- Sistem UID'sine ait işlemler hiçbir bağlantı noktasını dinlememelidir.
- Soket kullanan yerel IPC için uygulamaların, erişimi bir grupla sınırlı olan bir UNIX Etki Alanı Soketi kullanması gerekir. IPC için bir dosya tanımlayıcı oluşturun ve bunu belirli bir UNIX grubu için +RW yapın. Tüm istemci uygulamalarının bu UNIX grubu içinde olması gerekir.
- Birden fazla işlemciye sahip bazı cihazlar (örn. uygulama işlemcisinden ayrı bir radyo/modem), işlemciler arasında iletişim kurmak için ağ soketlerini kullanır. Bu gibi durumlarda, işlemciler arası iletişim için kullanılan ağ soketinin, cihazdaki yetkisiz uygulamaların erişimini önlemek için yalıtılmış bir ağ arayüzü kullanması gerekir (yani, cihazdaki diğer uygulamaların erişimini önlemek için
iptables
kullanılmalıdır). - Dinleme bağlantı noktalarını yöneten arka plan programlarının hatalı biçimlendirilmiş verilere karşı dayanıklı olması gerekir. Google, yetkisiz bir istemci ve mümkünse yetkili bir istemci kullanarak bağlantı noktasına yönelik bulanıklık testi yapabilir. Herhangi bir çökme, uygun önem derecesine sahip hata olarak dosyalanacaktır.
Verilerin günlüğe kaydedilmesi
Verilerin günlüğe kaydedilmesi, bu verilerin açığa çıkma riskini artırır ve sistem performansını azaltır. Android cihazlara varsayılan olarak yüklenen uygulamalar tarafından hassas kullanıcı verilerinin günlüğe kaydedilmesi sonucunda çok sayıda kamu güvenliği olayı meydana geldi. En iyi uygulamalar:
- Uygulamalar veya sistem hizmetleri, üçüncü taraf uygulamalardan sağlanan, hassas bilgiler içerebilecek verileri kaydetmemelidir.
- Uygulamalar, normal çalışmanın bir parçası olarak herhangi bir Kişisel Tanımlayıcı Bilgiyi (PII) kaydetmemelidir.
CTS, sistem günlüklerinde potansiyel olarak hassas bilgilerin varlığını kontrol eden testler içerir.
Dizin erişimini sınırlama
Herkes tarafından yazılabilen dizinler, güvenlik zayıflıkları oluşturabilir ve bir uygulamanın güvenilen dosyaları yeniden adlandırmasına, dosyaları değiştirmesine veya sembolik bağlantı tabanlı saldırılar gerçekleştirmesine olanak sağlayabilir (saldırganlar, güvenilir bir programı yapmaması gereken eylemleri gerçekleştirmesi için kandırmak amacıyla bir dosyaya sembolik bağlantı kullanabilir). Yazılabilir dizinler ayrıca bir uygulamanın kaldırılmasının, uygulamayla ilişkili tüm dosyaların düzgün şekilde temizlenmesini de engelleyebilir.
En iyi uygulama olarak, sistem veya kök kullanıcılar tarafından oluşturulan dizinlerin herkes tarafından yazılabilir olmaması gerekir. CTS testleri, bilinen dizinleri test ederek bu en iyi uygulamanın uygulanmasına yardımcı olur.
Yapılandırma dosyalarının güvenliğini sağlama
Çoğu sürücü ve hizmet /system/etc
ve /data
gibi dizinlerde saklanan yapılandırma ve veri dosyalarına dayanır. Bu dosyalar ayrıcalıklı bir işlem tarafından işleniyorsa ve herkes tarafından yazılabilirse, bir uygulamanın, herkesin yazabileceği dosyada kötü amaçlı içerikler oluşturarak süreçteki bir güvenlik açığından yararlanması mümkündür. En iyi uygulamalar:
- Ayrıcalıklı işlemler tarafından kullanılan yapılandırma dosyaları herkes tarafından okunabilir olmamalıdır.
- Ayrıcalıklı işlemler tarafından kullanılan yapılandırma dosyaları herkes tarafından yazılabilir olmamalıdır.
Yerel kod kitaplıklarını depolama
Ayrıcalıklı cihaz üreticisi işlemleri tarafından kullanılan tüm kodlar /vendor
veya /system
içinde olmalıdır; bu dosya sistemleri önyükleme sırasında salt okunur olarak bağlanır. En iyi uygulama olarak, sistem tarafından kullanılan kitaplıkların veya cihazda yüklü diğer yüksek ayrıcalıklı uygulamaların da bu dosya sistemlerinde bulunması gerekir. Bu, bir saldırganın ayrıcalıklı bir işlemin yürüttüğü kodu kontrol etmesine olanak verebilecek bir güvenlik açığını önleyebilir.
Aygıt sürücüsü erişimini sınırlama
Yalnızca güvenilir kodun sürücülere doğrudan erişimi olmalıdır. Mümkün olduğunda, tercih edilen mimari, çağrıları sürücüye proxy olarak yönlendiren ve sürücünün bu arka plan programına erişimini kısıtlayan tek amaçlı bir arka plan programı sağlamaktır. En iyi uygulama olarak, sürücü aygıtı düğümleri herkes tarafından okunabilir veya yazılabilir olmamalıdır. CTS testleri, açığa çıkan sürücülerin bilinen örneklerini kontrol ederek bu en iyi uygulamanın uygulanmasına yardımcı olur.
ADB'yi devre dışı bırakma
Android hata ayıklama köprüsü (adb) değerli bir geliştirme ve hata ayıklama aracıdır ancak kontrollü, güvenli ortamlarda kullanılmak üzere tasarlanmıştır ve genel kullanım için etkinleştirilmemelidir. En iyi uygulamalar:
- ADB varsayılan olarak devre dışı bırakılmalıdır.
- ADB, bağlantıları kabul etmeden önce kullanıcının onu açmasını gerektirmelidir.
Önyükleyicilerin kilidini açma
Çoğu Android cihazı, kilit açmayı destekleyerek cihaz sahibinin sistem bölümünü değiştirmesine ve/veya özel bir işletim sistemi kurmasına olanak tanır. Yaygın kullanım örnekleri arasında üçüncü taraf ROM'un kurulması ve cihazda sistem düzeyinde geliştirme yapılması yer alır. Örneğin, bir Google Nexus cihazı sahibi, kilit açma işlemini başlatmak için fastboot oem unlock
çalıştırabilir ve bu, kullanıcıya aşağıdaki mesajı gösterir:
Önyükleyicinin kilidi açılsın mı?
Önyükleyicinin kilidini açarsanız, bu cihaza özel işletim sistemi yazılımı yükleyebileceksiniz.
Özel bir işletim sistemi, orijinal işletim sistemi ile aynı teste tabi değildir ve cihazınızın ve yüklü uygulamalarınızın düzgün çalışmamasına neden olabilir.
Kişisel verilerinize yetkisiz erişimi önlemek için, önyükleyicinin kilidini açmak aynı zamanda cihazınızdaki tüm kişisel verileri de silecektir ("fabrika verilerine sıfırlama").
Evet veya Hayır'ı seçmek için Sesi Artırma/Azaltma düğmelerine basın. Ardından devam etmek için Güç düğmesine basın.
Evet : Önyükleyicinin kilidini açın (garantiyi geçersiz kılabilir)
Hayır : Önyükleyicinin kilidini açmayın ve cihazı yeniden başlatın.
En iyi uygulama olarak, kilidi açılabilir Android cihazlarının, kilidi açılmadan önce tüm kullanıcı verilerini güvenli bir şekilde silmesi gerekir. Kilit açma sırasında tüm verilerin düzgün bir şekilde silinmemesi, fiziksel olarak yakındaki bir saldırganın gizli Android kullanıcı verilerine yetkisiz erişim elde etmesine olanak tanıyabilir. Kullanıcı verilerinin ifşa edilmesini önlemek için, kilit açmayı destekleyen bir cihazın bunu doğru şekilde uygulaması gerekir (cihaz üreticilerinin kilit açmayı uygunsuz şekilde uyguladığı çok sayıda örnek gördük). Doğru şekilde uygulanan bir kilit açma işlemi aşağıdaki özelliklere sahiptir:
- Kilit açma komutu kullanıcı tarafından onaylandığında cihazın hemen veri silme işlemini başlatması gerekir.
unlocked
işareti, güvenli silme işlemi tamamlanana kadar ayarlanmamalıdır. - Güvenli silme işlemi tamamlanamıyorsa cihazın kilitli durumda kalması gerekir.
- Temel blok cihazı tarafından destekleniyorsa
ioctl(BLKSECDISCARD)
veya eşdeğeri kullanılmalıdır. eMMC cihazları için bu, Güvenli Silme veya Güvenli Kırpma komutunun kullanılması anlamına gelir. eMMC 4.5 ve üzeri için bu, normal bir Silme veya Kırpma işleminin ardından Temizleme işleminin kullanılması anlamına gelir. -
BLKSECDISCARD
temel blok cihazı tarafından desteklenmiyorsa bunun yerineioctl(BLKDISCARD)
kullanılmalıdır. eMMC cihazlarında bu normal bir Trim işlemidir. -
BLKDISCARD
desteklenmiyorsa blok cihazların üzerine tamamen sıfır yazılması kabul edilebilir. - Son kullanıcının, bir bölümü flashlamadan önce kullanıcı verilerinin silinmesini talep etme seçeneğine sahip olması gerekir. Örneğin Nexus cihazlarda bu
fastboot oem lock
komutu aracılığıyla yapılır. - Bir cihaz, efüzyonlar veya benzer bir mekanizma aracılığıyla, bir cihazın kilidinin açılıp açılmadığını ve/veya yeniden kilitlenip kilitlenmediğini kaydedebilir.
Bu gereksinimler, kilit açma işleminin tamamlanmasının ardından tüm verilerin yok edilmesini sağlar. Bu korumaların uygulanmaması, orta düzeyde bir güvenlik açığı olarak kabul edilir.
Kilidi açılmış bir cihazın fastboot oem lock
komutu kullanılarak daha sonra yeniden kilitlenmesi mümkündür. Önyükleyicinin kilitlenmesi, orijinal cihaz üreticisinin işletim sistemi ile mevcut olan yeni özel işletim sistemi ile aynı kullanıcı verileri korumasını sağlar (örneğin, cihazın kilidi tekrar açılırsa kullanıcı verileri silinecektir).