Masalah umum dan batasan YARA-L
Dokumen ini menjelaskan masalah umum dan batasan di YARA-L.
Agregasi hasil dengan penguraian bertingkat kolom berulang
Jika aturan mereferensikan kolom berulang dalam variabel peristiwa dengan beberapa elemen, setiap elemen akan dibagi menjadi baris peristiwa terpisah.
Misalnya, dua alamat IP di kolom berulang target.ip
pada peristiwa $e
dibagi menjadi dua instance $e
, masing-masing dengan nilai target.ip
yang berbeda.
rule outbound_ip_per_app {
meta:
events:
$e.principal.application = $app
match:
$app over 10m
outcome:
$outbound_ip_count = count($e.target.ip) // yields 2.
condition:
$e
}
Data peristiwa sebelum penguraian bertingkat kolom berulang
Tabel berikut menunjukkan data peristiwa sebelum membatalkan penyusunan bertingkat kolom berulang:
metadata.id | principal.application | target.ip |
---|---|---|
aaaaaaaaa |
Google SecOps |
[192.0.2.20 , 192.0.2.28] |
Data peristiwa setelah membatalkan penyusunan bertingkat kolom berulang
Tabel berikut menunjukkan kumpulan data peristiwa setelah membatalkan penyusunan bertingkat kolom berulang:
metadata.id | principal.application | target.ip |
---|---|---|
aaaaaaaaa |
Google SecOps |
192.0.2.20 |
aaaaaaaaa |
Google SecOps |
192.0.2.28 |
Jika aturan mereferensikan kolom berulang yang disusun bertingkat dalam kolom lain, seperti security_results.action
, penguraian bertingkat terjadi di tingkat induk dan turunan. Instance yang dihasilkan dari membatalkan penyusunan bertingkat satu peristiwa membentuk produk Kartesius dari elemen di kolom induk dan turunan.
Dalam contoh aturan berikut, peristiwa $e
dengan dua nilai berulang di security_results
dan dua nilai berulang di security_results.actions
tidak disusun bertingkat menjadi empat instance.
rule security_action_per_app {
meta:
events:
$e.principal.application = $app
match:
$app over 10m
outcome:
$security_action_count = count($e.security_results.actions) // yields 4.
condition:
$e
}
Data peristiwa sebelum penguraian bertingkat kolom berulang
Tabel berikut menunjukkan data peristiwa sebelum membatalkan penyusunan bertingkat kolom berulang:
metadata.id | principal.application | security_results |
---|---|---|
aaaaaaaaa |
Google SecOps |
[ { actions: [ ALLOW, FAIL ] } , { actions: [ CHALLENGE, BLOCK ] } ] |
Data peristiwa setelah penguraian bertingkat kolom berulang
Tabel berikut menunjukkan kumpulan data peristiwa setelah membatalkan penyusunan bertingkat kolom berulang:
metadata.id | principal.application | security_results.actions |
---|---|---|
aaaaaaaaa |
Google SecOps |
IZINKAN |
aaaaaaaaa |
Google SecOps |
GAGAL |
aaaaaaaaa |
Google SecOps |
TANTANGAN |
aaaaaaaaa |
Google SecOps |
BLOKIR |
Perilaku penghapusan susunan bertingkat ini dalam evaluasi aturan dapat menghasilkan agregasi hasil yang tidak terduga saat aturan mereferensikan satu atau beberapa kolom berulang dengan kolom induk yang juga merupakan kolom berulang. Agregasi yang tidak berbeda seperti sum()
, array()
, dan count()
tidak dapat memperhitungkan nilai duplikat di kolom lain pada peristiwa yang sama yang dihasilkan oleh perilaku penghapusan susunan bertingkat. Dalam contoh aturan
berikut, peristiwa $e
memiliki satu nama host google.com
, tetapi hasil hostnames
digabungkan dari empat instance peristiwa $e
yang sama yang tidak disusun bertingkat, masing-masing dengan nilai principal.hostname
duplikasi. Hasil ini menghasilkan empat nama host, bukan satu,
karena penghapusan susunan nilai berulang di security_results.actions
.
rule security_action_per_app {
meta:
events:
$e.principal.application = $app
match:
$app over 10m
outcome:
$hostnames = array($e.principal.hostname) // yields 4.
$security_action_count = count($e.security_results.action) // yields 4.
condition:
$e
}
Data peristiwa sebelum penguraian bertingkat kolom berulang
Tabel berikut menunjukkan data peristiwa sebelum membatalkan penyusunan bertingkat kolom berulang:
metadata.id | principal.application | principal.hostname | security_results |
---|---|---|---|
aaaaaaaaa |
Google SecOps |
google.com |
[ { action: [ ALLOW, FAIL ] } , { action: [ CHALLENGE, BLOCK ] } ] |
Data peristiwa setelah penguraian bertingkat kolom berulang
Tabel berikut menunjukkan kumpulan data peristiwa setelah membatalkan penyusunan bertingkat kolom berulang:
metadata.id | principal.application | principal.hostname | security_results.action |
---|---|---|---|
aaaaaaaaa |
Google SecOps |
google.com |
IZINKAN |
aaaaaaaaa |
Google SecOps |
google.com |
GAGAL |
aaaaaaaaa |
Google SecOps |
google.com |
TANTANGAN |
aaaaaaaaa |
Google SecOps |
google.com |
BLOKIR |
Solusi
Agregasi yang mengabaikan nilai duplikat atau menghilangkan nilai duplikat tidak akan terpengaruh oleh perilaku penghapusan susunan bertingkat ini. Gunakan versi agregasi yang berbeda jika Anda mengalami nilai hasil yang tidak terduga karena penghapusan susunan bertingkat.
Agregasi berikut tidak terpengaruh oleh perilaku penghapusan susunan bertingkat yang dijelaskan sebelumnya.
max()
min()
array_distinct()
count_distinct()
Agregasi hasil dengan beberapa variabel peristiwa
Jika aturan berisi beberapa variabel peristiwa, akan ada item terpisah dalam agregasi untuk setiap kombinasi peristiwa yang disertakan dalam deteksi. Misalnya, jika contoh aturan berikut dijalankan terhadap peristiwa yang tercantum:
events:
$e1.field = $e2.field
$e2.somefield = $ph
match:
$ph over 1h
outcome:
$some_outcome = sum(if($e1.otherfield = "value", 1, 0))
condition:
$e1 and $e2
event1:
// UDM event 1
field="a"
somefield="d"
event2:
// UDM event 2
field="b"
somefield="d"
event3:
// UDM event 3
field="c"
somefield="d"
Jumlah dihitung berdasarkan setiap kombinasi peristiwa, sehingga Anda dapat menggunakan kedua variabel peristiwa dalam penghitungan nilai hasil. Elemen berikut digunakan dalam penghitungan:
1: $e1 = event1, $e2 = event2
2: $e1 = event1, $e2 = event3
3: $e1 = event2, $e2 = event1
4: $e1 = event2, $e2 = event3
5: $e1 = event3, $e2 = event1
5: $e1 = event3, $e2 = event2
Hal ini menghasilkan potensi jumlah maksimum 6, meskipun $e2 hanya dapat sesuai dengan 3 peristiwa yang berbeda.
Hal ini memengaruhi jumlah, hitung, dan array. Untuk jumlah dan array, menggunakan count_distinct
atau array_distinct
dapat menyelesaikan masalah, tetapi tidak ada solusi
untuk jumlah.
Tanda kurung di awal ekspresi
Menggunakan tanda kurung di awal ekspresi akan memicu error berikut:
parsing: error with token: ")"
invalid operator in events predicate
Contoh berikut akan menghasilkan jenis error ini:
($event.metadata.ingested_timestamp.seconds -
$event.metadata.event_timestamp.seconds) / 3600 > 1
Variasi sintaksis berikut menampilkan hasil yang sama, tetapi dengan sintaksis yang valid:
$event.metadata.ingested_timestamp.seconds / 3600 -
$event.metadata.event_timestamp.seconds / 3600 > 1
1 / 3600 * ($event.metadata.ingested_timestamp.seconds -
$event.metadata.event_timestamp.seconds) > 1
1 < ($event.metadata.ingested_timestamp.seconds -
$event.metadata.event_timestamp.seconds) / 3600
Array indeks dalam hasil memerlukan agregasi untuk nilai tunggal pada kolom berulang
Pengindeksan array di bagian hasil masih memerlukan agregasi. Misalnya, hal berikut tidak berfungsi:
outcome:
$principal_user_dept = $suspicious.principal.user.department[0]
Namun, Anda dapat menyimpan output indeks array dalam variabel placeholder dan menggunakan variabel tersebut di bagian hasil seperti yang ditunjukkan di sini:
events:
$principal_user_dept = $suspicious.principal.user.department[0]
outcome:
$principal_user_department = $principal_user_dept
Kondisi OR dengan ketiadaan
Jika kondisi ATAU diterapkan di antara dua variabel peristiwa terpisah dan jika
aturan cocok dengan ketidakadaan, aturan berhasil dikompilasi, tetapi dapat menghasilkan
deteksi positif palsu. Misalnya, sintaksis aturan berikut dapat mencocokkan peristiwa yang memiliki $event_a.field = "something"
meskipun tidak seharusnya.
events:
not ($event_a.field = "something" **or** $event_b.field = "something")
condition:
$event_a and #event_b >= 0
Solusinya adalah dengan memisahkan kondisi menjadi dua blok, dengan setiap blok hanya menerapkan filter ke satu variabel seperti yang ditunjukkan di sini:
events:
not ($event_a.field = "something")
not ($event_b.field = "something")
condition:
$event_a and #event_b >= 0
Aritmetika dengan kolom peristiwa yang tidak ditandatangani
Jika Anda mencoba menggunakan konstanta bilangan bulat dalam operasi aritmetika dengan kolom UDM yang jenisnya adalah bilangan bulat tanpa tanda tangan, Anda akan mendapatkan error. Contoh:
events:
$total_bytes = $e.network.received_bytes * 2
Kolom udm.network.received_bytes
adalah bilangan bulat tanpa tanda. Hal ini terjadi karena
konstanta bilangan bulat ditetapkan secara default ke bilangan bulat bertanda, yang tidak berfungsi dengan
bilangan bulat tanpa tanda dalam operasi aritmetika.
Solusi untuk mengatasinya adalah dengan memaksa konstanta bilangan bulat ke float yang kemudian akan berfungsi dengan bilangan bulat tanpa tanda tangan. Contoh:
events:
$total_bytes = $e.network.received_bytes * (2/1)
Konsistensi tertunda dan positif palsu dalam pengayaan GeoIP
Sistem ini memprioritaskan kecepatan daripada akurasi langsung pada tahap pengayaan awal (Streaming dan Sensitif Latensi), yang dapat menyebabkan data tidak ada dan potensi positif palsu. Sistem akan terus memperkaya data di latar belakang, tetapi data mungkin tidak tersedia saat aturan dijalankan. Ini adalah bagian dari proses konsistensi akhir normal. Untuk menghindari jenis positif palsu ini, jangan mengandalkan kolom yang diperkaya untuk ada dalam peristiwa guna memicu deteksi.
Misalnya, pertimbangkan peristiwa aturan ini:
$e.principal.ip_geo_artifact.network.asn = "16509" AND
$e.principal.ip_geo_artifact.location.country_or_region = "United Kingdom"
Aturan ini bergantung pada fakta bahwa peristiwa harus memiliki $e.principal.ip_geo_artifact.network.asn = "16509"
DAN $e.principal.ip_geo_artifact.location.country_or_region = "United Kingdom"
yang merupakan kolom yang diperkaya. Jika pengayaan tidak selesai tepat waktu, aturan akan menghasilkan positif palsu.
Untuk menghindari hal ini, pemeriksaan yang lebih baik untuk aturan ini adalah:
$e.principal.ip_geo_artifact.network.asn != "" AND
$e.principal.ip_geo_artifact.network.asn = "16509" AND
$e.principal.ip_geo_artifact.location.country_or_region != "" AND
$e.principal.ip_geo_artifact.location.country_or_region = "United Kingdom"
Aturan ini menghilangkan kemungkinan peristiwa dipicu oleh IP dengan ASN 16509, tetapi berada di luar Inggris Raya. Hal ini meningkatkan presisi aturan secara keseluruhan.