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.