İçeriğe geç
YARA Kurulumu: Kötü Amaçlı Yazılım Tespit Kural Yazımı

YARA Kurulumu: Kötü Amaçlı Yazılım Tespit Kural Yazımı

5 dk okuma Güvenlik

YARA, VirusTotal bünyesinde geliştirilen, dosyaları metin ve byte desenleri üzerinden sınıflandıran açık kaynak bir araç. Zararlı yazılım araştırmacılarının ilk başvuru noktasıdır; bir örneğin hangi aileye ait olduğunu, bilinen bir paketleyici mi kullandığını ya da belirli bir C2 bileşeni taşıyıp taşımadığını saniyeler içinde söyler. Kendisi antivirüs motoru değildir, virüs tanımı yapmaz. Siz kural yazarsınız, o eşleşir.

Kurulum

Debian ve Ubuntu tabanlı dağıtımlarda depoda hazır paket durur:

sudo apt install yara

macOS tarafında Homebrew yeterli:

brew install yara

Python üzerinden kural derleyip servis içinde kullanmak isteyenler için resmi bağlantı PyPI üzerinde durur:

pip install yara-python

Kurulum bittikten sonra yara --version çıktısı ile aracın düzgün konuşlandığını teyit edin. Kaynak koddan derlemek gerekiyorsa GitHub üzerindeki resmi depo (VirusTotal/yara) release sayfasından tarball indirilebilir; standart autotools akışı geçerlidir. Windows için aynı sayfada derlenmiş binaryler yayınlanır. Güncel geliştirme tarafında Rust ile yeniden yazılan YARA-X projesi de var; mevcut kural setleri büyük oranda uyumluluk korunarak taşınıyor.

Kuralın anatomisi

Bir YARA kuralı üç bölümden oluşur: meta, strings ve condition. Aşağıdaki örnek üçünü birden gösterir.

rule OrnekKural
{
    meta:
        author = "analist"
        description = "Test amaclari icin ornek kural"
        date = "2025-01-15"
    strings:
        $metin = "msfvenom"
        $hex = { 4D 5A 90 00 03 00 00 00 }
        $regex = /CVE-[0-9]{4}-[0-9]+/ nocase
    condition:
        $metin and $hex
}

Meta bloğu koşul içinde kullanılamaz, kuralın belgelenmesi içindir. Yazar, tarih, aile adı, referans örnek hash gibi bilgiler burada tutulur. Strings bloğu aranan desenleri tanımlar, condition bloğu ise bu desenlerin hangi mantıkla birleşeceğini söyler. Dolar işareti ile başlayan isimler koşul içinden referans verilir.

Desen tipleri ve nüanslar

Metin desenleri çift tırnak, hex desenleri süslü parantez, regex ise eğik çizgi ile yazılır. Hex tarafında ?? herhangi bir byte anlamına gelir, [4] tam dört byte atla der, [4-6] ise dört ile altı byte arası esneklik verir. Paketlenmiş ya da hafif bozulmuş gövde içinde sabit bir opcode dizisi ararken bu esneklik kritik olur.

  • nocase: büyük küçük harf duyarsız eşleşme
  • wide: UTF-16 olarak kodlanmış halini de arar, Windows zararlılarında rutin
  • ascii wide: iki kodlamayı birden kapsar
  • fullword: desenin tam kelime sınırında durmasını şart koşar, alt string eşleşmelerini eler

Koşul tarafı asıl işi yapan yerdir

Basit bir all of them çoğu zaman yeterli değildir. YARA koşullarında sayaç, ofset, dosya boyutu ve bellek okuma fonksiyonları kullanılabilir:

condition:
    filesize < 500KB and #metin > 2 and uint16(0) == 0x5A4D

#metin desenin dosyada kaç kez geçtiğini, @metin ilk geçtiği ofseti verir. uint16(0) == 0x5A4D kontrolü dosyanın başında MZ imzası var mı diye bakar; PE hedefleyen kurallarda standart bir ön filtredir. any of them, 2 of ($a*), $hex at 0 gibi yapılarla hassasiyet ayarlanır. Çok gevşek koşul yanlış pozitif, çok sıkı koşul ise kaçırmalar üretir.

Modüller

PE, ELF, hash, math gibi modüller import edilerek dosya formatı bilgisine erişilir. En sık kullanılan pe modülüdür:

import "pe"

rule SanalBellekKullanimi
{
    condition:
        pe.imports("kernel32.dll", "VirtualAlloc") and
        pe.imports("kernel32.dll", "CreateRemoteThread")
}

Hash modülü ile hash.md5(0, filesize) gibi çağrılar yapılabilir, koşul içinde doğrudan özet değeriyle karşılaştırma kurulabilir.

Çalıştırma ve derleme

Tek dosyayı taramak için:

yara kural.yar ornek.exe

Bir dizini alt dizinleriyle gezmek için:

yara -r kural.yar /var/quarantine/

Kurallar büyüdükçe her seferinde yeniden ayrıştırmak yerine yarac ile derlenir:

yarac kurallar.yar kurallar.yarc
yara -C kurallar.yarc ornek.exe

Yanlış pozitifle yaşamak

Kural yazmanın zor kısmı desen seçimi. GetProcAddress gibi birçok PE dosyasında görülen rutin bir import tek başına hiçbir şey kanıtlamaz. Değerli desenler aileye özgün olanlardır: sabit mutex adları, gömülü yapılandırma anahtarları, PDB yolları, hata mesajı dizesi gibi derleyici ya da geliştirici artefaktları. Kural yazıldıktan sonra temiz sistem dosyaları üzerinde koşturulmalı, temiz sette patlayan kurallar sadeleştirilmelidir. Bir kural ne kadar az koşulla daha az temiz dosyaya çarpıyorsa kalitesi o kadar yüksektir. Eşleşme bulunca önce kuralın hangi deseni tetiklediğine bakın; -s bayrağı eşleşen string konumlarını da basar.

YARA ekosistemi yıllardır Threat Hunting ve SOC operasyonlarının temel taşı. Öğrenme eğrisi düşük, ifade gücü yüksek. Birkaç sağlam kural yazıp kendi örnekleriniz üzerinde denedikten sonra geri kalanı pratikle geliyor.