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şmewide: UTF-16 olarak kodlanmış halini de arar, Windows zararlılarında rutinascii wide: iki kodlamayı birden kapsarfullword: 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.