Zararlının Uyanışı: Tetikleme
Zararlı, cihaz açıldığında ya da sesli asistan uyandığında devreye giren bir BroadcastReceiver ile başlıyor. MainReceiver adlı bu bileşen, telefon açılışında veya sesli asistanın etkinleşmesiyle tetikleniyor.

MainReceiver bileşeninin tetiklenme koşulları
İlginç olan şu: MainReceiver’ın onReceive gövdesi tamamen boş. Bunun tek bir amacı var, asıl süreci sessizce başlatmak. Yani alıcının kendisi hiçbir “iş” yapmıyor; sadece arka plandaki zararlı mekanizmayı ayağa kaldıran bir ateşleyici görevi görüyor.

Bilinçli olarak boş bırakılmış onReceive gövdesi
Yapılandırmanın Şifresini Çözmek
Zararlı, ayarlarını ve iletişim kanalını açıkça saklamıyor; her şey basit ama etkili bir XOR şifreleme katmanının arkasında. İlk olarak ifz.t() fonksiyonunda 4 baytlık sabit bir dizi, "beed72" anahtarıyla XOR’lanıyor ve sonuçta "2039" metni ortaya çıkıyor. Bu değer bir channelId üretmekte kullanılıyor; bu andan sonra bütün istekler bu channelId üzerinden gidiyor.

ifz.t(): XOR ile channelId üretimi
Asıl gizleme (obfuscation) bir sonraki adımda. Kodda 30 adet static byte array tanımlanmış. Bu 30 dizi sırayla birleştiriliyor ve her bayt, 30 − v değeriyle (burada v dizinin sırası) XOR’lanarak çözülüyor. Ortaya bir blob çıkıyor.

30 sabit bayt dizisinin birleştirilip 30−v ile XOR’lanması
Çözülen blob’un başındaki başlık (header) bilgisi okunuyor, geri kalan kısım ise files/.mm/.file.jar yoluna gizli bir dosya olarak yazılıyor. Baştaki nokta (.mm, .file.jar) dosya ve klasörleri Linux/Android tarafında gizli hâle getirdiği için, sıradan bir bakışta gözden kaçıyor.

Gizli files/.mm/.file.jar dosyasının diske yazılması
Komuta-Kontrol ve Dinamik Kod Yükleme
Sıra iletişime geldiğinde zararlı, cihaz kimliğinden bir RSA anahtarı üretiyor ve gömülü bir domain listesinden rastgele birini C2 olarak seçiyor. Sabit tek bir adres yerine rastgele seçim yapması, engellenmeye karşı direnç sağlıyor.

Cihaz kimliğinden RSA üretimi ve rastgele C2 domain seçimi
Dikkatimizi çeken ayrıntı şu: rastgele domain seçiminde 5 deneme hakkı tanımlanmış. Yani seçilen alan adı yanıt vermezse, zararlı pes etmiyor; listedeki diğerlerini deniyor. Bu, tipik bir failover davranışı ve altyapının bilinçli olarak dayanıklı tasarlandığını gösteriyor.

Domain seçiminde tanımlı 5 deneme hakkı
Bağlantı kurulduğunda zararlı, kendini güncelleyebilen modüler bir yapıya sahip. Sunucudan dönen yanıttaki dexVersion değeri, cihazdaki sürümden büyükse, dexUrl adresinden yeni bir payload indiriliyor.

dexVersion karşılaştırması ve payload indirme kararı
İndirilen payload’ın XOR şifrelemesi çözülüp sdk.jar adıyla diske yazılıyor, zararsız bir geliştirici kütüphanesi gibi görünsün diye seçilmiş bir isim.

XOR çözülüp sdk.jar olarak yazılması
Ardından bu sdk.jar, bir classloader aracılığıyla çalışma zamanında belleğe yükleniyor. Kod diskte statik olarak durmadığı, ihtiyaç anında indirilip yüklendiği için imza tabanlı antivirüslerin yakalaması da zorlaşıyor.

sdk.jar’ın classloader ile çalışma zamanında yüklenmesi
Son olarak yüklenen kod, bir dynamic proxy üzerinden başlatılıyor. Bu adımdan sonra cihazın kendisi bir proxy düğümüne dönüşüyor, yani saldırganın trafiğini üzerinden geçirebileceği bir çıkış noktası hâline geliyor.

Dinamik proxy üzerinden zararlı bileşenin başlatılması
Yalnız Gelmiyor: Yerel Bileşenle Gizli Anlaşma
Kodu incelerken en çarpıcı bulgulardan biri şu satırdı: zararlı, cihaz üzerinde yerel olarak 12101 portuyla haberleşiyor.

Yerel 12101 portu üzerinden haberleşme
Bu kod, cihazda çalışan başka bir bileşene ikili binary bir protokolle bağlanıp cihaz kimliği istiyor. Bu detay çok önemli: zararlının tek başına gelmediğini açıkça gösteriyor. Araç teybindeki bir “kimlik sağlayıcı” bileşenle entegre çalışıyor, yani cihaza daha üretim/dağıtım aşamasında yerleşmiş bir ekosistemin parçası.
Protokolün kendisi de konuşkan: önce 0x6492 verisi gönderiliyor, hemen ardından 101 komutu geliyor. Cihazdan dönen yanıt da yine 0x6492 imzasıyla başlıyor. Bu sabit imza, iki bileşen arasında önceden anlaşılmış özel bir protokol olduğunu kanıtlıyor.

0x6492 imzası ve 101 komutuyla yürüyen ikili protokol
Buraya kadar olan kısım tamamen kod analiziydi. Şimdi bu zararlının vahşi doğada nasıl yayıldığına ve altyapısının izini nasıl sürdüğüme geçelim.
Nasıl Yayılıyor?
İşin en sinsi tarafı burası. Kurbanların kurduğu ilk uygulama tertemiz. Zararlı kod sonradan indiriliyor. Araç teyplerinde analiz, güncelleme veya yönetim için kullanılan bir bileşen, komutlarını MQTT üzerinden alıyor.
Kullanıcı onayı hiç gerekmiyor; çünkü bu güncelleyici bileşen sistem yetkisiyle çalışıyor. Dahası, installNotExists adlı bir ayar sayesinde cihazda daha önce hiç bulunmayan uygulamaları bile sessizce kurabiliyor. Yani kullanıcı hiçbir şey indirmiyor, hiçbir yere tıklamıyor cihaz, kendi “güncellemesi” ile enfekte oluyor. Bu, klasik bir supply-chain saldırısı senaryosu.
C2 Trafiği ve Altyapının İzini Sürmek
C2 trafiğini izlediğimde, cihazın MAC adresi, IMEI, Android ID ve tarayıcı User-Agent bilgisini sunucuya gönderdiğini gördük. Sunucu üzerinde biraz kurcalayınca da saldırganın kurban sorgulama API’sini bulduk.
Kurbanların verilerine baktığımda dikkatimi çeken ilk cihaz MF-MQX02 model bir araba multimedya sistemiydi.

Kurban sorgulama API’si ve MF-MQX02 model araç cihazı
Ama liste bununla sınırlı değildi: TV BOX, Wellbox, TX9 PRO gibi ucuz Android kutuları da aktif kurbanlar arasındaydı. Yani tehdit yalnızca arabalarla sınırlı değil; aynı zararlı ekosistemi, benzer donanıma sahip her türlü ucuz gömülü cihaza uzanıyor.

Aktif kurban cihaz modelleri: TV BOX, Wellbox, TX9 PRO
Biraz daha kurcaladığımda tüm proxy düğümlerini listeleyebildik. Sadece çevrimiçi olanlara bakalım istedik: sabah 03.56’da 16 aktif düğüm gördük. Zararlı, proxy hizmeti için 7777, 8888, 9919, 9999 ve 10000 portlarını açıyor. Kurban proxy’lere bağlantı denediğimde gerçekten bağlanabildiğimizi gördük yani bu düğümler herkese açık biçimde çalışıyordu.

Belirli bir anda çevrimiçi olan proxy düğümleri
Gizli Gelir Kapısı: Tıklama Dolandırıcılığı
Yazılımın başka neler yaptığını incelerken, aynı zamanda JavaScript ile otomatik arama yaptırdığını ve reklamlara tıklattığını da fark ettik. Bu, klasik bir click fraud düzeneği, kurbanın cihazını, saldırgana reklam geliri üreten sessiz bir işçiye çeviriyor.

JavaScript ile otomatik arama ve reklam tıklaması

Tıklama akışının devamı
Son olarak bu JavaScript katmanı, topladığı veriyi bir köprü üzerinden Android yerel uygulamaya geri gönderiyor. Böylece web tarafındaki otomasyon ile cihazdaki yerel zararlı bileşen birbirine bağlanmış oluyor.

JavaScript’ten Android native uygulamaya veri aktarımı
Siber güvenlik hizmetlerimiz
Red Team, sızma testi ve danışmanlık hizmetlerimiz hakkında bilgi alın.


