IOC ve YARA kuralı yazmak
- Davranışı somut bir göstergeye çevirmeyi, dayanıklı gösterge seçmeyi ve derlenen geçerli bir YARA kuralı yazmayı öğrenirsin.
- YARA kuralları dosya ve bellek üstünde desen arar ve bir örnek yerine bütün aileyi yakalar.
- Bu derste kural yapısını, yanlış pozitif testini ve gösterge paylaşımını uygularsın.
Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +55 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.
Analizin sonunda elinde bir davranış anlatımı olur. Ama savunma ekibi anlatımla arama yapamaz. Onlara makinede koşacak somut ölçütler gerekir. Bu ölçütlere gösterge denir.
Göstergeler üç kümede toplanır. Dosya göstergeleri özet, ad ve yolu kapsar.
Ağ göstergeleri adres, alan adı ve tarayıcı kimliği dizesini kapsar. Ana makine göstergeleri kayıt defteri değerini ve görev adını kapsar. Analizi bir kurala çevirmek, onu tek seferlik bir rapordan sürekli bir savunmaya dönüştürür.
YARA kuralının yapısı
YARA kuralı üç bölümden kurulur: meta, strings ve condition. meta bölümü kimlik bilgisini taşır ve koşulu etkilemez. strings bölümü aranacak dizeleri ve bayt dizilerini tanımlar. condition bölümü bu ölçütleri mantıksal olarak bağlar.
Her bölüm başlığı iki nokta üst üste ile biter; bu işaret unutulursa kural derlenmez. Kural rule sözcüğüyle açılır ve bir adla devam eder. Ad, C dilinin kurallarına uyar, en çok yüz yirmi sekiz karakter olur ve condition gibi ayrılmış sözcükler ad olarak kullanılamaz.
meta bölümünü çoğu analist hafife alır ama değeri büyüktür. Buraya yazar, tarih, aile adı, güven düzeyi ve kaynak referansı girer. Koşulu etkilemez, ama kuralı yöneten kişiye kuralın neden var olduğunu anlatır.
Yüzlerce kuralın bulunduğu bir depoda meta alanı, bir kuralı güncellerken ya da kaldırırken ilk baktığın yerdir. İyi bir meta, kuralı yazan kişi ekipten ayrılsa bile kuralın bakımını sürdürür.
Dize adları dolar işaretiyle başlar. Metin dizeleri tırnak içinde yazılır. Bayt dizileri süslü parantez içinde onaltılık yazılır.
Dize tanımına değiştiriciler eklersin: ascii ve wide kodlamayı, nocase büyük küçük harf duyarsızlığını, fullword ise sözcük sınırını belirler. Bir çalıştırılabilirdeki metin çoğu zaman iki baytlık kodlamada durur, bu yüzden wide değiştiricisi işe yarar. Değiştiriciyi doğru seçmezsen kural var olan bir dizeyi bile kaçırır.
Etkinlik 1 / 7
YARA kuralında hatalı satırı bul.
Desen yazmak ve yanlış pozitif
Bayt dizilerinde joker kullanabilirsin. Çift soru işareti bilinmeyen bir baytı, tek soru işareti bir yarım baytı karşılar.
Köşeli parantez içindeki aralık belirli sayıda baytlık atlama anlamına gelir: dört ile altı arası bayt atlaması gibi. Böylece her sürümde değişen küçük parçaları joker bırakır, sabit kalan çekirdeği yakalarsın. Çekirdek ne kadar özgünse kural o kadar güçlüdür; çok kısa ve yaygın bir desen her yerde eşleşir.
Bir örnek jokeri somutlaştırır. Çözücü yordamın bayt dizisi her derlemede birkaç kaydı değiştirebilir. Değişen baytları çift soru işaretiyle joker bırakır, sabit kalan işlem kodlarını olduğu gibi yazarsın.
Aralarında birkaç bayt oynuyorsa köşeli parantezli bir atlama koyarsın. Böylece kural, aynı mantığı taşıyan bütün sürümleri yakalar ve tek bir derlemeye kilitlenmez. Jokerin dengesi önemlidir: çok joker kuralı gevşetir, az joker yeni sürümü kaçırır.
Değiştiricileri doğru seçmek de deseni güçlendirir. Bir dizeyi hem ascii hem wide isteyerek, metnin tek baytlık ve iki baytlık iki biçimini birden yakalarsın.
nocase ile büyük küçük harf farkını yok sayarsın; bu, komut dizelerinde işe yarar. fullword ise dizeyi yalnız sözcük sınırında eşleştirir ve daha uzun bir dizenin içinde kazara geçmesini önler. Değiştiriciyi amaca göre seçmek, hem kaçırmayı hem yanlış pozitifi azaltır.
Ağ göstergelerini desenle yazmak da yaygındır. Tek adres yerine, aynı yapıyı taşıyan adreslerin tümünü yakalayan bir desen kurarsın. Desen çok genişse yanlış pozitif üretir, çok darsa yeni sürümü kaçırır.
Adres yerine sabit bir alt dize aramak da aynı tuzağa düşer; alan adının kendisi değişmeden alt alan adı değişebilir. İyi bir desen hem şemayı hem alan adı sonunu bağlar ve araya kalan kısmı serbest bırakır.
Etkinlik 2 / 7
Komuta sunucusu adreslerini yakalayan bir desen yaz. Yalnız ornek.example alan adına giden HTTP adresleri eşleşsin.
Yazdıkça eşleşen satırlar işaretlenir. Hedef: yalnız doğru satırlar eşleşsin.
Göstergeleri sınıflamak
Gösterge türü, kuralın hangi üründe koşacağını belirler. Dosya özeti bir uç nokta ürününe gider. Alan adı ve adres güvenlik duvarına ya da ağ sensörüne gider.
Kayıt defteri değeri ve görev adı ana makine kuralına gider. Bir göstergeyi yanlış ürüne koymak onu etkisiz kılar: güvenlik duvarına özet, uç noktaya alan adı vermek iş görmez. Analizin çıktısını bölerken her göstergeyi koşacağı yere göre etiketlersin.
Göstergelerin ömrü de farklıdır. Özet en kırılgandır; tek bayt değişince işe yaramaz.
Alan adı birkaç gün yaşar. Kod deseni ise aile boyunca kalır ve en uzun ömürlüdür. Bu sıralama bir modelle anlatılır: altta kolay değişen özet ve adres, üstte zor değişen araç ve davranış durur. Saldırganı en çok zorlayan göstergeler üsttekilerdir, çünkü onları değiştirmek yöntemi baştan kurmayı gerektirir.
Bu model acı piramidi adıyla bilinir. En altta özet durur; saldırgan tek bir baytı değiştirerek onu işe yaramaz kılar, yani sana çok az acı verir. Biraz yukarıda adres ve alan adı vardır; bunları değiştirmek biraz daha emek ister.
En üstte araçlar ve davranışlar durur. Bir saldırganı davranışını değiştirmeye zorlarsan, en çok acıyı verirsin; çünkü yeni bir yöntem kurmak altyapı değiştirmekten çok daha pahalıdır. Kuralını mümkün olduğunca üst katmanlara dayandırırsın.
Etkinlik 3 / 7
Her göstergeyi türüne göre ayır.
Önce bir seçeneğe, sonra aşağıdaki uygun kutuya bas. İstersen seçeneği kutuya sürükleyip bırak. Yerini değiştirmek için aynı işlemi tekrarla.
0/5 seçenek yerleşti.
Dayanıklı kural yazma süreci
rule Ornek_Yukleyici_2026
{
meta:
yazar = "analiz-ekibi"
tarih = "2026-09-19"
strings:
$ag = "c2.ornek.example" ascii
$key = "CurrentVersion\\Run" ascii
$coz = { 8A 04 0E 34 5A 88 04 0F }
condition:
uint16(0) == 0x5A4D and $coz and 1 of ($ag, $key)
}Örnek kural üç bölümü birlikte gösterir. strings bölümünde üç ölçüt durur: bir ağ adresi, bir kayıt defteri yolu ve çözücü yordamın bayt deseni. condition bölümü üç şart ister. İlk şart dosya türünü sınar: uint16(0) ifadesi dosyanın ilk iki baytını okur ve 0x5A4D değerine, yani MZ imzasına eşit olmalıdır.
İkinci şart çözücü baytının bulunmasını ister. Üçüncü şart ise ağ ya da kayıt defteri dizelerinden en az birinin geçmesini ister. Tek dizeye bağlı kural çok zayıf kalır; birden çok zayıf ölçüt birleşince kural tek güçlü ölçüte yakın güven verir.
Koşul bölümünün birkaç yapı taşı vardır. Mantıksal bağlaçlarla ölçütleri birleştirirsin: ve ile hepsini, veya ile herhangi birini istersin. Sayı ifadeleriyle dosyanın belirli bir uzaklığındaki baytı okur ve bir değere eşitlersin.
Bir dize kümesinden kaçının eşleşmesi gerektiğini de yazabilirsin: ikisi, herhangi biri ya da hepsi. Bu yapılar birlikte, hem dosya türünü hem birden çok izi tek koşulda bağlamana imkân verir.
Dize seçimi kuralın ömrünü belirler. Hata ayıklama yolu, derleme tarihi ve dosya adı her sürümde değişir. Çözücü yordamın bayt dizisi ise aile boyunca aynı kalır ve kuralı dayanıklı yapar.
Kural adlandırması da bir disiplindir: aile adı, tür ve tarih bir arada durur. Yüzlerce kuralın olduğu bir depoda ad, kuralın ne aradığını tek bakışta söylemelidir. Kuralı yayımlamadan önce temiz bir dosya kümesinde koştur; tek eşleşme bile düzeltmeyi gerektirir.
Etkinlik 4 / 7
İyi bir YARA kuralı yazma adımlarını sıraya koy.
Bir öğeye odaklan, yukarı ve aşağı ok tuşlarıyla taşı. Home tuşu en üste, End tuşu en alta alır.
- 1Kuralı aile adı ve tarihle etiketle
- 2Temiz dosya kümesinde yanlış pozitif testi yap
- 3Koşulu birden çok ölçüte bağla
- 4Örnekte kararlı ve özgün dizeleri seç
- 5Dizeleri ve bayt desenlerini strings bölümüne yaz
Adımları sıraya koymak kuralı yazmanın yarısıdır; öbür yarısı doğru dizeyi seçmektir. Bir kuralı dayanıklı yapan şey, seçtiğin dizenin ömrüdür. Dosya adı, derleme tarihi ve hata ayıklama yolu her yeni sürümde değişir, bu yüzden bunlara bağlı bir kural birkaç gün sonra kör kalır.
Çözücü yordamın bayt dizisi ise aile boyunca aynı kalır. O yüzden dayanıklı kural, kısa ömürlü değil uzun ömürlü ize bağlanır.
Etkinlik 5 / 7
YARA kuralında hangi dize seçimi daha dayanıklıdır?
Diskte, bellekte ve paylaşımda
Kuralın nerede koşacağını da düşünürsün. Diskte taranan kural, paketli dosyada açılmamış koda bakar ve kaçırabilir. Bellekte koşan aynı kural, açılmış kodu görür ve yakalar. İkisini ayrı ayrı yazmak yaygın bir çözümdür.
Göstergeleri paylaşmanın ortak biçimleri de vardır. Yapılandırılmış bir dosya biçimi, göstergeleri araçların doğrudan okuyabileceği hale getirir. Elle yazılmış bir liste her ekipte yeniden ayrıştırma işi doğurur.
Kural yazmak analizin ürünü haline gelir. Anlattığın davranış bir metinde kalırsa kimse yararlanamaz. Aynı davranış bir kurala dönüşürse binlerce makinede koşar. Göstergenin ömrünü de yazarsın: adres birkaç gün, özet tek örnek, kod deseni aylarca geçerlidir.
Süresi dolmuş göstergeleri listeden çıkarmak yanlış alarmı azaltır. Her göstergeye tür, değer, güven düzeyi ve kaynak eklersin.
Göstergeleri paylaşırken güven düzeyini de yazarsın. Yüksek güvenli bir göstergeyi doğrudan engelleme listesine koyabilirsin.
Düşük güvenli bir göstergeyi ise önce yalnız izleme listesine alırsın; onu hemen engellemek iş akışını gereksiz keser. Paylaşımın kapsamını da belirtirsin, böylece alan ekip veriyi nereye kadar yayabileceğini bilir. Bu iki alan, bir göstergenin başka ekiplerde doğru kullanılmasının anahtarıdır.
Etkinlik 6 / 7
Doğru mu, yanlış mı?
Bir YARA kuralı yalnız SHA-256 özetine dayanırsa yeni bir örnekte çalışmaz.
Özetin kırılganlığı, kuralın nerede koştuğu sorusuyla birleşince önem kazanır. Aynı kural diskte ve bellekte farklı davranır. Paketli bir dosyada çekirdek kod sıkıştırılmış durur ve diskteki tarama onu açılmamış haliyle görür, desenler de uymaz.
Bellekte koşan aynı kural, kod belleğe açıldıktan sonra bakar ve asıl deseni yakalar. Bu yüzden ciddi bir kuralı hem disk hem bellek için ayrı ayrı yazarsın.
Etkinlik 7 / 7
Paketli bir dosyada diskte koşan bir YARA kuralı neden kaçırabilir?
Derinleş:YARA-X: kuralların yeni evi
Uzun yıllar standart araç olan YARA, 2025 Haziran'ında bakım moduna geçti. Özgün YARA yeni özellik almayacak; yalnız kritik hata ve güvenlik yamaları gelecek. Yeni gelişme YARA-X üzerinde ilerliyor ve ilk kararlı sürüm 1.0.0 aynı ayda yayımlandı.
YARA-X, Rust diliyle baştan yazıldı ve hız, güvenlik ve kullanım kolaylığına odaklanır. İyi haber şu: kuralların çoğu değişiklik gerektirmeden çalışır; uyum oranı yüzde doksan dokuz olarak duyuruldu.
Tarama komutu yr scan biçimindedir ve eşleşen dizeleri yazdırma, özyinelemeli tarama ve çıktı biçimi seçenekleri taşır. Bir kısıt da şu: YARA-X'in C, Python ve Go arayüzleri eski YARA ile uyumlu değildir, yani kuralların değil ama kodunun taşınması emek ister. Yeni kuralları YARA-X ile yazmaya başlarsan gelecekteki özelliklerden yararlanırsın; var olan kuralları taşımak için acele etmene gerek yoktur.
Derinleş:Göstergeleri biçimli paylaşmak
Göstergeleri düz bir metin listesiyle paylaşmak her ekipte yeniden ayrıştırma işi doğurur. Bu yüzden topluluk yapılandırılmış biçimler kullanır. STIX, tehdit bilgisini nesnelere ve ilişkilere ayıran bir standarttır; bir göstergeyi, onu kullanan tehdit aktörünü ve aradaki ilişkiyi makine okuyabilir biçimde yazar. Yanında TAXII gibi bir taşıma katmanı durur ve bu nesneleri ekipler arasında otomatik dağıtır.
Paylaşım platformları gelen nesneleri alır, eşler ve tespit kurallarına çevirir. Yanına paylaşımın kapsamını belirten bir etiket de koyarsın; böylece alıcı veriyi nereye kadar yayabileceğini bilir. Her göstergeye bir güven düzeyi ve son geçerlilik tarihi eklemek, listeyi başka ekipte de doğru kullanılır tutar. Biçimli paylaşımla bir ekibin analizi başka ekiplerde saatler içinde savunmaya dönüşür.
Okumayı istediğin sırayla sürdürebilirsin. Ders, bütün etkinlikleri cevapladığında tamamlanır.