Masalah umum dan batasan YARA-L 2.0
Dokumen ini menjelaskan masalah umum dan batasan di YARA-L 2.0.Agregasi hasil dengan pembukaan 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
}
Rekaman peristiwa sebelum penghapusan nesting kolom berulang
Tabel berikut menunjukkan rekaman peristiwa sebelum memisahkan kolom berulang:
| metadata.id | principal.application | target.ip |
|---|---|---|
aaaaaaaaa |
Google SecOps |
[192.0.2.20, 192.0.2.28] |
Kumpulan data peristiwa setelah memisahkan kolom berulang
Tabel berikut menunjukkan rekaman peristiwa setelah memisahkan 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, pelepasan susunan bertingkat terjadi di tingkat induk dan turunan. Instance yang dihasilkan dari pembatalan penyusunan satu peristiwa membentuk produk Cartesian dari elemen di kolom induk dan turunan.
Dalam aturan contoh berikut, peristiwa $e dengan dua nilai berulang pada security_results dan dua nilai berulang pada security_results.actions diuraikan 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
}
Rekaman peristiwa sebelum penghapusan nesting kolom berulang
Tabel berikut menunjukkan rekaman peristiwa sebelum memisahkan kolom berulang:
| metadata.id | principal.application | security_results |
|---|---|---|
aaaaaaaaa |
Google SecOps |
[ { actions: [ ALLOW, FAIL ] }, { actions: [ CHALLENGE, BLOCK ] } ] |
Rekaman peristiwa setelah pembatalan penyusunan kolom berulang
Tabel berikut menunjukkan rekaman peristiwa setelah memisahkan 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 pelepasan ini dalam evaluasi aturan dapat menghasilkan agregasi hasil yang tidak terduga jika 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 pada
kolom lain pada peristiwa yang sama yang dihasilkan oleh perilaku pelepasan. Dalam contoh aturan berikut, peristiwa $e memiliki satu nama host google.com, tetapi hasil hostnames menggabungkan empat instance peristiwa $e yang sama dan tidak di-unnest, yang masing-masing memiliki nilai principal.hostname duplikat. Hasil ini menghasilkan empat nama host, bukan satu, karena pelepasan nilai berulang pada 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
}
Rekaman peristiwa sebelum penghapusan nesting kolom berulang
Tabel berikut menunjukkan rekaman peristiwa sebelum memisahkan kolom berulang:
| metadata.id | principal.application | principal.hostname | security_results |
|---|---|---|---|
aaaaaaaaa |
Google SecOps |
google.com |
[ { action: [ ALLOW, FAIL ] }, { action: [ CHALLENGE, BLOCK ] } ] |
Rekaman peristiwa setelah penghapusan nesting kolom berulang
Tabel berikut menunjukkan rekaman peristiwa setelah memisahkan 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 terpengaruh oleh perilaku pelepasan ini. Gunakan versi berbeda dari agregasi jika Anda mengalami nilai hasil yang tidak terduga karena penghapusan nest.
Agregasi berikut tidak terpengaruh oleh perilaku pelepasan yang dijelaskan sebelumnya.
max()min()array_distinct()count_distinct()
Agregasi hasil dengan beberapa variabel peristiwa
Jika aturan berisi beberapa variabel peristiwa, 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 untuk setiap kombinasi peristiwa, sehingga Anda dapat menggunakan kedua variabel peristiwa dalam perhitungan 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 jumlah maksimum yang mungkin sebesar 6, meskipun $e2 hanya dapat sesuai dengan 3 peristiwa berbeda.
Hal ini memengaruhi jumlah, penghitungan, 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 penggabungan. Misalnya, kode 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 tidak adanya
Jika kondisi OR diterapkan di antara dua variabel peristiwa terpisah dan jika
aturan cocok dengan tidak adanya, aturan berhasil dikompilasi, tetapi dapat menghasilkan
deteksi positif palsu. Misalnya, sintaksis aturan berikut dapat mencocokkan
peristiwa yang memiliki $event_a.field = "something" meskipun seharusnya tidak.
events:
not ($event_a.field = "something" **or** $event_b.field = "something")
condition:
$event_a and #event_b >= 0
Solusinya adalah memisahkan kondisi menjadi dua blok yang masing-masing 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
Aritmatika dengan kolom peristiwa yang tidak bertanda
Jika Anda mencoba menggunakan konstanta bilangan bulat dalam operasi aritmatika dengan kolom UDM yang jenisnya adalah bilangan bulat tidak bertanda, 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 secara default adalah bilangan bulat bertanda, yang tidak berfungsi dengan bilangan bulat tidak bertanda dalam operasi aritmatika.
Solusinya adalah memaksa konstanta bilangan bulat menjadi float yang kemudian akan berfungsi dengan bilangan bulat yang tidak bertanda tangan. Contoh:
events:
$total_bytes = $e.network.received_bytes * (2/1)
Konsistensi tertunda dan positif palsu dalam pengayaan GeoIP
Sistem memprioritaskan kecepatan daripada akurasi langsung pada tahap pengayaan awal (Streaming dan Latensi Sensitif), yang dapat menyebabkan data hilang dan potensi positif palsu. Sistem akan terus memperkaya data di latar belakang, tetapi data mungkin tidak tersedia saat aturan dijalankan. Hal ini merupakan bagian dari proses konsistensi akhir yang normal. Untuk menghindari jenis positif palsu ini, jangan mengandalkan keberadaan kolom yang diperkaya dalam peristiwa untuk 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 mengandalkan 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 keduanya merupakan kolom yang diperkaya. Jika pengayaan tidak selesai tepat waktu, aturan akan menghasilkan positif palsu.
Untuk menghindarinya, 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 berlokasi di luar Inggris Raya. Hal ini meningkatkan presisi keseluruhan aturan.
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.