Translated ['src/mobile-pentesting/android-app-pentesting/android-applic

This commit is contained in:
Translator 2025-07-28 14:34:06 +00:00
parent 5e87d6cf3f
commit 46564cecf3

View File

@ -6,33 +6,33 @@
**İki katman vardır:** **İki katman vardır:**
- **OS**, yüklü uygulamaları birbirinden izole tutar. - **OS**, kurulu uygulamaları birbirinden izole tutar.
- **uygulamanın kendisi**, geliştiricilerin **belirli işlevsellikleri açığa çıkarmasına** ve uygulama yeteneklerini yapılandırmasına olanak tanır. - **uygulamanın kendisi**, geliştiricilerin **belirli işlevsellikleri açığa çıkarmasına** ve uygulama yeteneklerini yapılandırmasına olanak tanır.
### UID Ayrımı ### UID Ayrımı
**Her uygulamaya belirli bir Kullanıcı Kimliği atanır**. Bu, uygulamanın yüklenmesi sırasında yapılır, böylece **uygulama yalnızca kendi Kullanıcı Kimliğine ait dosyalarla veya paylaşılan** dosyalarla etkileşimde bulunabilir. Bu nedenle, yalnızca uygulamanın kendisi, OS'nin belirli bileşenleri ve root kullanıcısı uygulama verilerine erişebilir. **Her uygulamaya belirli bir Kullanıcı Kimliği atanır**. Bu, uygulamanın kurulumu sırasında yapılır, böylece **uygulama yalnızca kendi Kullanıcı Kimliğine ait dosyalarla veya paylaşılan** dosyalarla etkileşimde bulunabilir. Bu nedenle, yalnızca uygulamanın kendisi, OS'nin belirli bileşenleri ve root kullanıcısı uygulama verilerine erişebilir.
### UID Paylaşımı ### UID Paylaşımı
**İki uygulama aynı UID'yi kullanacak şekilde yapılandırılabilir**. Bu, bilgi paylaşmak için yararlı olabilir, ancak bunlardan biri tehlikeye girerse, her iki uygulamanın verileri de tehlikeye girecektir. Bu nedenle bu davranış **kaçınılması gereken bir durumdur**.\ **İki uygulama aynı UID'yi kullanacak şekilde yapılandırılabilir**. Bu, bilgi paylaşmak için yararlı olabilir, ancak bunlardan biri tehlikeye girerse, her iki uygulamanın verileri de tehlikeye girecektir. Bu nedenle bu davranış **tavsiye edilmez**.\
**Aynı UID'yi paylaşmak için, uygulamalar manifestolarında aynı `android:sharedUserId` değerini tanımlamalıdır.** **Aynı UID'yi paylaşmak için, uygulamalar manifestolarında aynı `android:sharedUserId` değerini tanımlamalıdır.**
### Sandbox ### Sandbox
**Android Uygulama Sandbox'ı**, **her uygulamanın** **ayrı bir kullanıcı kimliği altında ayrı bir işlem olarak çalıştırılmasına olanak tanır**. Her işlem kendi sanal makinesine sahiptir, bu nedenle bir uygulamanın kodu diğer uygulamalardan izole bir şekilde çalışır.\ **Android Uygulama Sandbox'ı**, **her uygulamayı** **ayrı bir kullanıcı kimliği altında ayrı bir işlem olarak çalıştırmaya** olanak tanır. Her işlem kendi sanal makinesine sahiptir, bu nedenle bir uygulamanın kodu diğer uygulamalardan izole bir şekilde çalışır.\
Android 5.0(L) itibarıyla **SELinux** uygulanmaktadır. Temelde, SELinux tüm işlem etkileşimlerini reddetti ve ardından **aralarındaki beklenen etkileşimlere yalnızca izin vermek için politikalar oluşturdu**. Android 5.0(L) itibarıyla **SELinux** uygulanmaktadır. Temelde, SELinux tüm işlem etkileşimlerini reddetti ve ardından **aralarındaki beklenen etkileşimleri yalnızca izin veren politikalar oluşturdu**.
### İzinler ### İzinler
Bir **uygulama yüklendiğinde ve izinler istediğinde**, uygulama **AndroidManifest.xml** dosyasındaki **`uses-permission`** öğelerinde yapılandırılan izinleri istemektedir. **uses-permission** öğesi, istenen iznin adını **name** **özniteliği içinde belirtir.** Ayrıca, belirtilen sürümden daha yüksek sürümlerde izin istemeyi durduran **maxSdkVersion** özniteliğine de sahiptir.\ Bir **uygulama kurduğunuzda ve izinler istiyorsa**, uygulama **AndroidManifest.xml** dosyasındaki **`uses-permission`** öğelerinde yapılandırılan izinleri istemektedir. **uses-permission** öğesi, istenen iznin adını **name** **özniteliği içinde belirtir.** Ayrıca, belirtilen sürümden daha yüksek sürümlerde izin istemeyi durduran **maxSdkVersion** özniteliğine de sahiptir.\
Android uygulamaları başlangıçta tüm izinleri istemek zorunda değildir, ayrıca **dinamik olarak izin isteyebilirler**, ancak tüm izinler **manifestoda** **belirtilmelidir.** Android uygulamalarının başlangıçta tüm izinleri istemesi gerekmediğini, dinamik olarak da **izin isteyebileceğini** unutmayın, ancak tüm izinler **manifestoda** **belirtilmelidir.**
Bir uygulama işlevsellik açığa çıkardığında, **yalnızca belirli bir izne sahip uygulamalara erişimi sınırlayabilir**.\ Bir uygulama işlevsellik açığa çıkardığında, **yalnızca belirli bir izne sahip uygulamalara erişimi sınırlayabilir**.\
Bir izin öğesinin üç özniteliği vardır: Bir izin öğesinin üç özniteliği vardır:
- İznin **adı** - İznin **adı**
- İzinlerin gruplandırılmasına olanak tanıyan **permission-group** özniteliği. - İlgili izinleri gruplamak için kullanılan **permission-group** özniteliği.
- İzinlerin nasıl verildiğini belirten **protection-level**. Dört tür vardır: - İzinlerin nasıl verildiğini belirten **protection-level**. Dört tür vardır:
- **Normal**: Uygulama için **bilinen bir tehdit yoksa** kullanılır. Kullanıcının **onaylaması gerekmez**. - **Normal**: Uygulama için **bilinen bir tehdit yoksa** kullanılır. Kullanıcının **onaylaması gerekmez**.
- **Tehlikeli**: İznin, istek yapan uygulamaya bazı **yükseltilmiş erişimler** verdiğini belirtir. **Kullanıcılardan onay istenir**. - **Tehlikeli**: İznin, istek yapan uygulamaya bazı **yükseltilmiş erişimler** verdiğini belirtir. **Kullanıcılardan onay istenir**.
@ -45,11 +45,11 @@ Bu uygulamalar genellikle **`/system/app`** veya **`/system/priv-app`** dizinler
- **AOSP** (Android Açık Kaynak Projesi) **ROM** ile birlikte gelenler - **AOSP** (Android Açık Kaynak Projesi) **ROM** ile birlikte gelenler
- Cihaz **üreticisi** tarafından eklenenler - Cihaz **üreticisi** tarafından eklenenler
- **Telefon sağlayıcısı** tarafından eklenenler (eğer onlardan satın alındıysa) - Hücresel **telefon sağlayıcısı** tarafından eklenenler (eğer onlardan satın alındıysa)
## Rootlama ## Rootlama
Bir fiziksel android cihazda root erişimi elde etmek için genellikle **1 veya 2 güvenlik açığını istismar etmeniz** gerekir; bu açılar genellikle **cihaz** ve **sürüm** için **özeldir**.\ Bir fiziksel android cihazda root erişimi elde etmek için genellikle **1 veya 2 güvenlik açığını** **istismar etmeniz** gerekir; bu açılar genellikle **cihaz** ve **sürüm** için **özeldir**.\
İstismar çalıştığında, genellikle Linux `su` ikili dosyası, kullanıcının PATH ortam değişkeninde belirtilen bir konuma, örneğin `/system/xbin`'e kopyalanır. İstismar çalıştığında, genellikle Linux `su` ikili dosyası, kullanıcının PATH ortam değişkeninde belirtilen bir konuma, örneğin `/system/xbin`'e kopyalanır.
Su ikili dosyası yapılandırıldıktan sonra, `su` ikili dosyası ile etkileşimde bulunmak için başka bir Android uygulaması kullanılır ve **root erişimi için istekleri işler**; bu uygulamalar **Superuser** ve **SuperSU** (Google Play mağazasında mevcuttur). Su ikili dosyası yapılandırıldıktan sonra, `su` ikili dosyası ile etkileşimde bulunmak için başka bir Android uygulaması kullanılır ve **root erişimi için istekleri işler**; bu uygulamalar **Superuser** ve **SuperSU** (Google Play mağazasında mevcuttur).
@ -59,14 +59,14 @@ Su ikili dosyası yapılandırıldıktan sonra, `su` ikili dosyası ile etkileş
### ROM'lar ### ROM'lar
**Özel bir yazılım yükleyerek işletim sistemini değiştirmek mümkündür**. Bunu yaparak, eski bir cihazın kullanımını genişletmek, yazılım kısıtlamalarını aşmak veya en son Android koduna erişmek mümkündür.\ **Özel bir yazılım yükleyerek işletim sistemini değiştirmek** mümkündür. Bunu yaparak, eski bir cihazın kullanımını uzatmak, yazılım kısıtlamalarını aşmak veya en son Android koduna erişmek mümkündür.\
**OmniROM** ve **LineageOS**, kullanılacak en popüler yazılımlardan ikisidir. **OmniROM** ve **LineageOS**, kullanılacak en popüler yazılımlardan ikisidir.
**Cihazı rootlamak her zaman gerekli değildir**; bazı **üreticiler**, bootloader'larını iyi belgelenmiş ve güvenli bir şekilde kilidini açmaya izin verir. **Özel bir yazılım yüklemek için cihazı rootlamak her zaman gerekli değildir**. **Bazı üreticiler**, bootloader'larının iyi belgelenmiş ve güvenli bir şekilde kilidinin açılmasına izin verir.
### Sonuçlar ### Sonuçlar
Bir cihaz rootlandığında, herhangi bir uygulama root olarak erişim isteyebilir. Eğer kötü niyetli bir uygulama bunu elde ederse, neredeyse her şeye erişimi olacak ve telefonu zarar verebilecektir. Bir cihaz rootlandığında, herhangi bir uygulama root olarak erişim isteyebilir. Kötü niyetli bir uygulama bunu elde ederse, neredeyse her şeye erişimi olacaktır ve telefonu zarar verebilir.
## Android Uygulama Temelleri <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a> ## Android Uygulama Temelleri <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
@ -74,7 +74,7 @@ Bir cihaz rootlandığında, herhangi bir uygulama root olarak erişim isteyebil
- APK İçerikleri (kapsamlı değil) - APK İçerikleri (kapsamlı değil)
- **AndroidManifest.xml** - **AndroidManifest.xml**
- resources.arsc/strings.xml - resources.arsc/strings.xml
- resources.arsc: önceden derlenmiş kaynakları, ikili XML gibi içerir. - resources.arsc: ikili XML gibi önceden derlenmiş kaynakları içerir.
- res/xml/files_paths.xml - res/xml/files_paths.xml
- META-INF/ - META-INF/
- Sertifikanın bulunduğu yer burasıdır! - Sertifikanın bulunduğu yer burasıdır!
@ -83,17 +83,17 @@ Bir cihaz rootlandığında, herhangi bir uygulama root olarak erişim isteyebil
- lib/ - lib/
- CPU mimarisine göre alt dizinlerde ayrılmış yerel kütüphaneleri barındırır. - CPU mimarisine göre alt dizinlerde ayrılmış yerel kütüphaneleri barındırır.
- `armeabi`: ARM tabanlı işlemciler için kod - `armeabi`: ARM tabanlı işlemciler için kod
- `armeabi-v7a`: ARMv7 ve daha yüksek tabanlı işlemciler için kod - `armeabi-v7a`: ARMv7 ve üzeri tabanlı işlemciler için kod
- `x86`: X86 işlemciler için kod - `x86`: X86 işlemciler için kod
- `mips`: yalnızca MIPS işlemcileri için kod - `mips`: yalnızca MIPS işlemciler için kod
- assets/ - assets/
- Uygulamanın ihtiyaç duyduğu çeşitli dosyaları depolar; bunlar, bazen kötü amaçlı yazılım yazarları tarafından ek kodu gizlemek için kullanılan ek yerel kütüphaneler veya DEX dosyalarını içerebilir. - Uygulamanın ihtiyaç duyduğu çeşitli dosyaları depolar; bunlar ek yerel kütüphaneler veya DEX dosyaları içerebilir, bazen kötü amaçlı yazılım yazarları tarafından ek kodu gizlemek için kullanılır.
- res/ - res/
- resources.arsc içine derlenmemiş kaynakları içerir. - resources.arsc içine derlenmemiş kaynakları içerir.
### **Dalvik & Smali** ### **Dalvik & Smali**
Android geliştirmede, **Java veya Kotlin** uygulama oluşturmak için kullanılır. Masaüstü uygulamalarındaki gibi JVM kullanmak yerine, Android bu kodu **Dalvik Executable (DEX) bytecode**'a derler. Daha önce, Dalvik sanal makinesi bu bytecode'u yönetiyordu, ancak şimdi, daha yeni Android sürümlerinde Android Runtime (ART) devralmıştır. Android geliştirmede, **Java veya Kotlin** uygulama oluşturmak için kullanılır. Masaüstü uygulamalarındaki gibi JVM kullanmak yerine, Android bu kodu **Dalvik Executable (DEX) bytecode**'a derler. Daha önce, Dalvik sanal makinesi bu bytecode'u yönetiyordu, ancak şimdi, daha yeni Android sürümlerinde Android Runtime (ART) devralmaktadır.
Tersine mühendislik için, **Smali** kritik hale gelir. Bu, DEX bytecode'un insan tarafından okunabilir versiyonudur ve kaynak kodunu bytecode talimatlarına çevirerek montaj dili gibi işlev görür. Smali ve baksmali, bu bağlamda montaj ve ayrıştırma araçlarını ifade eder. Tersine mühendislik için, **Smali** kritik hale gelir. Bu, DEX bytecode'un insan tarafından okunabilir versiyonudur ve kaynak kodunu bytecode talimatlarına çevirerek montaj dili gibi işlev görür. Smali ve baksmali, bu bağlamda montaj ve ayrıştırma araçlarını ifade eder.
@ -102,7 +102,7 @@ Tersine mühendislik için, **Smali** kritik hale gelir. Bu, DEX bytecode'un ins
Niyetler, Android uygulamalarının bileşenleri arasında veya diğer uygulamalarla iletişim kurmanın birincil yoludur. Bu mesaj nesneleri, uygulamalar veya bileşenler arasında veri taşıyabilir; bu, HTTP iletişimlerinde GET/POST isteklerinin nasıl kullanıldığına benzer. Niyetler, Android uygulamalarının bileşenleri arasında veya diğer uygulamalarla iletişim kurmanın birincil yoludur. Bu mesaj nesneleri, uygulamalar veya bileşenler arasında veri taşıyabilir; bu, HTTP iletişimlerinde GET/POST isteklerinin nasıl kullanıldığına benzer.
Yani bir Niyet, temelde **bileşenler arasında iletilen bir mesajdır**. Niyetler **belirli bileşenlere veya uygulamalara yönlendirilebilir** veya **belirli bir alıcı olmadan gönderilebilir**.\ Yani bir Niyet, temelde **bileşenler arasında iletilen bir mesajdır**. Niyetler **belirli bileşenlere veya uygulamalara yönlendirilebilir** veya **belirli bir alıcı olmadan gönderilebilir**.\
Basitçe, Niyet şu amaçlarla kullanılabilir: Basit olmak gerekirse, Niyet şu amaçlarla kullanılabilir:
- Bir Aktivite başlatmak, genellikle bir uygulama için bir kullanıcı arayüzü açmak - Bir Aktivite başlatmak, genellikle bir uygulama için bir kullanıcı arayüzü açmak
- Sistemi ve uygulamaları değişiklikler hakkında bilgilendirmek için yayınlar olarak - Sistemi ve uygulamaları değişiklikler hakkında bilgilendirmek için yayınlar olarak
@ -114,13 +114,13 @@ Eğer savunmasızsa, **Niyetler çeşitli saldırılar gerçekleştirmek için k
### Niyet-Filtre ### Niyet-Filtre
**Niyet Filtreleri**, **bir aktivite, hizmet veya Yayın Alıcısının farklı türdeki Niyetlerle nasıl etkileşimde bulunabileceğini tanımlar**. Temelde, bu bileşenlerin hangi eylemleri gerçekleştirebileceği veya hangi tür yayınları işleyebileceği gibi yeteneklerini tanımlar. Bu filtreleri beyan etmenin birincil yeri **AndroidManifest.xml dosyasıdır**, ancak Yayın Alıcıları için kodlama da bir seçenek olabilir. **Niyet Filtreleri**, **bir aktivite, hizmet veya Yayın Alıcısının farklı türdeki Niyetlerle nasıl etkileşimde bulunabileceğini tanımlar**. Temelde, bu bileşenlerin hangi eylemleri gerçekleştirebileceği veya hangi tür yayınları işleyebileceği gibi yeteneklerini tanımlar. Bu filtreleri beyan etmenin birincil yeri **AndroidManifest.xml dosyasıdır**, ancak Yayın Alıcıları için bunları kodlamak da bir seçenektir.
Niyet Filtreleri, kategoriler, eylemler ve veri filtrelerinden oluşur ve ek meta verilerin dahil edilmesi mümkündür. Bu yapı, bileşenlerin beyan edilen kriterlere uyan belirli Niyetleri işleyebilmesini sağlar. Niyet Filtreleri, kategoriler, eylemler ve veri filtrelerinden oluşur ve ek meta verilerin dahil edilmesi mümkündür. Bu yapı, bileşenlerin beyan edilen kriterlerle eşleşen belirli Niyetleri işlemesine olanak tanır.
Android bileşenlerinin (aktivite/hizmet/içerik sağlayıcıları/yayın alıcıları) kritik bir yönü, görünürlükleri veya **kamusal durumlarıdır**. Bir bileşen, **`exported`** değeri **`true`** olarak ayarlandığında kamuya açık kabul edilir ve diğer uygulamalarla etkileşimde bulunabilir. Ancak, geliştiricilerin bu bileşenleri özel tutma seçeneği vardır; bu, diğer uygulamalarla istemeden etkileşimde bulunmamalarını sağlamak için **`exported`** özniteliğini **`false`** olarak ayarlamakla gerçekleştirilir. Android bileşenlerinin (aktivite/hizmet/içerik sağlayıcıları/yayın alıcıları) kritik bir yönü, görünürlükleri veya **kamusal durumlarıdır**. Bir bileşen, **`exported`** değeri **`true`** olarak ayarlandığında kamuya açık kabul edilir ve diğer uygulamalarla etkileşimde bulunabilir. Ancak, geliştiricilerin bu bileşenleri özel tutmak için açık bir şekilde ayarlama seçeneği vardır; bu, diğer uygulamalarla istemeden etkileşimde bulunmamalarını sağlamak için **`exported`** özniteliğini **`false`** olarak ayarlamakla gerçekleştirilir.
Ayrıca, geliştiricilerin bu bileşenlere erişimi daha da güvence altına almak için belirli izinler talep etme seçeneği vardır. **`permission`** özniteliği, yalnızca belirlenen izne sahip uygulamaların bileşene erişebilmesini sağlamak için ayarlanabilir ve bu, kimin etkileşimde bulunabileceği üzerinde ek bir güvenlik ve kontrol katmanı ekler. Ayrıca, geliştiricilerin bu bileşenlere erişimi daha da güvence altına almak için belirli izinler talep etme seçeneği vardır. **`permission`** özniteliği, yalnızca belirlenen izne sahip uygulamaların bileşene erişebilmesini sağlamak için ayarlanabilir ve bu, kimlerin etkileşimde bulunabileceği üzerinde ek bir güvenlik ve kontrol katmanı ekler.
```java ```java
<activity android:name=".MyActivity" android:exported="false"> <activity android:name=".MyActivity" android:exported="false">
<!-- Intent filters go here --> <!-- Intent filters go here -->
@ -132,7 +132,7 @@ Niyetler, bir Niyet yapıcısı kullanılarak programatik olarak oluşturulur:
```java ```java
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
``` ```
**Daha önce tanımlanan** intent'in **Eylemi** **ACTION_SEND** ve **Ek** bir mailto **Uri**'dir (Ek, intent'in beklediği ek bilgidir). **Daha önce tanımlanan** intentin **Eylemi** **ACTION_SEND** ve **Ek** bir mailto **Uri**'dir (Ek, intentin beklediği ek bilgidir).
Bu intent, aşağıdaki örnekte olduğu gibi manifest içinde tanımlanmalıdır: Bu intent, aşağıdaki örnekte olduğu gibi manifest içinde tanımlanmalıdır:
```xml ```xml
@ -145,7 +145,7 @@ Bu intent, aşağıdaki örnekte olduğu gibi manifest içinde tanımlanmalıdı
``` ```
Bir intent-filter'ın bir mesajı alabilmesi için **action**, **data** ve **category** ile eşleşmesi gerekir. Bir intent-filter'ın bir mesajı alabilmesi için **action**, **data** ve **category** ile eşleşmesi gerekir.
"Intent çözümleme" süreci, her mesajın hangi uygulama tarafından alınacağını belirler. Bu süreç, **priority attribute**'unu dikkate alır; bu, i**ntent-filter bildirimi** içinde ayarlanabilir ve **daha yüksek önceliğe sahip olan seçilecektir**. Bu öncelik -1000 ile 1000 arasında ayarlanabilir ve uygulamalar `SYSTEM_HIGH_PRIORITY` değerini kullanabilir. Eğer bir **çelişki** oluşursa, **kullanıcının karar verebileceği** bir "chooser" penceresi görünür. "Intent çözümleme" süreci, her mesajın hangi uygulama tarafından alınacağını belirler. Bu süreç, **priority attribute**'unu dikkate alır; bu, i**ntent-filter bildirimi** içinde ayarlanabilir ve **daha yüksek önceliğe sahip olan seçilecektir**. Bu öncelik -1000 ile 1000 arasında ayarlanabilir ve uygulamalar `SYSTEM_HIGH_PRIORITY` değerini kullanabilir. Eğer bir **çelişki** oluşursa, **kullanıcının karar verebileceği** bir "chooser" penceresi ılır.
### Açık Intents ### Açık Intents
@ -153,7 +153,7 @@ Açık bir intent, hedef aldığı sınıf adını belirtir:
```java ```java
Intent downloadIntent = new (this, DownloadService.class): Intent downloadIntent = new (this, DownloadService.class):
``` ```
Diğer uygulamalarda daha önce tanımlanan niyete erişmek için şunu kullanabilirsiniz: Diğer uygulamalarda daha önce tanımlanan intent'e erişmek için şunları kullanabilirsiniz:
```java ```java
Intent intent = new Intent(); Intent intent = new Intent();
intent.setClassName("com.other.app", "com.other.app.ServiceName"); intent.setClassName("com.other.app", "com.other.app.ServiceName");
@ -161,15 +161,15 @@ context.startService(intent);
``` ```
### Pending Intents ### Pending Intents
Bunlar diğer uygulamaların **uygulamanız adına eylemler gerçekleştirmesine** olanak tanır, uygulamanızın kimliği ve izinlerini kullanarak. Bir Pending Intent oluştururken **bir intent ve gerçekleştirilecek eylem belirtilmelidir**. Eğer **belirtilen intent Açık Değilse** (hangi intentin çağrılabileceğini belirtmiyorsa) **kötü niyetli bir uygulama, mağdur uygulama adına belirtilen eylemi gerçekleştirebilir**. Dahası, **bir eylem belirtilmemişse**, kötü niyetli uygulama **mağdur adına herhangi bir eylem gerçekleştirebilir**. Bunlar diğer uygulamaların **uygulamanız adına eylemler gerçekleştirmesine** olanak tanır, uygulamanızın kimliği ve izinlerini kullanarak. Bir Pending Intent oluştururken **bir intent ve gerçekleştirilecek eylem belirtilmelidir**. Eğer **beyan edilen intent Açık Değilse** (hangi intentin bunu çağırabileceğini belirtmiyorsa) **kötü niyetli bir uygulama, beyan edilen eylemi** mağdur uygulama adına gerçekleştirebilir. Dahası, **bir eylem belirtilmezse**, kötü niyetli uygulama **mağdur adına herhangi bir eylem gerçekleştirebilir**.
### Broadcast Intents ### Broadcast Intents
Önceki intentlerden farklı olarak, yalnızca bir uygulama tarafından alınan, broadcast intentler **birden fazla uygulama tarafından alınabilir**. Ancak, API sürüm 14'ten itibaren, mesajı alacak uygulamanın **belirtilmesi mümkündür**; bu, Intent.setPackage kullanılarak yapılır. Önceki intentlerden farklı olarak, yalnızca bir uygulama tarafından alınanlar, broadcast intents **birden fazla uygulama tarafından alınabilir**. Ancak, API sürüm 14'ten itibaren, mesajı alacak uygulamanın **belirtilmesi mümkündür**; bu, Intent.setPackage kullanılarak yapılır.
Alternatif olarak, **yayın gönderirken bir izin belirtmek de mümkündür**. Alıcı uygulamanın bu izne sahip olması gerekecektir. Alternatif olarak, **yayın gönderirken bir izin belirtmek de mümkündür**. Alıcı uygulamanın bu izne sahip olması gerekecektir.
**İki tür** Yayın vardır: **Normal** (asenkron) ve **Sıralı** (senkron). **Sıra**, **alıcı** öğesindeki **yapılandırılmış önceliğe** dayanır. **Her uygulama Yayını işleyebilir, iletebilir veya atlayabilir.** **İki tür** Yayın vardır: **Normal** (asenkron) ve **Sıralı** (senkron). **Sıralama**, **alıcı** öğesindeki **yapılandırılmış önceliğe** dayanır. **Her uygulama Yayını işleyebilir, iletebilir veya atlayabilir.**
`Context` sınıfından `sendBroadcast(intent, receiverPermission)` fonksiyonunu kullanarak **bir yayın göndermek** mümkündür.\ `Context` sınıfından `sendBroadcast(intent, receiverPermission)` fonksiyonunu kullanarak **bir yayın göndermek** mümkündür.\
Ayrıca, **`LocalBroadCastManager`**'dan **`sendBroadcast`** fonksiyonunu kullanarak **mesajın uygulamadan çıkmamasını** sağlayabilirsiniz. Bunu kullanarak bir alıcı bileşenini dışa aktarmanıza gerek kalmaz. Ayrıca, **`LocalBroadCastManager`**'dan **`sendBroadcast`** fonksiyonunu kullanarak **mesajın uygulamadan çıkmamasını** sağlayabilirsiniz. Bunu kullanarak bir alıcı bileşenini dışa aktarmanıza gerek kalmaz.
@ -177,16 +177,16 @@ Ayrıca, **`LocalBroadCastManager`**'dan **`sendBroadcast`** fonksiyonunu kullan
### Sticky Broadcasts ### Sticky Broadcasts
Bu tür Yayınlar **gönderildikten uzun süre sonra erişilebilir**.\ Bu tür Yayınlar **gönderildikten uzun süre sonra erişilebilir**.\
API seviye 21'de kullanımdan kaldırılmıştır ve **kullanılmaması önerilir**.\ Bunlar API seviye 21'de kullanımdan kaldırıldı ve **kullanılmamaları önerilir**.\
**Herhangi bir uygulamanın verileri dinlemesine, aynı zamanda bunları değiştirmesine olanak tanır.** **Herhangi bir uygulamanın verileri dinlemesine, aynı zamanda bunları değiştirmesine olanak tanır.**
"sticky" kelimesini içeren fonksiyonlar bulursanız, örneğin **`sendStickyBroadcast`** veya **`sendStickyBroadcastAsUser`**, **etkisini kontrol edin ve bunları kaldırmaya çalışın**. "sticky" kelimesini içeren fonksiyonlar bulursanız, **`sendStickyBroadcast`** veya **`sendStickyBroadcastAsUser`** gibi, **etkisini kontrol edin ve bunları kaldırmaya çalışın**.
## Deep links / URL schemes ## Deep links / URL schemes
Android uygulamalarında, **deep links** bir eylemi (Intent) doğrudan bir URL aracılığıyla başlatmak için kullanılır. Bu, bir aktivite içinde belirli bir **URL şeması** tanımlanarak yapılır. Bir Android cihazı bu şemaya sahip bir **URL'ye erişmeye çalıştığında**, uygulama içindeki belirtilen aktivite başlatılır. Android uygulamalarında, **deep links** bir eylemi (Intent) doğrudan bir URL aracılığıyla başlatmak için kullanılır. Bu, bir aktivite içinde belirli bir **URL şeması** beyan edilerek yapılır. Bir Android cihazı bu şemaya sahip bir **URL'ye erişmeye çalıştığında**, uygulama içindeki belirtilen aktivite başlatılır.
Şema, **`AndroidManifest.xml`** dosyasında belirtilmelidir: Şema, **`AndroidManifest.xml`** dosyasında beyan edilmelidir:
```xml ```xml
[...] [...]
<activity android:name=".MyActivity"> <activity android:name=".MyActivity">
@ -206,7 +206,7 @@ Daha sonra, veri alanında **host** ve **path** belirtebilirsiniz:
android:host="example" android:host="example"
/> />
``` ```
Bir web üzerinden erişmek için şu şekilde bir bağlantı ayarlamak mümkündür: Web'den erişmek için şu şekilde bir bağlantı ayarlamak mümkündür:
```xml ```xml
<a href="examplescheme://example/something">click here</a> <a href="examplescheme://example/something">click here</a>
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a> <a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
@ -217,7 +217,7 @@ HTML sayfaları kullanmadan [derin bağlantıları nasıl çağıracağınızı
## AIDL - Android Arayüz Tanım Dili ## AIDL - Android Arayüz Tanım Dili
**Android Arayüz Tanım Dili (AIDL)**, Android uygulamalarında istemci ve hizmet arasında **işlem arası iletişim** (IPC) sağlamak için tasarlanmıştır. Android'de başka bir işlemin belleğine doğrudan erişim izni verilmediğinden, AIDL, nesneleri işletim sistemi tarafından anlaşılan bir formata marşallayarak, farklı işlemler arasında iletişimi kolaylaştırır. **Android Arayüz Tanım Dili (AIDL)**, Android uygulamalarında istemci ve hizmet arasında **işlem arası iletişim** (IPC) sağlamak için tasarlanmıştır. Android'de başka bir işlemin belleğine doğrudan erişim izni verilmediğinden, AIDL, nesneleri işletim sistemi tarafından anlaşılan bir formata marşallayarak süreci basitleştirir ve farklı işlemler arasında iletişimi kolaylaştırır.
### Temel Kavramlar ### Temel Kavramlar
@ -225,7 +225,7 @@ HTML sayfaları kullanmadan [derin bağlantıları nasıl çağıracağınızı
- **Messenger**: Bağlı bir hizmet olarak çalışan Messenger, `onBind` metodu aracılığıyla veri işleme odaklı IPC'yi kolaylaştırır. Bu metodun, güvensiz veri işleme veya hassas fonksiyonların yürütülmesi açısından dikkatlice incelenmesi önemlidir. - **Messenger**: Bağlı bir hizmet olarak çalışan Messenger, `onBind` metodu aracılığıyla veri işleme odaklı IPC'yi kolaylaştırır. Bu metodun, güvensiz veri işleme veya hassas fonksiyonların yürütülmesi açısından dikkatlice incelenmesi önemlidir.
- **Binder**: Binder sınıfının doğrudan kullanımı AIDL'in soyutlaması nedeniyle daha az yaygın olsa da, Binder'ın farklı işlemlerin bellek alanları arasında veri transferini kolaylaştıran bir çekirdek düzeyinde sürücü olduğunu anlamak faydalıdır. Daha fazla bilgi için [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8) adresine başvurabilirsiniz. - **Binder**: Binder sınıfının doğrudan kullanımı AIDL'nin soyutlaması nedeniyle daha az yaygın olsa da, Binder'ın farklı işlemlerin bellek alanları arasında veri transferini kolaylaştıran bir çekirdek düzeyinde sürücü olduğunu anlamak faydalıdır. Daha fazla bilgi için [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8) adresine başvurabilirsiniz.
## Bileşenler ## Bileşenler
@ -235,7 +235,7 @@ Bunlar: **Aktiviteler, Hizmetler, Yayın Alıcıları ve Sağlayıcılar.**
Android uygulamalarında, **aktiviteler** ekranlar gibidir ve uygulamanın kullanıcı arayüzünün farklı bölümlerini gösterir. Bir uygulama birçok aktiviteye sahip olabilir, her biri kullanıcıya benzersiz bir ekran sunar. Android uygulamalarında, **aktiviteler** ekranlar gibidir ve uygulamanın kullanıcı arayüzünün farklı bölümlerini gösterir. Bir uygulama birçok aktiviteye sahip olabilir, her biri kullanıcıya benzersiz bir ekran sunar.
**Başlatıcı aktivite**, bir uygulamanın simgesine dokunduğunuzda başlatılan ana geçittir. Uygulamanın manifest dosyasında belirli MAIN ve LAUNCHER niyetleri ile tanımlanmıştır: **Başlatıcı aktivite**, bir uygulamanın ana kapısıdır ve uygulamanın simgesine dokunduğunuzda başlatılır. Uygulamanın manifest dosyasında belirli MAIN ve LAUNCHER niyetleri ile tanımlanmıştır:
```html ```html
<activity android:name=".LauncherActivity"> <activity android:name=".LauncherActivity">
<intent-filter> <intent-filter>
@ -246,11 +246,11 @@ Android uygulamalarında, **aktiviteler** ekranlar gibidir ve uygulamanın kulla
``` ```
Tüm uygulamaların bir başlatıcı aktiviteye ihtiyacı yoktur, özellikle kullanıcı arayüzü olmayanlar, arka plan hizmetleri gibi. Tüm uygulamaların bir başlatıcı aktiviteye ihtiyacı yoktur, özellikle kullanıcı arayüzü olmayanlar, arka plan hizmetleri gibi.
Aktiviteler, manifestoda "exported" olarak işaretlenerek diğer uygulamalara veya süreçlere sunulabilir. Bu ayar, diğer uygulamaların bu aktiviteyi başlatmasına izin verir: Aktiviteler, manifestte "exported" olarak işaretlenerek diğer uygulamalara veya süreçlere sunulabilir. Bu ayar, diğer uygulamaların bu aktiviteyi başlatmasına izin verir:
```markdown ```markdown
<service android:name=".ExampleExportedService" android:exported="true"/> <service android:name=".ExampleExportedService" android:exported="true"/>
``` ```
Ancak, başka bir uygulamadan bir aktiviteye erişmek her zaman bir güvenlik riski değildir. Hassas verilerin yanlış bir şekilde paylaşılması durumunda endişe ortaya çıkar, bu da bilgi sızıntılarına yol açabilir. Ancak, başka bir uygulamadan bir aktiviteye erişmek her zaman bir güvenlik riski değildir. Endişe, hassas verilerin yanlış bir şekilde paylaşılması durumunda ortaya çıkar; bu da bilgi sızıntılarına yol açabilir.
Bir aktivitenin yaşam döngüsü **onCreate yöntemi ile başlar**, UI'yı kurar ve aktiviteyi kullanıcı ile etkileşim için hazırlar. Bir aktivitenin yaşam döngüsü **onCreate yöntemi ile başlar**, UI'yı kurar ve aktiviteyi kullanıcı ile etkileşim için hazırlar.
@ -274,31 +274,31 @@ super.onCreate();
``` ```
### Services ### Services
[Services](https://developer.android.com/guide/components/services) **arka plan operatifleri** olarak, kullanıcı arayüzü olmadan görevleri yerine getirebilen birimlere denir. Bu görevler, kullanıcılar farklı uygulamalara geçse bile çalışmaya devam edebilir, bu da hizmetleri **uzun süreli işlemler** için kritik hale getirir. [Services](https://developer.android.com/guide/components/services) **arka plan operatifleri** olarak, kullanıcı arayüzü olmadan görevleri yerine getirebilen birimlere sahiptir. Bu görevler, kullanıcılar farklı uygulamalara geçse bile çalışmaya devam edebilir, bu da hizmetleri **uzun süreli işlemler** için kritik hale getirir.
Hizmetler çok yönlüdür; çeşitli şekillerde başlatılabilirler, **Intents** bunları başlatmanın birincil yöntemidir ve bir uygulamanın giriş noktası olarak kullanılır. Bir hizmet `startService` yöntemi ile başlatıldığında, `onStart` yöntemi devreye girer ve `stopService` yöntemi açıkça çağrılana kadar çalışmaya devam eder. Alternatif olarak, bir hizmetin rolü aktif bir istemci bağlantısına bağlıysa, istemciyi hizmete bağlamak için `bindService` yöntemi kullanılır ve veri geçişi için `onBind` yöntemi devreye girer. Hizmetler çok yönlüdür; çeşitli şekillerde başlatılabilirler, **Intents** bunları bir uygulamanın giriş noktası olarak başlatmanın birincil yöntemidir. Bir hizmet `startService` yöntemi kullanılarak başlatıldığında, `onStart` yöntemi devreye girer ve `stopService` yöntemi açıkça çağrılana kadar çalışmaya devam eder. Alternatif olarak, bir hizmetin rolü aktif bir istemci bağlantısına bağlıysa, istemciyi hizmete bağlamak için `bindService` yöntemi kullanılır ve veri geçişi için `onBind` yöntemi devreye girer.
Hizmetlerin ilginç bir uygulaması, arka planda müzik çalma veya kullanıcıların bir uygulama ile etkileşimini engellemeden ağ verisi alma gibi işlemlerdir. Ayrıca, hizmetler **dışa aktarma** yoluyla aynı cihazdaki diğer süreçlere erişilebilir hale getirilebilir. Bu, varsayılan bir davranış değildir ve Android Manifest dosyasında açık bir yapılandırma gerektirir: Hizmetlerin ilginç bir uygulaması, arka planda müzik çalma veya kullanıcıların bir uygulama ile etkileşimini engellemeden ağ verisi alma gibi işlemlerdir. Ayrıca, hizmetler **dışa aktarma** yoluyla aynı cihazdaki diğer süreçlere erişilebilir hale getirilebilir. Bu, varsayılan bir davranış değildir ve Android Manifest dosyasında açık bir yapılandırma gerektirir:
```xml ```xml
<service android:name=".ExampleExportedService" android:exported="true"/> <service android:name=".ExampleExportedService" android:exported="true"/>
``` ```
### Broadcast Receivers ### Broadcast Alıcıları
**Broadcast receivers** mesajlaşma sisteminde dinleyici olarak işlev görür, böylece birden fazla uygulama sistemden gelen aynı mesajlara yanıt verebilir. Bir uygulama **iki ana yolla** **bir alıcı kaydedebilir**: uygulamanın **Manifest** dosyası aracılığıyla veya uygulama kodu içinde **dinamik olarak** **`registerReceiver`** API'si ile. Manifest'te, yayınlar izinlerle filtrelenirken, dinamik olarak kaydedilen alıcılar kaydedilme sırasında izinleri de belirtebilir. **Broadcast alıcıları**, bir mesajlaşma sisteminde dinleyici olarak işlev görür ve birden fazla uygulamanın sistemden gelen aynı mesajlara yanıt vermesine olanak tanır. Bir uygulama, **iki ana yolla** **bir alıcı kaydedebilir**: uygulamanın **Manifest** dosyası aracılığıyla veya uygulamanın kodu içinde **dinamik olarak** **`registerReceiver`** API'si ile. Manifest'te, yayınlar izinlerle filtrelenirken, dinamik olarak kaydedilen alıcılar kaydedilme sırasında izinleri de belirtebilir.
**Intent filtreleri**, her iki kayıt yönteminde de kritik öneme sahiptir ve hangi yayınların alıcıyı tetikleyeceğini belirler. Eşleşen bir yayın gönderildiğinde, alıcının **`onReceive`** metodu çağrılır, bu da uygulamanın düşük pil uyarısına yanıt olarak davranışını ayarlamasını sağlar. **Intent filtreleri**, her iki kayıt yönteminde de kritik öneme sahiptir ve hangi yayınların alıcıyı tetikleyeceğini belirler. Eşleşen bir yayın gönderildiğinde, alıcının **`onReceive`** metodu çağrılır ve uygulamanın buna göre tepki vermesini sağlar; örneğin, düşük pil uyarısına yanıt olarak davranışını ayarlamak gibi.
Yayınlar **asenkron** olabilir, tüm alıcılara sırasız ulaşır, veya **senkron** olabilir, burada alıcılar belirlenen önceliklere göre yayını alır. Ancak, herhangi bir uygulamanın kendisini önceliklendirebileceği ve bir yayını kesebileceği potansiyel güvenlik riskini not etmek önemlidir. Yayınlar **asenkron** olabilir, tüm alıcılara sırasız ulaşır, veya **senkron** olabilir, burada alıcılar belirlenen önceliklere göre yayını alır. Ancak, herhangi bir uygulamanın kendisini önceliklendirebileceği ve bir yayını kesebileceği potansiyel güvenlik riskini not etmek önemlidir.
Bir alıcının işlevselliğini anlamak için, sınıfı içinde **`onReceive`** metodunu arayın. Bu metodun kodu, alınan Intent'i manipüle edebilir ve alıcıların veri doğrulama ihtiyacını vurgular, özellikle **Sıralı Yayınlar**'da, bu Intent'i değiştirebilir veya düşürebilir. Bir alıcının işlevselliğini anlamak için, sınıfı içinde **`onReceive`** metodunu arayın. Bu metodun kodu, alınan Intent'i manipüle edebilir ve alıcıların veri doğrulama ihtiyacını vurgular, özellikle **Sıralı Yayınlar**'da, bu Intent'i değiştirebilir veya atlayabilir.
### Content Provider ### İçerik Sağlayıcı
**Content Providers**, uygulamalar arasında **yapılandırılmış verilerin paylaşımı** için esastır ve veri güvenliğini sağlamak için **izinlerin** uygulanmasının önemini vurgular. Uygulamaların veritabanları, dosya sistemleri veya web gibi çeşitli kaynaklardan veri erişmesine olanak tanır. **`readPermission`** ve **`writePermission`** gibi belirli izinler, erişimi kontrol etmek için kritik öneme sahiptir. Ayrıca, uygulamanın manifestinde **`grantUriPermission`** ayarları aracılığıyla geçici erişim sağlanabilir ve `path`, `pathPrefix` ve `pathPattern` gibi nitelikler kullanılarak ayrıntılı erişim kontrolü yapılabilir. **İçerik Sağlayıcılar**, uygulamalar arasında **yapılandırılmış verilerin paylaşımı** için esastır ve veri güvenliğini sağlamak için **izinlerin** uygulanmasının önemini vurgular. Uygulamalar, veritabanları, dosya sistemleri veya web gibi çeşitli kaynaklardan verilere erişim sağlar. **`readPermission`** ve **`writePermission`** gibi belirli izinler, erişimi kontrol etmek için kritik öneme sahiptir. Ayrıca, uygulamanın manifestinde **`grantUriPermission`** ayarları aracılığıyla geçici erişim sağlanabilir; `path`, `pathPrefix` ve `pathPattern` gibi nitelikler detaylı erişim kontrolü için kullanılır.
Girdi doğrulaması, SQL enjeksiyonu gibi güvenlik açıklarını önlemek için son derece önemlidir. Content Providers temel işlemleri destekler: `insert()`, `update()`, `delete()`, ve `query()`, bu da uygulamalar arasında veri manipülasyonu ve paylaşımını kolaylaştırır. Girdi doğrulaması, SQL enjeksiyonu gibi güvenlik açıklarını önlemek için son derece önemlidir. İçerik Sağlayıcılar, uygulamalar arasında veri manipülasyonu ve paylaşımını kolaylaştıran temel işlemleri destekler: `insert()`, `update()`, `delete()` ve `query()`.
**FileProvider**, dosyaları güvenli bir şekilde paylaşmaya odaklanan özel bir Content Provider'dır. Erişimi kontrol etmek için belirli niteliklerle uygulamanın manifestinde tanımlanır; bu nitelikler `android:exported` ve klasör yapılandırmalarını gösteren `android:resource` ile belirtilir. Hassas verilerin yanlışlıkla ifşa edilmesini önlemek için dizinleri paylaşırken dikkatli olunmalıdır. **FileProvider**, dosyaları güvenli bir şekilde paylaşmaya odaklanan özel bir İçerik Sağlayıcıdır. Erişimi kontrol etmek için belirli niteliklerle uygulamanın manifestinde tanımlanır; bu nitelikler `android:exported` ve klasör yapılandırmalarını gösteren `android:resource` ile belirtilir. Hassas verilerin yanlışlıkla ifşa edilmesini önlemek için dizinleri paylaşırken dikkatli olunmalıdır.
FileProvider için örnek manifest bildirimi: FileProvider için örnek manifest bildirimi:
```xml ```xml
@ -316,14 +316,14 @@ Ve `filepaths.xml` dosyasında paylaşılan klasörleri belirtmenin bir örneği
<files-path path="images/" name="myimages" /> <files-path path="images/" name="myimages" />
</paths> </paths>
``` ```
Daha fazla bilgi için kontrol edin: For further information check:
- [Android Developers: Content Providers](https://developer.android.com/guide/topics/providers/content-providers) - [Android Developers: Content Providers](https://developer.android.com/guide/topics/providers/content-providers)
- [Android Developers: FileProvider](https://developer.android.com/training/secure-file-sharing/setup-sharing) - [Android Developers: FileProvider](https://developer.android.com/training/secure-file-sharing/setup-sharing)
## WebViews ## WebViews
WebViews, Android uygulamaları içinde **mini web tarayıcıları** gibidir ve içerikleri ya webden ya da yerel dosyalardan çeker. Normal tarayıcılarla benzer risklerle karşılaşırlar, ancak belirli **ayarlar** aracılığıyla bu **riskleri azaltmanın** yolları vardır. WebViews, Android uygulamaları içinde **mini web tarayıcıları** gibidir, içerikleri ya webden ya da yerel dosyalardan çeker. Normal tarayıcılarla benzer risklerle karşılaşırlar, ancak belirli **ayarlar** ile bu **riskleri azaltmanın** yolları vardır.
Android, iki ana WebView türü sunar: Android, iki ana WebView türü sunar:
@ -336,25 +336,25 @@ Android, iki ana WebView türü sunar:
JavaScript "Bridge", Java nesnelerinin JavaScript ile etkileşimde bulunmasına olanak tanır ve Android 4.2'den itibaren güvenlik için yöntemlerin `@JavascriptInterface` ile işaretlenmesi gerekmektedir. JavaScript "Bridge", Java nesnelerinin JavaScript ile etkileşimde bulunmasına olanak tanır ve Android 4.2'den itibaren güvenlik için yöntemlerin `@JavascriptInterface` ile işaretlenmesi gerekmektedir.
İçerik erişimine izin vermek (`setAllowContentAccess(true)`), WebView'ların Content Providers'a ulaşmasına olanak tanır; bu, içerik URL'leri güvenli olarak doğrulanmadıkça bir risk oluşturabilir. İçerik erişimine izin vermek (`setAllowContentAccess(true)`), WebView'lerin İçerik Sağlayıcılara ulaşmasına olanak tanır, bu da içerik URL'leri güvenli olarak doğrulanmadıkça bir risk oluşturabilir.
Dosya erişimini kontrol etmek için: Dosya erişimini kontrol etmek için:
- Dosya erişimini devre dışı bırakmak (`setAllowFileAccess(false)`), dosya sistemine erişimi sınırlar; belirli varlıklar için istisnalarla, yalnızca hassas olmayan içerikler için kullanılmasını sağlar. - Dosya erişimini devre dışı bırakmak (`setAllowFileAccess(false)`), dosya sistemine erişimi sınırlar, belirli varlıklar için istisnalarla, bunların yalnızca hassas olmayan içerikler için kullanılmasını sağlar.
## Diğer Uygulama Bileşenleri ve Mobil Cihaz Yönetimi ## Other App Components and Mobile Device Management
### **Uygulamaların Dijital İmzalanması** ### **Digital Signing of Applications**
- **Dijital imzalama**, Android uygulamaları için zorunludur ve uygulamaların yüklemeden önce **gerçekten yazıldığı** garantisini sağlar. Bu süreç, uygulama kimliği için bir sertifika kullanır ve yükleme sırasında cihazın paket yöneticisi tarafından doğrulanmalıdır. Uygulamalar **kendinden imzalı veya harici bir CA tarafından sertifikalandırılmış** olabilir, yetkisiz erişime karşı koruma sağlar ve uygulamanın cihaza teslimatı sırasında değiştirilmediğini garanti eder. - **Dijital imza**, Android uygulamaları için zorunludur, uygulamaların kurulumdan önce **gerçekten yazıldığını** garanti eder. Bu süreç, uygulama kimliği için bir sertifika kullanır ve kurulum sırasında cihazın paket yöneticisi tarafından doğrulanmalıdır. Uygulamalar **kendinden imzalı veya harici bir CA tarafından sertifikalandırılmış** olabilir, yetkisiz erişime karşı koruma sağlar ve uygulamanın cihaza teslimatı sırasında değiştirilmediğinden emin olur.
### **Geliştirilmiş Güvenlik için Uygulama Doğrulaması** ### **App Verification for Enhanced Security**
- **Android 4.2**'den itibaren, **Uygulamaları Doğrula** adlı bir özellik, kullanıcıların yüklemeden önce uygulamaların güvenliğini kontrol etmelerine olanak tanır. Bu **doğrulama süreci**, kullanıcıları potansiyel olarak zararlı uygulamalar hakkında uyarabilir veya özellikle kötü niyetli olanların yüklenmesini engelleyebilir, kullanıcı güvenliğini artırır. - **Android 4.2**'den itibaren, **Uygulamaları Doğrula** adlı bir özellik, kullanıcıların uygulamaların kurulumdan önce güvenliğini kontrol etmelerine olanak tanır. Bu **doğrulama süreci**, kullanıcıları potansiyel olarak zararlı uygulamalar hakkında uyarabilir veya özellikle kötü niyetli olanların kurulumunu engelleyebilir, kullanıcı güvenliğini artırır.
### **Mobil Cihaz Yönetimi (MDM)** ### **Mobile Device Management (MDM)**
- **MDM çözümleri**, **Cihaz Yönetimi API'si** aracılığıyla mobil cihazlar için **denetim ve güvenlik** sağlar. Mobil cihazları etkili bir şekilde yönetmek ve güvence altına almak için bir Android uygulamasının yüklenmesini gerektirir. Ana işlevler arasında **şifre politikalarının uygulanması**, **depolama şifrelemesinin zorunlu kılınması** ve **uzaktan veri silme izni verme** bulunur; bu da mobil cihazlar üzerinde kapsamlı kontrol ve güvenlik sağlar. - **MDM çözümleri**, **Cihaz Yönetimi API'si** aracılığıyla mobil cihazlar için **denetim ve güvenlik** sağlar. Mobil cihazları etkili bir şekilde yönetmek ve güvence altına almak için bir Android uygulamasının kurulmasını gerektirir. Ana işlevler arasında **şifre politikalarını uygulamak**, **depolama şifrelemesini zorunlu kılmak** ve **uzaktan veri silme izni vermek** bulunur, bu da mobil cihazlar üzerinde kapsamlı kontrol ve güvenlik sağlar.
```java ```java
// Example of enforcing a password policy with MDM // Example of enforcing a password policy with MDM
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
@ -365,4 +365,104 @@ if (dpm.isAdminActive(adminComponent)) {
dpm.setPasswordMinimumLength(adminComponent, 8); dpm.setPasswordMinimumLength(adminComponent, 8);
} }
``` ```
## AIDL / Binder Servislerini Belirleme ve Sömürme
Android *Binder* IPC, birçok **sistem ve satıcı tarafından sağlanan hizmet** sunar. Bu hizmetler, uygun bir izin kontrolü olmadan dışa aktarıldıklarında bir **saldırı yüzeyi** haline gelir (AIDL katmanı kendisi *hiç* erişim kontrolü yapmaz).
### 1. Çalışan hizmetleri keşfetme
```bash
# from an adb shell (USB or wireless)
service list # simple one-liner
am list services # identical output, ActivityManager wrapper
```
1. Android uygulamaları, Java veya Kotlin gibi dillerde yazılmıştır.
2. Android uygulamaları, APK (Android Package) dosyaları olarak dağıtılır.
3. APK dosyaları, uygulamanın kaynak kodunu, kaynak dosyalarını ve manifest dosyasını içerir.
4. AndroidManifest.xml, uygulamanın yapılandırma bilgilerini tanımlar.
5. Uygulama, Android işletim sistemi üzerinde çalışmak için gerekli izinleri belirtir.
```
145 mtkconnmetrics: [com.mediatek.net.connectivity.IMtkIpConnectivityMetrics]
146 wifi : [android.net.wifi.IWifiManager]
```
* **index** (ilk sütun) çalışma zamanında atanır yeniden başlatmalarda buna ***güvenmeyin***.
* **Binder adı** (örneğin `mtkconnmetrics`), `service call`'a geçirilecek olandır.
* Parantez içindeki değer, stub'un oluşturulduğu tam nitelikli **AIDL arayüzü**'dür.
### 2. Arayüz tanımlayıcısını elde et (PING)
Her Binder stub'ı otomatik olarak **işlem kodu `0x5f4e5446`** (`1598968902` ondalık, ASCII "_NTF")'yi uygular.
```bash
# "ping" the service
service call mtkconnmetrics 1 # 1 == decimal 1598968902 mod 2^32
```
Geçerli bir yanıt, bir `Parcel` içinde UTF-16 dizesi olarak kodlanmış arayüz adını döndürür.
### 3. Bir işlem çağırma
Sözdizimi: `service call <name> <code> [type value ...]`
Yaygın argüman belirteçleri:
* `i32 <int>` işaretli 32-bit değer
* `i64 <long>` işaretli 64-bit değer
* `s16 <string>` UTF-16 dizesi (Android 13+ `utf16` kullanır)
Örnek bir MediaTek el cihazında uid **1** ile ağ izlemeyi başlatın:
```bash
service call mtkconnmetrics 8 i32 1
```
### 4. Bilinmeyen yöntemleri brute-force ile denemek
Header dosyaları mevcut olmadığında, hatanın şu şekilde değişene kadar **kod üzerinde yineleme yapabilirsiniz**:
```
Result: Parcel(00000000 00000000) # "Not a data message"
```
normal bir `Parcel` yanıtı veya `SecurityException`.
```bash
for i in $(seq 1 50); do
printf "[+] %2d -> " $i
service call mtkconnmetrics $i 2>/dev/null | head -1
done
```
Eğer hizmet **proguard ile** derlenmişse, eşlemenin tahmin edilmesi gerekir bir sonraki adıma bakın.
### 5. Mapping kodları ↔ yöntemler onTransact() aracılığıyla
Arayüzü uygulayan jar/odex dosyasını decompile edin (AOSP stub'ları için `/system/framework`'e bakın; OEM'ler genellikle `/system_ext` veya `/vendor` kullanır).
`Stub.onTransact()` için arama yapın bu, devasa bir `switch(transactionCode)` içerir:
```java
case TRANSACTION_updateCtaAppStatus: // 5
data.enforceInterface(DESCRIPTOR);
int appId = data.readInt();
boolean ok = data.readInt() != 0;
updateCtaAppStatus(appId, ok);
reply.writeNoException();
return true;
```
Şimdi prototip ve **parametre türleri** tamamen net.
### 6. Eksik izin kontrollerini tespit etme
Uygulama (genellikle bir iç `Impl` sınıfı) yetkilendirmeden sorumludur:
```java
private void updateCtaAppStatus(int uid, boolean status) {
if (!isPermissionAllowed()) {
throw new SecurityException("uid " + uid + " rejected");
}
/* privileged code */
}
```
Böyle bir mantığın veya ayrıcalıklı UID'lerin (örneğin `uid == 1000 /*system*/`) beyaz listesinin yokluğu bir **zayıflık göstergesi**dir.
Vaka çalışması *MediaTek* `startMonitorProcessWithUid()` (işlem **8**) herhangi bir izin kapısı olmadan bir Netlink mesajını **tamamen** yürütür, bu da ayrıcalıksız bir uygulamanın çekirdek Netfilter modülü ile etkileşimde bulunmasına ve sistem günlüğünü spam yapmasına olanak tanır.
### 7. Değerlendirmeyi otomatikleştirme
Binder keşfini hızlandıran araçlar / betikler:
* [binderfs](https://android.googlesource.com/platform/frameworks/native/+/master/cmds/binderfs/) hizmet başına düğümlerle `/dev/binderfs`'yi açar
* [`binder-scanner.py`](https://github.com/adenflare/binder-scanner) binder tablosunu gezer ve ACL'leri yazdırır
* Frida kısayolu: `Java.perform(()=>console.log(android.os.ServiceManager.listServices().toArray()))`
---
## Referanslar
- [Android Services 101 Pentest Partners](https://www.pentestpartners.com/security-blog/android-services-101/)
- [Android Developer Docs AIDL](https://developer.android.com/guide/components/aidl)
- [Android Developer Docs IBinder](https://developer.android.com/reference/android/os/IBinder)
- [Understanding Binder, Talk @ Google](https://www.youtube.com/watch?v=O-UHvFjxwZ8)
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}