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.