Mobil uygulamalar üzerinde birçok kritik zafiyet bulunmakta. Bunlardan en kolay fark edilebilen ve en önemli olanlarından birisi, kritik önem arz eden bilgilerin derlenmiş uygulamada gömülü olarak bulunmasıdır. Örneğin bir login aktivitesinin kaynak kod üzerinde “strcmp()” ve türevi bir fonksiyon ile sağlandığını düşünelim. Bu fonksiyonun karşılaştırma yapacağı bilginin fonksiyonda açık halde bulunması, uygulama üzerinde yapılacak bir decompiling işlemi ile kolayca erişilebilecek durumda olduğu anlamına gelebilir. Yazının ilerleyen kısımlarında eğitim amaçlı kullanılan zafiyetli bir uygulama üzerinde tersine mühendislik uygulamaya ve bahsettiğimiz türdeki bir zafiyeti anlamaya çalışacağız.

Diva, bünyesinde birçok zafiyeti eğitim amaçlı bulunduran bir mobil uygulamadır. Biz de bu yazıda diva içinde bulunan “hardcoded activity issues” 1 ve 2 numaralı zafiyetleri inceleyeceğiz.

Hardcoded Activity Issue 1

İlk sorudaki login işlemi için istenen parolayı kaynak kod üzerinde aramamız gerektiğini biliyoruz. Bunun için apk dosyasını decompile ederek kaynak koda yaklaşık bir kod elde edeceğiz. Bunun için jadx isimli Dalvik VM üzerinde çalışan java bytecode’larını, yani apk dosyalarınıı, decompile ederek java sınıflarına ulaşmamızı sağlayacak bir araç kullanacağız. Github üzerinden indirdiğimiz uygulamayı yönergelere göre kolayca kurduktan sonra çalıştırıyoruz. Çalıştırdığımız jadx uygulamasına zafiyetli uygulamamızın apk dosyasını sürükleyip bırakıyoruz. Decompile işlemi tamamlandıktan sonra sol tarafta elde ettiğimiz sınıflardan HardcodedActivity sınıfını açıyoruz.

Mobil Uygulamalarda Hardcoded Activity

Kaynak kodu incelediğimizde “access” isimli public bir fonksiyon gözümüze çarpıyor. Bu fonksiyon içerisinde erişim ile ilgili işlemlerin gerçekleştirildiğini düşünüp diğer satırları inceliyoruz. Fonksiyon tanımının hemen altındaki satırda bir “if” koşul ifadesi ve java diline ait equals() metodu ile erişim için bir karşılaştırma yapıldığını anlıyoruz. Bahsettiğimiz zafiyet tam olarak burada doğuyor. Doğrulama işleminin equals() metodu ve ona yollanan açık bir parametre ile yapılması decompile işlemi ile kolayca kritik “vendorsecretkey” bilgisine erişmemize neden oldu.

Mobil Uygulamalarda Hardcoded Activity

Hardcoded Activity 2

İkinci örneğimiz için jadx uygulamasında decompile ettiğimiz apk dosyası için sol taraftaki sınıflardan HardcodedActivity2 sınıfını seçiyoruz ve kaynak kodu inceliyoruz:

Mobil Uygulamalarda Hardcoded Activity

Kodu incelediğimizde “access” fonksiyonu bize tanıdık gelecektir. Bu kez ilk örnekten farklı olarak access fonksiyonunun “djni” adlı objeden farklı bir erişim metodu çağırdığını görüyoruz. “this” anahtar kelimesi “djni” objesinin bu sınıf içerisinde oluşturulduğunu bize söylüyor. 18. satıra geldiğimizde DivaJni sınıfından aynı tipte bir obje yaratıldığını görüyoruz. Import işlemlerini kontrol ettiğimizde herhangi bir dahil etme bulamadığımızdan uygulamanın “package” içerisinde bulunan kaynaklarını kontrol edelim.

Sol taraftaki menüden “Resources” paketini açıp inceliyoruz:

Mobil Uygulamalarda Hardcoded Activity

“lib” dizinin altında farklı işlemciler için aynı isimde .so uzantılı “libdivajni” dosyalarına rastlıyoruz. Shared Object anlamına gelen .so uzantılı dosyalar, derlenmiş binary tipindeki dosyalardır ve normal erişimde anlamlı ifadeler içermezler. Jadx uygulaması ile de decompile edilemeyeceğinden farklı bir araç ile .so uzantılı dosyayı açmamız gerekiyor.

“.so” uzantılı dosyayı açabilmek için Ghidra adında bir tersine mühendislik aracını kullanacağız. Açık kaynak kodlu bu tersine mühendislik aracına resmi sitesinden kolayca erişilebilmekte. Ghidra uygulamamızı indirip çalıştırdıktan sonra jadx için yaptığımız gibi apk dosyamızı sürükleyip bırakıyoruz ve karşımıza aşağıdaki gibi bir uyarı penceresi çıkıyor:

Mobil Uygulamalarda Hardcoded Activity

İç içe dosyalar barındırdığı uyarısına “File System” butonunu seçerek tüm dosyaları dahil etmesini söylüyoruz ve bize apk dosyası ve alt dosyalarını içeren yeni bir pencere açılıyor. Jadx aracında keşfettiğimiz ve hedefimiz olan “libdivajni.so” dosyasını bulduktan sonra sağ tıklayıp “Import” ediyoruz.

Mobil Uygulamalarda Hardcoded Activity
Mobil Uygulamalarda Hardcoded Activity

Ghidra bize import ettiği dosyanın formatını tespit edip birkaç detayı yeni bir pencere ile sunuyor. Bu noktada “OK” butonuna tıklıyoruz ve karşımıza çok daha fazla detay barındıran bir işlem özeti çıkıyor. Dosya adı, değiştirilme tarihi ve üzerinde çalıştığı işlemci gibi birçok bilgiye bu özet penceresinden erişebiliyoruz.

Mobil Uygulamalarda Hardcoded Activity
Mobil Uygulamalarda Hardcoded Activity

Açılan pencerede bazı durumlarda bileşenler boş olarak görünebiliyor. Bu durumda sol üstteki “File” sekmesinden “libdivajni.so” dosyasını yeniden açmak gerekebilir. Aksi halde bizi yukarıdaki gibi bir ekran karşılayacaktır. Açmak istediğimiz dosyanın henüz analiz edilmediğini ve analiz etmek isteyip istemediğimizi soruyor. Bu soruya evet cevabını vererek Ghidra’ya analiz etmesi gerektiğini söylüyoruz. Karşımıza içerisinde analiz modülleri bulunan bir pencere çıkıyor. Burada tavsiye edilmese de, dosyanın zararsız olduğunu bildiğimizden “Select All” butonuna tıklayarak tüm modülleri kullanmasını istiyoruz.

Mobil Uygulamalarda Hardcoded Activity

Analiz işlemi yapıldıktan sonra incelemeye hazır olarak penceremiz son halini almış olacaktır. Bu noktada yapmamız gereken ilk işlem sol taraftaki “Symbol Tree” konteynerine odaklanmak olmalı. Detaylı bileşenleri bu bileşenden öğrenebilmekteyiz.

Mobil Uygulamalarda Hardcoded Activity

Aradığımız şey bir fonksiyon olduğundan “Functions” dizinini inceliyoruz ve “Divajni” sınıfından “access” fonksiyonunu seçiyoruz. Bizi en sağdaki bileşende decompile işlemi sonucunda elde edilmiş kod parçası karşılıyor.

Mobil Uygulamalarda Hardcoded Activity

Bu kod parçasını incelediğimizde 12. satırda bir strcmp() fonksiyonu olduğunu görüyoruz. Yani “access” fonksiyonuna erişim denetimi için doğrulama yeteneği bu fonksiyon sayesinde kazandırılıyor. Fonksiyonun aldığı parametrelere bakıldığında “olsdfgad;lh” string ifadesinin aradığımız bilgi olduğu açıkça anlaşılmakta. Bu değeri uygulamanın HardcodedActivity2 penceresinde denediğimizde başarıya ulaşıyoruz.

Mobil Uygulamalarda Hardcoded Activity

Giriş seviyesinde bir tersine mühendislik ile bu tip zafiyetlerin kolayca sömürülebileceğini birlikte görmüş olduk. Eğer uygulamalı olarak tecrübe kazanmak isterseniz aşağıda kullandığımız programların linki bulunmaktadır. Güvenli günler dileriz.