Masalah dan batasan umum YARA-L
Dokumen ini menjelaskan masalah dan batasan umum di YARA-L.
Agregasi hasil dengan unnesting kolom berulang
Jika aturan mengacu pada kolom berulang pada variabel peristiwa dan kolom berulang tersebut berisi lebih dari satu elemen, setiap elemen tidak disusun bertingkat ke dalam baris peristiwa yang terpisah.
Misalnya, dua string alamat IP di kolom berulang target.ip
pada peristiwa $e
dalam aturan berikut tidak disusun menjadi dua instance peristiwa $e
, masing-masing dengan elemen 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 pembatalan bertingkat kolom berulang
Tabel berikut menunjukkan data peristiwa sebelum pembatalan bertingkat kolom berulang:
metadata.id | principal.application | target.ip |
---|---|---|
aaaaaaaaa |
Chronicle |
[192.0.2.20 , 192.0.2.28] |
Data peristiwa setelah pembatalan bertingkat kolom berulang
Tabel berikut menunjukkan data peristiwa setelah pembatalan bertingkat kolom berulang:
metadata.id | principal.application | target.ip |
---|---|---|
aaaaaaaaa |
Chronicle |
192.0.2.20 |
aaaaaaaaa |
Chronicle |
192.0.2.28 |
Jika aturan merujuk pada kolom berulang yang merupakan turunan dari kolom berulang lainnya seperti security_results.action
, pembatalan bertingkat akan terjadi di tingkat kolom induk dan tingkat kolom turunan. Hasil kumpulan instance yang tidak bertingkat dari satu peristiwa adalah produk Kartesius elemen di kolom induk dan elemen di kolom turunan.
Pada contoh aturan berikut, peristiwa $e
dengan dua nilai berulang pada security_results
dan dua nilai berulang pada security_results.actions
tidak 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 pembatalan bertingkat kolom berulang
Tabel berikut menunjukkan data peristiwa sebelum pembatalan bertingkat kolom berulang:
metadata.id | principal.application | security_results |
---|---|---|
aaaaaaaaa |
Chronicle |
[ { actions: [ ALLOW, FAIL ] } , { actions: [ CHALLENGE, BLOCK ] } ] |
Data peristiwa setelah pembatalan bertingkat kolom berulang
Tabel berikut menunjukkan data peristiwa setelah pembatalan bertingkat kolom berulang:
metadata.id | principal.application | security_results.actions |
---|---|---|
aaaaaaaaa |
Chronicle |
IZINKAN |
aaaaaaaaa |
Chronicle |
GAGAL |
aaaaaaaaa |
Chronicle |
TANTANGAN |
aaaaaaaaa |
Chronicle |
BLOKIR |
Perilaku tidak bertingkat dalam evaluasi aturan ini 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 jelas seperti sum()
, array()
, dan count()
tidak dapat memperhitungkan nilai duplikat di kolom lain pada peristiwa yang sama yang dihasilkan oleh perilaku yang tidak bertingkat. Dalam contoh aturan berikut, peristiwa $e
memiliki satu nama host google.com
, tetapi hasilnya hostnames
digabungkan berdasarkan empat instance tidak bertingkat dari peristiwa yang sama $e
, masing-masing dengan nilai principal.hostname
duplikat. Hasil ini menghasilkan empat nama host, bukan satu
karena nilai berulang yang tidak bertingkat 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
}
Data peristiwa sebelum pembatalan bertingkat kolom berulang
Tabel berikut menunjukkan data peristiwa sebelum pembatalan bertingkat kolom berulang:
metadata.id | principal.application | principal.hostname | security_results |
---|---|---|---|
aaaaaaaaa |
Chronicle |
google.com |
[ { action: [ ALLOW, FAIL ] } , { action: [ CHALLENGE, BLOCK ] } ] |
Data peristiwa setelah pembatalan bertingkat kolom berulang
Tabel berikut menunjukkan data peristiwa setelah pembatalan bertingkat kolom berulang:
metadata.id | principal.application | principal.hostname | security_results.action |
---|---|---|---|
aaaaaaaaa |
Chronicle |
google.com |
IZINKAN |
aaaaaaaaa |
Chronicle |
google.com |
GAGAL |
aaaaaaaaa |
Chronicle |
google.com |
TANTANGAN |
aaaaaaaaa |
Chronicle |
google.com |
BLOKIR |
Solusi
Agregasi yang mengabaikan nilai duplikat atau menghilangkan nilai duplikat tidak terpengaruh oleh perilaku yang tidak bertingkat ini. Gunakan versi agregasi yang berbeda jika Anda menemukan nilai hasil yang tidak terduga karena unnesting.
Agregasi berikut tidak terpengaruh oleh perilaku tidak bertingkat 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"
Jumlahnya dihitung pada 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 terkait dengan 3 peristiwa yang berbeda.
Ini memengaruhi jumlah, penghitungan, dan himpunan. Untuk jumlah dan array, penggunaan count_distinct
atau array_distinct
dapat menyelesaikan masalah, tetapi saat ini belum ada solusi untuk penjumlahan.
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 kesalahan 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 akan 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 OR diterapkan di antara dua variabel peristiwa terpisah dan jika aturan cocok dengan ketiadaan, aturan akan berhasil dikompilasi, tetapi dapat menghasilkan deteksi positif palsu. Misalnya, sintaksis aturan berikut dapat cocok dengan 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, 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 yang tidak ditandatangani, Anda akan mendapatkan error. Contoh:
events:
$total_bytes = $e.network.received_bytes * 2
Kolom udm.network.received_bytes
adalah bilangan bulat yang tidak ditandatangani. Hal ini terjadi karena
konstanta bilangan bulat ditetapkan secara default ke bilangan bulat bertanda tangan, yang tidak berfungsi dengan
bilangan bulat yang tidak ditandatangani dalam operasi aritmetika.
Solusinya adalah memaksa konstanta bilangan bulat ke float yang kemudian akan berfungsi dengan bilangan bulat yang tidak ditandatangani. Contoh:
events:
$total_bytes = $e.network.received_bytes * (2/1)