Her şey açıktı. Kodlar satır satır önümdeydi. Ne yaptığını anlayabiliyordum, en azından öyle sanıyordum. Ama sonra bir şey fark ettim. Yabancı stringler, bozuk yapılar, gizlenmiş komutlar vardı satırların arasında. Kod çalışıyordu ama içinde bir şey saklıydı.

Çok teknik bir şey gibi görünür ilk bakışta. Ama değil. Bu bir strateji. Satrançtaki gizli hamle gibi.

"Bilgi, saklandığı kadar güçlüdür" demişler. Biri gelip kodu okumasın diye, bir başkası da kimse anlamasın diye; kodu gizler, karartır, dönüştürür. İşte buna obfuscation derler.

Bu yazıda teknik terimlerin arkasına saklanmadan konuşacağız. Obfuscation nedir, kim neden kullanır, ne zaman fark edilir, ne zaman geç kalınır. Anlamaya çalışacağız. Anlatacağım.

Obfuscation Nedir?

Obfuscation, bir yazılımın işlevini değil, anlaşılabilirliğini değiştirir. Kod yerindedir, çalışır, ama ne yaptığı artık kolayca çözülmez. Satırlar karmaşıklaşır, kelimeler bozulur, yapı dağılır. Amaç bellidir: Anlaşılmasını engellemek.

Teknik olarak, obfuscation; yazılımın kaynak kodunu ya da çalışma mantığını bozmak yerine, görünürlüğünü zayıflatmak demektir. Değişken adları anlamını kaybeder, string ifadeler şifrelenir, kodun akışı kesilir ya da saptırılır. Dışarıdan bakıldığında sıradan bir betik gibi görünse de içinde dönen mantık saklanmıştır. Bu yöntem doğrudan bir güvenlik katmanı sayılmaz. Ama çoğu zaman işe yarar; bir maske gibi, bir perde gibi. Bazen zaman kazandırır, bazen analizcinin dikkatini dağıtır. Kimi geliştirici yazılımını korumak için başvurur bu tekniğe, kimi saldırgan yakalanmamak için. Aynı teknik, farklı niyetlerde farklı anlamlar kazanır. Kod yerinde durur, ama gerçek niyet arka planda kalır.

None
Bu grafik, obfuscation'ın sadece teknik bir tercih olmadığını; kullanıcının niyetiyle şekillenen çok yönlü bir strateji olduğunu gösterir.

Obfuscation Türleri

Obfuscation, tek bir yöntem değil. Farklı ihtiyaçlara göre kullanılan birçok tekniği var. Kimi okunabilirliği bozar, kimi mantıksal akışı karmaşıklaştırır, kimi tamamen kafa karıştırmak için vardır. Hangi türün seçileceği, amacı belirleyen kişinin niyetine bağlıdır. Aşağıda en yaygın kullanılan obfuscation türlerini ve bunların temel amaçlarını sade şekilde özetledim:

Obfuscation, tek bir yöntem değil; birçok farklı teknikten oluşur. Aşağıda en yaygın 5 türü ve her birinin kullanım amacı açıklanmıştır:

1. String Obfuscation

Metinler (örneğin komutlar, URL'ler, dosya yolları) base64, XOR gibi yöntemlerle şifrelenir. Kullanım amacı: Komutları ve hassas bilgileri gizlemek.

2. Control Flow Obfuscation

Kodun yürütme sırası karıştırılır. If-else blokları yeniden yapılandırılır, döngüler karmaşıklaştırılır. Kullanım amacı: Kodun mantığını gizleyerek analizi zorlaştırmak.

3. Variable Renaming

Anlamlı değişken adları yerine rastgele karakter dizileri kullanılır. Kullanım amacı: Kodun okunabilirliğini düşürmek.

4. Junk Code Injection

Gerçek işlevi olmayan, rastgele kod blokları eklenir. Kodun analiz süresi uzatılır. Kullanım amacı: Ters mühendislik (reverse engineering) girişimlerini zorlaştırmak.

5. Encoding / Encryption

Kod parçaları veya dosya içeriği şifrelenerek çalıştırılır. Komut satırları encode edilir. Kullanım amacı: AV/EDR (antivirüs/endpoint detection) sistemlerini atlatmak.

Obfuscation yöntemleri genellikle bir arada kullanılır. Çünkü tek bir teknik, gelişmiş analiz sistemlerini geçmekte yetersiz kalabilir. Bu yüzden saldırganlar veya koruma odaklı geliştiriciler, farklı türleri bir araya getirerek daha karmaşık yapılar oluşturur.

Kimler Kullanır ve Neden?

Obfuscation, farklı profillerin farklı niyetlerle başvurduğu bir tekniktir. Geliştirici kodunu korumak ister, saldırgan gizlemek. Bir diğeri ise sistemi test ederken görünmez kalmak zorundadır. Herkesin eli aynı araca gider ama tuttuğu yer başka.

İlk grup, yazılım geliştiriciler. Özellikle ticari ürünlerde, kaynak kodun izinsiz kopyalanmasını ya da tersine mühendisliğe (reverse engineering — derlenmiş yazılımın analiz edilerek işleyişinin, algoritmalarının veya yapısının ortaya çıkarılması) uğramasını istemezler. Bunun için kodlarını obfuscate ederler. Python, Java, .NET gibi açık yapılı dillerde bu risk yüksektir. Bu yüzden pyarmor, ProGuard, ConfuserEx gibi araçlara başvururlar. Kodun işlevi değişmez ama görünüşü dönüşür. Bu işleme teknik olarak code transformation (kod dönüşümü) denir.

İkinci grup, zararlı yazılım geliştiricileri. Yani threat actor dediğimiz saldırganlar. Bunlar için obfuscation bir kaçış yoludur. Özellikle antivirüs ve EDR gibi signature-based detection (imza tabanlı tespit) sistemlerinden sıyrılmak için kullanılır. String'leri encode ederler, control flow flattening (akışı karıştırma) uygularlar, hatta junk code injection (işlevsiz kod parçaları) ile analiz araçlarını kandırmaya çalışırlar. Statik analiz (static analysis) bu yapılar karşısında zorlanır çünkü baktığı yer görünmüyordur artık. En sık karşılaşılan platformlar: PowerShell, JavaScript, .NET ve VBA'dır.

Üçüncü grupta Red Team var. Penetration tester'lar yani sızma testi uzmanları da bu teknikleri aktif kullanır. Gerçek saldırıların nasıl davrandığını test ederken görünmemek zorundadırlar. Payload'larını obfuscate ederler, EDR sistemini aşmak için evasion (atlatma) modülleri kullanırlar. Metasploit, Cobalt Strike gibi araçlar bu iş için birebirdir. Amaç zararlı olmak değil; sistemdeki boşluğu göstermek.

Son grup ise Blue Team. SOC analyst'ler yani savunma tarafı. Onlar için obfuscation doğrudan bir engeldir. Ne yaptığını anlamak zorundadırlar ama gördükleri şey niyeti göstermez. Kodun satırları açıktır belki ama anlamı bulanıktır. İşte burada devreye deobfuscation girer. Gizlenmiş kodu, yeniden okunabilir ve analiz edilebilir hâle getirme işlemidir bu. Satır satır çözülür, akış yeniden kurulur, mantık yeniden anlamlandırılır. Analiz için hem deobfuscation araçlarına hem de dynamic analysis (canlı gözlem) tekniklerine ihtiyaç duyarlar. SIEM sistemlerinde davranışsal IOC'ler (Indicator of Compromise — saldırı göstergesi) çıkararak gizlenen niyeti çözmeye çalışırlar. İşin zor kısmı buradadır. Çünkü burada kod değil, niyet analiz edilir.

Obfuscation'ın Tespiti Güçleştirmedeki Rolü ve Güvenlik Sistemleriyle Etkileşimi

Güvenlik sistemleri görmek ister. Kodun açık olması, izlerin net olması onlar için avantajdır. Obfuscation ise tam tersini yapar. Görüneni silmez ama saklar. Ne varsa oradadır; sadece tanınmaz hale gelmiştir.

Statik analiz (static analysis), kodun içeriğini dosya açılmadan inceler. Ama bu analiz türü string'lere, sabit yapıya, tanımlı fonksiyonlara bağımlıdır. Bir komut base64 ile encode edilmişse, analiz aracı onu göremez. Fonksiyonlar parçalara ayrılmışsa, değişken isimleri anlamını yitirmişse, kodun niyeti kaybolur. Kod okunur ama anlaşılmaz. Control flow obfuscation (akış karıştırma) yapıldıysa, mantık bağları kopar. Kodun hangi sırayla çalışacağı çözülemez hale gelir. Statik analiz araçlarının çoğu bu noktada çaresiz kalır.

Dinamik analiz (dynamic analysis), kodu çalıştırarak anlamaya çalışır. Burada hedef davranıştır. Ama obfuscation buna da hazırlanmıştır. Sleep evasion (analiz süresini geciktirme), sandbox evasion (analiz ortamını tespit etme), time bomb (belirli saate kadar bekleme) gibi tekniklerle zararlı yazılım ya çalışmaz ya da farklı davranır. Analiz aracının çalıştığını fark ettiğinde kendini durdurur. Davranış kaydedilemez hale gelir.

EDR sistemleri (Endpoint Detection and Response), bellek içi işlemleri izler. Ancak orada da string obfuscation ve code injection (koda dışarıdan içerik ekleme) gibi teknikler analiz sürecini bozar. Komut çalışır ama içeriği yoktur bellekte. Ya da birden fazla parçaya bölünmüştür. Tek başına bakıldığında hiçbir parça zararlı gibi görünmez.

SIEM sistemlerinde de durum benzer. Log'lar davranışa göre analiz edilir. Ancak obfuscation log üretimini manipüle edebilir. Örneğin, PowerShell komutu parçalanarak yazıldığında, olay kaydında bütün hâliyle görünmez. Komut satırları bölünür, base64 string'ler girilir, alt işlemlerle yürütme yapılır. Bu da korelasyonu bozar.

En büyük sorunlardan biri de IOC (Indicator of Compromise) üretiminde yaşanır. Çünkü sabit göstergeler kaybolur. MD5 hash, IP adresi, sabit komut string'i gibi tespit edilebilir öğeler artık yoktur. Her çalıştırmada farklı biçimde gelen, dinamik olarak üretilmiş zararlı içerikler söz konusudur. Yani her seferinde başka bir görünüm, başka bir maske vardır sistemin karşısında.

Obfuscation, güvenlik sistemlerinin yapısına değil, çalışma mantığına saldırır. Saldırgan kodun şeklini değiştirir, anlamını değil. Ama sistem anlamı arar, şekli göremez. O yüzden geç kalır. Belki hiç fark etmez.

Obfuscation'a Karşı Ne Yapılabilir?

Obfuscation tespiti zorlaştırır, evet. Ama imkânsız hâle getirmez. Çözüm yok değil; sadece daha fazla dikkat, daha fazla analiz ve doğru araçlar gerekir. Statik analiz sınırlı kalırsa, dinamik analiz devreye alınmalı. Kodun davranışı izlenmeli, sandbox ortamlarında kontrol edilmeli. Sadece ne yazıldığına değil, nasıl çalıştığına da bakılmalı.

EDR sistemleri için bellek içi aktiviteler daha iyi izlenmeli. Özellikle script tabanlı payload'lar için command-line logging, parent-child process korelasyonu ve PowerShell transcript logging gibi teknikler aktif hâle getirilmeli.

SIEM altyapısında ise davranışsal IOC'ler geliştirilmeli. String eşleştirmek yerine, davranış örüntüleri (patterns) aranmalı. Örneğin; bir işlem base64 çözüp onu yürütüyorsa, bu bir alarm sebebidir. Kod ne yazarsa yazsın, yaptığı şey şüpheliyse görünür hâle getirilmeli.

Ayrıca deobfuscation araçları kullanılmalı. CyberChef, jadx, Ghidra, .NET için de4dot gibi araçlar, karmaşık kodları okunabilir hâle getirmekte yardımcı olur.

Son olarak, insan faktörü unutulmamalı. Güvenlik ekipleri düzenli olarak eğitilmeli, obfuscation tekniklerine karşı güncel kalınmalı. Çünkü bazen sistemi kandıran şey, insanı kandıramaz.

"Hiçbir şey göründüğü gibi değildir, ama her şey bir iz bırakır." F. Nietzsche

Ne kadar karmaşık görünürse görünsün, her sistemin bir açıklığı vardır. Her yöntemin bir karşı hamlesi. Güvenlik, her zaman daha fazlasını görmeye çalışanların işidir. Bu yazı bir bakıştı sadece. Derine inmeye daha yeni başlıyoruz.

Bir sonraki yazıda, maske bu kez bizim elimizde olacak. Kendi yazdığımız kodu nasıl koruruz, emeğimizi nasıl görünmez kılarız, birlikte bakacağız.

None
Anlatılan her şeyin sonunda, yalnızca bir kelime kalır geriye. Kimi için bir tehdit, kimi için bir kalkan!