Sintaksis bahasa YARA-L 2.0

Didukung di:

Bagian ini menjelaskan elemen utama sintaksis YARA-L. Lihat juga Ringkasan bahasa YARA-L 2.0.

Struktur aturan

Untuk YARA-L 2.0, Anda harus menentukan deklarasi, definisi, dan penggunaan variabel dalam urutan berikut:

  1. meta
  2. acara
  3. kecocokan (opsional)
  4. hasil (opsional)
  5. kondisi
  6. opsi (opsional)

Contoh berikut mengilustrasikan struktur umum aturan:

rule <rule Name>
{
    meta:
    // Stores arbitrary key-value pairs of rule details, such as who wrote
    // it, what it detects on, version control, etc.

  events:
    // Conditions to filter events and the relationship between events.

  match:
    // Values to return when matches are found.

  outcome:
    // Additional information extracted from each detection.

  condition:
    // Condition to check events and the variables used to find matches.

  options:
    // Options to turn on or off while executing this rule.
}

Sintaksis bagian meta

Bagian meta terdiri dari beberapa baris, dengan setiap baris menentukan pasangan nilai kunci. Bagian kunci harus berupa string tanpa tanda kutip, dan bagian nilai harus berupa string dengan tanda kutip:

<key> = "<value>"

Berikut adalah contoh baris bagian meta yang valid:

meta:
    author = "Google"
    severity = "HIGH"

Sintaksis bagian Acara

Di bagian events, cantumkan predikat untuk menentukan hal berikut:

  • Deklarasi variabel
  • Filter variabel peristiwa
  • Penggabungan variabel peristiwa

Deklarasi variabel

Untuk deklarasi variabel, gunakan sintaksis berikut:

  • <EVENT_FIELD> = <VAR>
  • <VAR> = <EVENT_FIELD>

Keduanya setara, seperti yang ditunjukkan dalam contoh berikut:

  • $e.source.hostname = $hostname
  • $userid = $e.principal.user.userid

Deklarasi ini menunjukkan bahwa variabel ini merepresentasikan kolom yang ditentukan untuk variabel peristiwa. Jika kolom peristiwa adalah kolom berulang, variabel kecocokan dapat merepresentasikan nilai apa pun dalam array. Anda juga dapat menetapkan beberapa kolom peristiwa ke satu variabel kecocokan atau placeholder. Ini adalah kondisi gabungan transitif.

Misalnya:

  • $e1.source.ip = $ip
  • $e2.target.ip = $ip

Setara dengan:

  • $e1.source.ip = $ip
  • $e1.source.ip = $e2.target.ip

Saat digunakan, variabel harus dideklarasikan melalui deklarasi variabel. Jika variabel digunakan tanpa deklarasi, variabel tersebut dianggap sebagai error kompilasi.

Filter variabel peristiwa

Ekspresi boolean yang bertindak pada satu variabel peristiwa dianggap sebagai filter.

Penggabungan variabel peristiwa

Semua variabel peristiwa yang digunakan dalam aturan harus digabungkan dengan setiap variabel peristiwa lainnya dengan salah satu cara berikut:

  • Secara langsung melalui perbandingan kesetaraan antara kolom peristiwa dari dua variabel peristiwa yang digabungkan, misalnya: $e1.field = $e2.field. Ekspresi tidak boleh menyertakan aritmetika.

  • Secara tidak langsung melalui gabungan transitif yang hanya melibatkan kolom peristiwa (lihat deklarasi variabel untuk definisi "gabungan transitif"). Ekspresi tidak boleh menyertakan aritmetika.

Misalnya, dengan asumsi $e1, $e2, dan $e3 digunakan dalam aturan, bagian events berikut valid.

events:
  $e1.principal.hostname = $e2.src.hostname // $e1 joins with $e2
  $e2.principal.ip = $e3.src.ip // $e2 joins with $e3
events:
  // $e1 joins with $e2 via function to event comparison
  re.capture($e1.src.hostname, ".*") = $e2.target.hostname
events:
  // $e1 joins with $e2 via an `or` expression
  $e1.principal.hostname = $e2.src.hostname
  or $e1.principal.hostname = $e2.target.hostname
  or $e1.principal.hostname = $e2.principal.hostname
events:
  // all of $e1, $e2 and $e3 are transitively joined via the placeholder variable $ip
  $e1.src.ip = $ip
  $e2.target.ip = $ip
  $e3.about.ip = $ip
events:
  // $e1 and $e2 are transitively joined via function to event comparison
  re.capture($e2.principal.application, ".*") = $app
  $e1.principal.hostname = $app

Namun, berikut adalah contoh bagian events yang tidak valid.

events:
  // Event to arithmetic comparison is an invalid join condition for $e1 and $e2.
  $e1.principal.port = $e2.src.port + 1
events:
  $e1.src.ip = $ip
  $e2.target.ip = $ip
  $e3.about.ip = "192.1.2.0" //$e3 is not joined with $e1 or $e2.
events:
  $e1.src.port = $port

  // Arithmetic to placeholder comparison is an invalid transitive join condition.
  $e2.principal.port + 800 = $port

Sintaksis bagian kecocokan

Di bagian match, cantumkan variabel kecocokan untuk peristiwa grup sebelum memeriksa kondisi kecocokan. Kolom tersebut ditampilkan dengan setiap kecocokan.

  • Tentukan apa yang diwakili oleh setiap variabel kecocokan di bagian events.
  • Tentukan durasi waktu yang akan digunakan untuk mengorelasikan peristiwa setelah kata kunci over. Peristiwa di luar durasi waktu akan diabaikan.
  • Gunakan sintaksis berikut untuk menentukan durasi waktu: <number><m/h/d>

    Dengan m/h/d masing-masing berarti menit, jam, dan hari.

  • Waktu minimum yang dapat Anda tentukan adalah 1 menit.

  • Waktu maksimum yang dapat Anda tentukan adalah 48 jam.

Berikut adalah contoh match yang valid:

$var1, $var2 over 5m

Pernyataan ini menampilkan $var1 dan $var2 (ditetapkan di bagian events) saat aturan menemukan kecocokan. Waktu yang ditentukan adalah 5 menit. Peristiwa yang berjarak lebih dari 5 menit tidak dikorelasikan dan oleh karena itu diabaikan oleh aturan.

Berikut contoh lain bagian match yang valid:

$user over 1h

Pernyataan ini menampilkan $user saat aturan menemukan kecocokan. Periode waktu yang ditentukan adalah 1 jam. Peristiwa yang berjarak lebih dari satu jam tidak dikorelasikan. Aturan tidak menganggapnya sebagai deteksi.

Berikut contoh lain bagian match yang valid:

$source_ip, $target_ip, $hostname over 2m

Pernyataan ini menampilkan $source_ip, $target_ip, dan $hostname saat aturan menemukan kecocokan. Periode waktu yang ditentukan adalah 2 menit. Peristiwa yang berjarak lebih dari 2 menit tidak berkorelasi. Aturan tidak menganggapnya sebagai deteksi.

Contoh berikut mengilustrasikan bagian match yang tidak valid:

  • var1, var2 over 5m // invalid variable name
  • $user 1h // missing keyword

Penanganan nilai nol di bagian kecocokan

Mesin Aturan secara implisit memfilter nilai nol untuk semua placeholder yang digunakan di bagian pencocokan ("" untuk string, 0 untuk angka, false untuk boolean, nilai di posisi 0 untuk jenis yang di-enum). Contoh berikut mengilustrasikan aturan yang memfilter nilai nol.

rule ZeroValuePlaceholderExample {
  meta:
  events:
    // Because $host is used in the match section, the rule behaves
    // as if the following predicate was added to the events section:
    // $host != ""
    $host = $e.principal.hostname

    // Because $otherPlaceholder was not used in the match section,
    // there is no implicit filtering of zero values for $otherPlaceholder.
    $otherPlaceholder = $e.principal.ip

  match:
    $host over 5m

  condition:
    $e
}

Namun, jika placeholder ditetapkan ke fungsi, aturan tidak secara implisit memfilter nilai nol placeholder yang digunakan di bagian kecocokan. Contoh berikut mengilustrasikan aturan yang memfilter nilai nol:

rule ZeroValueFunctionPlaceholder {
  meta:
  events:
    // Even though $ph is used in the match section, there is no
    // implicit filtering of zero values for $ph, because $ph is assigned to a function.
    $ph = re.capture($e.principal.hostname, "some-regex")

  match:
    $ph over 5m

  condition:
    $e
}

Untuk menonaktifkan pemfilteran implisit nilai nol, Anda dapat menggunakan opsi allow_zero_values di bagian opsi.

Jendela hop

Secara default, aturan YARA-L 2.0 dengan bagian kecocokan dievaluasi menggunakan jendela hop. Rentang waktu eksekusi aturan dibagi menjadi serangkaian jendela hop yang tumpang-tindih, dengan masing-masing durasi yang ditentukan di bagian match. Peristiwa kemudian dikorelasikan dalam setiap jendela hop.

Misalnya, untuk aturan yang dijalankan selama rentang waktu [1:00, 2:00], dengan bagian match di atas 30m, kemungkinan kumpulan jendela lompatan yang tumpang-tindih yang dapat dihasilkan adalah [1:00, 1:30], [1:03, 1:33], dan [1:06, 1:36]. Jendela ini digunakan untuk menghubungkan beberapa peristiwa.

Jendela geser

Penggunaan jendela lompatan bukanlah cara yang efektif untuk menelusuri peristiwa yang terjadi dalam urutan tertentu (misalnya, e1 terjadi hingga 2 menit setelah e2). Terjadinya peristiwa e1 dan terjadinya peristiwa e2 hanya berkorelasi jika keduanya termasuk dalam jendela lompatan yang sama.

Cara yang lebih efektif untuk menelusuri urutan peristiwa tersebut adalah dengan menggunakan jendela geser. Jendela geser dengan durasi yang ditentukan di bagian match dibuat saat dimulai atau diakhiri dengan variabel peristiwa titik pusat yang ditentukan. Peristiwa kemudian dikorelasikan dalam setiap jendela geser. Hal ini memungkinkan Anda menelusuri peristiwa yang terjadi dalam urutan tertentu (misalnya, e1 terjadi dalam 2 menit setelah e2). Terjadinya peristiwa e1 dan terjadinya peristiwa e2 berkorelasi jika peristiwa e1 terjadi dalam durasi jendela geser setelah peristiwa e2.

Tentukan periode geser di bagian match aturan sebagai berikut:

<match-var-1>, <match-var-2>, ... over <duration> before|after <pivot-event-var>

Variabel peristiwa poros adalah variabel peristiwa yang menjadi dasar jendela geser. Jika Anda menggunakan kata kunci before, jendela geser akan dibuat, yang diakhiri dengan setiap kemunculan peristiwa poros. Jika kata kunci after digunakan, jendela geser akan dibuat dimulai dengan setiap kemunculan peristiwa titik tumpu.

Berikut adalah contoh penggunaan jendela geser yang valid:

  • $var1, $var2 over 5m after $e1
  • $user over 1h before $e2

Lihat contoh aturan jendela geser.

Sebaiknya jangan gunakan jendela geser untuk aturan peristiwa tunggal, karena jendela geser dirancang untuk mendeteksi beberapa peristiwa. Jika salah satu aturan Anda termasuk dalam kategori ini, sebaiknya gunakan salah satu solusi sementara berikut:

  • Konversi aturan untuk menggunakan beberapa variabel peristiwa, dan perbarui bagian kondisi jika aturan memerlukan lebih dari satu kemunculan peristiwa.
    • Secara opsional, pertimbangkan untuk menambahkan filter stempel waktu, bukan menggunakan jendela geser. Contoh, $permission_change.metadata.event_timestamp.seconds < $file_creation.metadata.event_timestamp.seconds
  • Lepaskan jendela geser.

Sintaksis bagian hasil

Di bagian outcome, Anda dapat menentukan hingga 20 variabel hasil, dengan nama arbitrer. Hasil ini akan disimpan dalam deteksi yang dihasilkan oleh aturan. Setiap deteksi dapat memiliki nilai yang berbeda untuk hasilnya.

Nama hasil, $risk_score, bersifat khusus. Anda dapat secara opsional menentukan hasil dengan nama ini, dan jika Anda melakukannya, hasilnya harus berupa jenis bilangan bulat atau float. Jika diisi,risk_score akan ditampilkan di tampilan Insight Perusahaan untuk pemberitahuan yang berasal dari deteksi aturan.

Jika Anda tidak menyertakan variabel $risk_score di bagian hasil aturan, salah satu nilai default berikut akan ditetapkan:

  • Jika aturan dikonfigurasi untuk menghasilkan notifikasi, $risk_score akan disetel ke 40.
  • Jika aturan tidak dikonfigurasi untuk menghasilkan pemberitahuan, $risk_score akan disetel ke 15.

Nilai $risk_score disimpan di kolom UDM security_result.risk_score.

Jenis data variabel hasil

Setiap variabel hasil dapat memiliki jenis data yang berbeda, yang ditentukan oleh ekspresi yang digunakan untuk menghitungnya. Kami mendukung jenis data hasil berikut:

  • bilangan bulat
  • float
  • string
  • daftar bilangan bulat
  • daftar float
  • daftar string

Logika kondisional

Anda dapat menggunakan logika bersyarat untuk menghitung nilai hasil. Kondisional ditentukan menggunakan pola sintaksis berikut:

if(BOOL_CLAUSE, THEN_CLAUSE)
if(BOOL_CLAUSE, THEN_CLAUSE, ELSE_CLAUSE)

Anda dapat membaca ekspresi kondisional sebagai "jika BOOL_CLAUSE benar, maka tampilkan THEN_CLAUSE, jika tidak, tampilkan ELSE_CLAUSE".

BOOL_CLAUSE harus dievaluasi ke nilai boolean. Ekspresi BOOL_CLAUSE memiliki bentuk yang sama dengan ekspresi di bagian events. Misalnya, dapat berisi:

  • Nama kolom UDM dengan operator perbandingan, misalnya:

    if($context.graph.entity.user.title = "Vendor", 100, 0)

  • variabel placeholder yang ditentukan di bagian events, misalnya:

    if($severity = "HIGH", 100, 0)

  • variabel hasil lain yang ditentukan di bagian outcome, misalnya:

    if($risk_score > 20, "HIGH", "LOW")

  • fungsi yang menampilkan boolean, misalnya:

    if(re.regex($e.network.email.from, `.*altostrat.com`), 100, 0)

  • mencari di daftar referensi, misalnya:

    if($u.principal.hostname in %my_reference_list_name, 100, 0)

  • perbandingan agregasi, misalnya:

    if(count($login.metadata.event_timestamp.seconds) > 5, 100, 0)

THEN_CLAUSE dan ELSE_CLAUSE harus memiliki jenis data yang sama. Kami mendukung bilangan bulat, float, dan string.

Anda dapat menghilangkan ELSE_CLAUSE jika jenis datanya adalah bilangan bulat atau float. Jika dihilangkan, ELSE_CLAUSE akan dievaluasi menjadi 0. Contoh:

`if($e.field = "a", 5)` is equivalent to `if($e.field = "a", 5, 0)`

Anda harus memberikan ELSE_CLAUSE jika jenis datanya adalah string atau jika THEN_CLAUSE adalah variabel placeholder atau variabel hasil.

Operasi matematika

Anda dapat menggunakan operasi matematika untuk menghitung jenis data bilangan bulat atau float di bagian outcome dan events aturan. Google Security Operations mendukung penambahan, pengurangan, perkalian, pembagian, dan modulus sebagai operator tingkat teratas dalam komputasi.

Cuplikan berikut adalah contoh komputasi di bagian outcome:

outcome:
  $risk_score = max(100 + if($severity = "HIGH", 10, 5) - if($severity = "LOW", 20, 0))

Operasi matematika diizinkan pada jenis operand berikut asalkan setiap operand dan seluruh ekspresi aritmatika diagregasi dengan benar (Lihat Agregasi):

  • Kolom peristiwa numerik
  • Variabel placeholder numerik yang ditentukan di bagian events
  • Variabel hasil numerik yang ditentukan di bagian outcome
  • Fungsi yang menampilkan int atau float
  • Agregasi yang menampilkan bilangan bulat atau float

Modulus tidak diizinkan pada float.

Variabel placeholder dalam hasil

Saat menghitung variabel hasil, Anda dapat menggunakan variabel placeholder yang ditentukan di bagian peristiwa aturan. Dalam contoh ini, asumsikan bahwa $email_sent_bytes ditentukan di bagian peristiwa aturan:

Contoh peristiwa tunggal:

// No match section, so this is a single-event rule.

outcome:
  // Use placeholder directly as an outcome value.
  $my_outcome = $email_sent_bytes

  // Use placeholder in a conditional.
  $other_outcome = if($file_size > 1024, "SEVERE", "MODERATE")

condition:
  $e

Contoh multi-peristiwa:

match:
  // This is a multi event rule with a match section.
  $hostname over 5m

outcome:
  // Use placeholder directly in an aggregation function.
  $max_email_size = max($email_sent_bytes)

  // Use placeholder in a mathematical computation.
  $total_bytes_exfiltrated = sum(
    1024
    + $email_sent_bytes
    + $file_event.principal.file.size
  )

condition:
  $email_event and $file_event

Variabel hasil dalam ekspresi penetapan hasil

Variabel hasil dapat digunakan untuk memperoleh variabel hasil lainnya, mirip dengan variabel pengganti yang ditentukan di bagian events. Anda dapat merujuk ke variabel hasil dalam penetapan variabel hasil lain dengan token $ yang diikuti dengan nama variabel. Variabel hasil harus ditentukan sebelum dapat dirujuk dalam teks aturan. Jika digunakan dalam ekspresi penetapan, variabel hasil tidak boleh diagregasi (Lihat Agregasi).

Pada contoh berikut, variabel hasil $risk_score memperoleh nilainya dari variabel hasil $event_count:

Contoh multi-peristiwa:

match:
  // This is a multi event rule with a match section.
  $hostname over 5m

outcome:
  // Aggregates all timestamp on login events in the 5 minute match window.
  $event_count = count($login.metadata.event_timestamp.seconds)

  // $event_count cannot be aggregated again.
  $risk_score = if($event_count > 5, "SEVERE", "MODERATE")

  // This is the equivalent of the 2 outcomes above combined.
  $risk_score2 = if(count($login.metadata.event_timestamp.seconds) > 5, "SEVERE", "MODERATE")

condition:
  $e

Variabel hasil dapat digunakan dalam jenis ekspresi apa pun di sisi kanan penetapan hasil, kecuali dalam ekspresi berikut:

  • Agregasi
  • Panggilan fungsi Arrays.length()
  • Dengan pengubah any atau all

Agregasi

Kolom peristiwa berulang adalah nilai non-skalar. Artinya, satu variabel menunjuk ke beberapa nilai. Misalnya, variabel kolom peristiwa $e.target.ip adalah kolom berulang dan dapat memiliki nol, satu, atau banyak nilai ip. Ini adalah nilai non-skalar. Sedangkan variabel kolom peristiwa $e.principal.hostname bukan kolom berulang dan hanya memiliki 1 nilai (yaitu nilai skalar).

Demikian pula, kolom peristiwa yang tidak berulang dan kolom peristiwa berulang yang digunakan di bagian hasil dari aturan dengan jendela kecocokan adalah nilai non-skalar. Misalnya, aturan berikut mengelompokkan peristiwa menggunakan bagian kecocokan dan merujuk ke kolom peristiwa yang tidak berulang di bagian hasil:

rule OutcomeAndMatchWindow{
  ...
  match:
    $userid over 5m
  outcome:
    $hostnames = array($e.principal.hostname)
  ...
}

Setiap jendela 5 menit tempat aturan dijalankan dapat berisi nol, satu, atau banyak peristiwa. Bagian hasil beroperasi pada semua peristiwa dalam jendela kecocokan. Setiap variabel kolom peristiwa yang dirujuk dalam bagian hasil dapat mengarah ke nol, satu, atau banyak nilai kolom pada setiap peristiwa dalam periode pencocokan. Misalnya, jika periode 5 menit berisi 5 peristiwa $e, $e.principal.hostname di bagian hasil menunjukkan lima nama host yang berbeda. Variabel kolom peristiwa $e.principal.hostname diperlakukan sebagai nilai non-skalar di bagian outcome aturan ini.

Karena variabel hasil harus selalu menghasilkan satu nilai skalar, setiap nilai non-skalar yang bergantung pada penetapan hasil harus diagregasi untuk menghasilkan satu nilai skalar. Di bagian hasil, berikut adalah nilai non-skalar dan harus diagregasi:

  • Kolom peristiwa (berulang atau tidak berulang) saat aturan menggunakan bagian kecocokan
  • Placeholder acara (berulang atau tidak berulang) saat aturan menggunakan bagian kecocokan
  • Kolom peristiwa berulang saat aturan tidak menggunakan bagian kecocokan
  • Placeholder acara berulang saat aturan tidak menggunakan bagian kecocokan

Kolom peristiwa skalar, placeholder peristiwa skalar, dan konstanta dapat di-wrap dalam fungsi agregasi dalam aturan yang tidak menyertakan bagian kecocokan. Namun, dalam sebagian besar kasus, agregasi ini menampilkan nilai yang di-wrap, sehingga tidak diperlukan. Pengecualiannya adalah agregasi array(), yang dapat Anda gunakan untuk mengonversi nilai skalar menjadi array secara eksplisit.

Variabel hasil diperlakukan seperti agregasi: variabel tersebut tidak boleh diagregasi ulang saat dirujuk dalam penetapan hasil lain.

Anda dapat menggunakan fungsi agregasi berikut:

  • max(): menampilkan nilai maksimum dari semua kemungkinan nilai. Hanya berfungsi dengan bilangan bulat dan float.
  • min(): menampilkan nilai minimum dari semua kemungkinan nilai. Hanya berfungsi dengan bilangan bulat dan float.
  • sum(): menampilkan jumlah untuk semua kemungkinan nilai. Hanya berfungsi dengan bilangan bulat dan float.
  • count_distinct(): mengumpulkan semua kemungkinan nilai, lalu menampilkan jumlah nilai yang berbeda dari kemungkinan nilai.
  • count(): berperilaku seperti count_distinct(), tetapi menampilkan jumlah nilai yang mungkin tidak berbeda.
  • array_distinct(): mengumpulkan semua kemungkinan nilai unik, lalu menampilkan daftar nilai ini. Fungsi ini akan memangkas daftar nilai unik menjadi 1.000 elemen acak. Penghapusan duplikat untuk mendapatkan daftar unik diterapkan terlebih dahulu, lalu pemangkasan diterapkan.
  • array(): berperilaku seperti array_distinct(), tetapi menampilkan daftar nilai yang tidak berbeda. Selain itu,daftar nilai dipangkas menjadi 1.000 elemen acak.
  • period_start_for_max(): awal jangka waktu saat nilai maksimum nilai yang tercantum terjadi.
  • period_start_for_min(): awal jangka waktu saat nilai minimum dari nilai yang tercantum terjadi.

Fungsi agregat penting saat aturan menyertakan bagian condition yang menentukan bahwa beberapa peristiwa harus ada, karena fungsi agregat akan beroperasi pada semua peristiwa yang menghasilkan deteksi.

Misalnya, jika bagian outcome dan condition Anda berisi:

outcome:
  $asset_id_count = count($event.principal.asset_id)
  $asset_id_distinct_count = count_distinct($event.principal.asset_id)

  $asset_id_list = array($event.principal.asset_id)
  $asset_id_distinct_list = array_distinct($event.principal.asset_id)

condition:
  #event > 1

Karena bagian kondisi mengharuskan ada lebih dari satu event untuk setiap deteksi, fungsi gabungan akan beroperasi pada beberapa peristiwa. Misalkan peristiwa berikut menghasilkan satu deteksi:

event:
  // UDM event 1
  asset_id="asset-a"

event:
  // UDM event 2
  asset_id="asset-b"

event:
  // UDM event 3
  asset_id="asset-b"

Maka nilai hasil Anda adalah:

  • $asset_id_count = 3
  • $asset_id_distinct_count = 2
  • $asset_id_list = ["asset-a", "asset-b", "asset-b"]
  • $asset_id_distinct_list = ["asset-a", "asset-b"]

Hal-hal yang perlu diketahui saat menggunakan bagian hasil:

Catatan dan batasan lainnya:

  • Bagian outcome tidak dapat mereferensikan variabel placeholder baru yang belum ditentukan di bagian events atau di bagian outcome.
  • Bagian outcome tidak dapat menggunakan variabel peristiwa yang belum ditentukan di bagian events.
  • Bagian outcome dapat menggunakan kolom peristiwa yang tidak digunakan di bagian events, asalkan variabel peristiwa yang menjadi bagian dari kolom peristiwa tersebut telah ditentukan di bagian events.
  • Bagian outcome hanya dapat mengorelasikan variabel peristiwa yang telah dikorelasikan di bagian events. Korelasi terjadi saat dua kolom peristiwa dari variabel peristiwa yang berbeda disamakan.

Anda dapat menemukan contoh menggunakan bagian hasil di Ringkasan YARA-L 2.0. Lihat Membuat analisis sesuai konteks untuk mengetahui detail tentang penghapusan duplikat deteksi dengan bagian hasil.

Sintaksis bagian kondisi

  • menentukan kondisi kecocokan atas peristiwa dan placeholder yang ditentukan di bagian events. Lihat bagian berikut, Kondisional peristiwa dan placeholder, untuk mengetahui detail selengkapnya.
  • (opsional) gunakan kata kunci and untuk menentukan kondisi kecocokan menggunakan variabel hasil yang ditentukan di bagian outcome. Lihat bagian berikut, Kondisional hasil, untuk mengetahui detail selengkapnya.

Menghitung karakter

Karakter # adalah karakter khusus di bagian condition. Jika digunakan sebelum nama variabel peristiwa atau placeholder, ini mewakili jumlah peristiwa atau nilai berbeda yang memenuhi semua kondisi bagian events.

Misalnya, #c > 1 berarti variabel c harus terjadi lebih dari 1 kali.

Karakter nilai

Karakter $ adalah karakter khusus di bagian condition. Jika digunakan sebelum nama variabel hasil, variabel ini mewakili nilai hasil tersebut.

Jika digunakan sebelum nama variabel acara atau placeholder (misalnya, $event), maka akan merepresentasikan #event > 0.

Kondisional peristiwa dan placeholder

Cantumkan predikat kondisi untuk peristiwa dan variabel placeholder menggunakan kata kunci and atau or. Anda dapat menggunakan and untuk menggabungkan kombinasi kondisi apa pun; namun, Anda hanya dapat menggunakan or jika semua kondisi mereferensikan variabel peristiwa yang sama.

Contoh valid penggunaan or di antara dua penampung pada peristiwa yang sama:

rule ValidConditionOr {
  meta:
  events:
      $e.metadata.event_type = "NETWORK_CONNECTION"

      // Note that all placeholders use the same event variable.
      $ph = $e.principal.user.userid  // Define a placeholder variable to put in match section.
      $ph2 = $e.principal.ip  // Define a second placeholder variable to put in condition section.
      $ph3 = $e.principal.hostname  // Define a third placeholder variable to put in condition section.

  match:
    $ph over 5m

  condition:
    $ph2 or $ph3
}

Contoh penggunaan or yang tidak valid antara dua kondisi pada peristiwa yang berbeda:

rule InvalidConditionOr {
  meta:
  events:
      $e.metadata.event_type = "NETWORK_CONNECTION"
      $e2.graph.metadata.entity_type = "FILE"
      $e2.graph.entity.hostname  = $e.principal.hostname

      $ph = $e.principal.user.userid  // Define a placeholder variable to put in match section.

  match:
    $ph over 5m

  condition:
    $e or $e2 // This line will cause an error because there is an or between events.
}

Kondisi Terikat dan Tidak Terikat

Kondisi berikut adalah kondisi terikat. Variabel peristiwa terkait harus ada, yang berarti setidaknya satu kemunculan peristiwa harus muncul dalam deteksi apa pun.

  • $var // equivalent to #var > 0
  • #var > n // where n >= 0
  • #var >= m // where m > 0

Kondisi berikut adalah kondisi tanpa batas. Hal ini memungkinkan variabel peristiwa terkait tidak ada, yang berarti bahwa kemungkinan tidak ada kemunculan peristiwa dalam deteksi dan setiap referensi ke kolom pada variabel peristiwa akan menghasilkan nilai nol. Kondisi tanpa batas dapat digunakan untuk mendeteksi tidak adanya peristiwa selama jangka waktu tertentu. Misalnya, peristiwa ancaman tanpa peristiwa mitigasi dalam jangka waktu 10 menit. Aturan yang menggunakan kondisi tidak terikat disebut aturan tidak ada.

  • !$var // equivalent to #var = 0
  • #var >= 0
  • #var < n // where n > 0
  • #var <= m // where m >= 0

Persyaratan untuk tidak ada

Agar aturan dengan tidak ada dapat dikompilasi, aturan tersebut harus memenuhi persyaratan berikut:

  1. Setidaknya satu peristiwa UDM harus memiliki kondisi yang terikat (yaitu, setidaknya satu peristiwa UDM harus ada).
  2. Jika placeholder memiliki kondisi yang tidak terikat, placeholder tersebut harus dikaitkan dengan setidaknya satu peristiwa UDM terikat.
  3. Jika entity memiliki kondisi tanpa batas, entity tersebut harus dikaitkan dengan setidaknya satu peristiwa UDM yang memiliki batas.

Pertimbangkan aturan berikut dengan bagian kondisi yang dihilangkan:

rule NonexistenceExample {
  meta:
  events:
      $u1.metadata.event_type = "NETWORK_CONNECTION" // $u1 is a UDM event.
      $u2.metadata.event_type = "NETWORK_CONNECTION" // $u2 is a UDM event.
      $e1.graph.metadata.entity_type = "FILE"        // $e1 is an Entity.
      $e2.graph.metadata.entity_type = "FILE"        // $e2 is an Entity.

      $user = $u1.principal.user.userid // Match variable is required for Multi-Event Rule.

      // Placeholder Associations:
      //   u1        u2
      //   |  \    /
      // port   ip
      //   |       \
      //   e1        e2
      $u1.target.port = $port
      $e1.graph.entity.port = $port
      $u1.principal.ip = $ip
      $u2.target.ip = $ip
      $e2.graph.entity.ip = $ip

      // UDM-Entity Associations:
      // u1 - u2
      // |  \  |
      // e1   e2
      $u1.metadata.event_type = $u2.metadata.event_type
      $e1.graph.entity.hostname = $u1.principal.hostname
      $e2.graph.entity.hostname = $u1.target.hostname
      $e2.graph.entity.hostname = $u2.principal.hostname

  match:
    $user over 5m

  condition:
      <condition_section>
}

Berikut adalah contoh valid untuk <condition_section>:

  • $u1 and !$u2 and $e1 and $e2
    • Semua peristiwa dan entitas UDM ada di bagian kondisi.
    • Setidaknya satu peristiwa UDM dibatasi.
  • $u1 and !$u2 and $e1 and !$e2
    • $e2 tidak memiliki batas, yang diizinkan karena terkait dengan $u1, yang memiliki batas. Jika $e2 tidak dikaitkan dengan $u1, hal ini tidak valid.
  • #port > 50 and #ip = 0
    • Tidak ada peristiwa dan entitas UDM di bagian kondisi; namun, placeholder yang ada mencakup semua peristiwa dan entitas UDM.
    • $ip ditetapkan ke $u1 dan $u2, serta #ip = 0 adalah kondisi yang tidak terikat. Namun, kondisi terikat lebih kuat daripada kondisi tidak terikat. Karena $port ditetapkan ke $u1 dan #port > 50 adalah kondisi yang dibatasi, $u1 masih dibatasi.

Berikut adalah contoh tidak valid untuk <condition_section>:

  • $u1 and $e1
    • Setiap peristiwa dan entitas UDM yang muncul di Bagian Peristiwa harus muncul di Bagian Kondisi (atau memiliki placeholder yang ditetapkan untuknya yang muncul di Bagian Kondisi).
  • $u1, $u2, $e1, $u2, #port > 50
    • Koma tidak diizinkan sebagai pemisah kondisi.
  • !$u1 and !$u2 and $e1 and $e2
    • Melanggar persyaratan pertama bahwa setidaknya satu peristiwa UDM dibatasi.
  • ($u1 or #port < 50) and $u2 and $e1 and $e2
    • Kata kunci or tidak didukung dengan kondisi tanpa batas.
  • ($u1 or $u2) and $e1 and $e2
    • Kata kunci or tidak didukung di antara variabel peristiwa yang berbeda.
  • not $u1 and $u2 and $e1 and $e2
    • Kata kunci not tidak diizinkan untuk kondisi acara dan placeholder.
  • #port < 50 and #ip = 0
    • Placeholder yang ada mencakup semua peristiwa dan entitas UDM; namun, semua kondisinya tidak terikat. Artinya, tidak ada peristiwa UDM yang dibatasi, sehingga menyebabkan aturan gagal dikompilasi.

Kondisional hasil

Cantumkan predikat kondisi untuk variabel hasil di sini, yang digabungkan dengan kata kunci and atau or, atau diawali dengan kata kunci not.

Tentukan kondisi hasil secara berbeda, bergantung pada jenis variabel hasil:

  • integer: bandingkan dengan literal bilangan bulat dengan operator =, >, >=, <, <=, !=, misalnya:

    $risk_score > 10

  • float: bandingkan dengan literal float menggunakan operator =, >, >=, <, <=, !=, misalnya:

    $risk_score <= 5.5

  • string: bandingkan dengan literal string dengan = atau !=, misalnya:

    $severity = "HIGH"

  • daftar bilangan bulat atau array: tentukan kondisi menggunakan fungsi arrays.contains, misalnya:

    arrays.contains($event_ids, "id_1234")

Klasifikasi aturan

Menentukan hasil bersyarat dalam aturan yang memiliki bagian kecocokan berarti bahwa aturan akan diklasifikasikan sebagai aturan multi-peristiwa untuk kuota aturan. Lihat aturan peristiwa tunggal dan aturan multi-peristiwa untuk mengetahui informasi selengkapnya tentang klasifikasi peristiwa tunggal dan multi-peristiwa.

Sintaksis bagian opsi

Di bagian options, Anda dapat menentukan opsi untuk aturan. Berikut adalah contoh cara menentukan bagian opsi:

rule RuleOptionsExample {
  // Other rule sections

  options:
    allow_zero_values = true
}

Anda dapat menentukan opsi menggunakan sintaksis key = value, dengan key harus berupa nama opsi yang telah ditentukan sebelumnya dan value harus berupa nilai yang valid untuk opsi, seperti yang ditentukan untuk opsi berikut:

allow_zero_values

Nilai yang valid untuk opsi ini adalah true dan false, yang menentukan apakah opsi ini diaktifkan atau tidak. Nilai defaultnya adalah false. Opsi ini dinonaktifkan jika tidak ditentukan dalam aturan.

Untuk mengaktifkan setelan ini, tambahkan kode berikut ke bagian opsi aturan Anda: allow_zero_values = true. Dengan demikian, aturan tidak akan secara implisit memfilter nilai nol placeholder yang digunakan di bagian kecocokan, seperti yang dijelaskan dalam penanganan nilai nol di bagian kecocokan.

suppression_window

Opsi suppression_window memungkinkan Anda mengontrol seberapa sering aturan memicu deteksi. Opsi ini mencegah aturan yang sama menghasilkan beberapa deteksi dalam jangka waktu yang ditentukan, meskipun kondisi aturan terpenuhi beberapa kali. Windowing penekanan menggunakan pendekatan jendela bergulir, yang menekan duplikat di jendela berukuran tetap yang tidak tumpang-tindih.

Secara opsional, Anda dapat memberikan suppression_key untuk lebih menyempurnakan instance aturan yang dihentikan dalam periode penghentian. Jika tidak ditentukan, semua kemunculan aturan akan dihentikan. Kunci ini ditetapkan sebagai variabel hasil.

Dalam contoh berikut, suppression_window disetel ke 5m dan suppression_key disetel ke variabel $hostname. Setelah aturan memicu deteksi untuk $hostname, deteksi lebih lanjut untuk $hostname akan dihentikan selama lima menit berikutnya. Namun, jika aturan dipicu pada peristiwa dengan nama host yang berbeda, deteksi akan dibuat.

Nilai default suppression_window adalah 0; artinya, jendela pembatalan diaktifkan secara default. Opsi ini hanya berfungsi untuk aturan acara tunggal yang tidak memiliki bagian match.

Contoh:

rule SuppressionWindowExample {
  // Other rule sections

  outcome:
    $suppression_key = $hostname

  options:
    suppression_window = 5m
}

Aturan deteksi gabungan

Deteksi gabungan di Google SecOps melibatkan penghubungan beberapa aturan YARA-L. Bagian ini menjelaskan cara membuat aturan komposit. Untuk mengetahui ringkasan deteksi gabungan, lihat Ringkasan deteksi gabungan.

Struktur aturan

Aturan deteksi komposit selalu merupakan aturan multiperistiwa dan mengikuti struktur dan sintaksis yang sama. Persyaratan berikut berlaku untuk aturan deteksi komposit:

  • Aturan komposit harus menggunakan bagian match untuk menentukan kondisi pemicu deteksi.
  • Aturan yang menggunakan kolom deteksi dan peristiwa UDM harus secara eksplisit menggabungkan sumber data ini.

Untuk mengetahui informasi tentang batasan aturan, lihat Batasan.

Menggunakan deteksi sebagai input ke aturan

Aturan komposit dapat merujuk pada deteksi aturan yang dihasilkan oleh aturan kustom atau terseleksi. Google SecOps menyediakan dua metode untuk melakukannya.

Merujuk konten deteksi menggunakan variabel hasil, variabel pencocokan, atau label meta

Untuk mengakses data dari deteksi tanpa merujuk ke peristiwa UDM asli, gunakan variabel outcome, variabel match, atau label meta. Sebaiknya gunakan pendekatan ini karena memberikan fleksibilitas yang lebih besar dan kompatibilitas yang lebih baik di berbagai jenis aturan.

Misalnya, beberapa aturan dapat menyimpan string (seperti URL, nama file, atau kunci registri) dalam variabel outcome umum jika Anda mencari string tersebut di berbagai konteks. Untuk mengakses string ini dari aturan komposit, mulai dengan detection dan temukan informasi yang relevan menggunakan elemen dari Resource koleksi.

Contoh: Misalnya, aturan deteksi menghasilkan informasi berikut:

  • Variabel hasil: dest_domain = "cymbal.com"
  • Kolom UDM: target.hostname = "cymbal.com"

Dalam aturan komposit, Anda dapat mengakses data ini menggunakan jalur berikut:

  • detection.detection.outcomes["dest_domain"] untuk mengakses variabel hasil dest_domain.
  • detection.collection_elements.references.event.target.hostname untuk mengakses kolom UDM target.hostname.
  • detection.time_window.start_time.seconds untuk mengakses stempel waktu deteksi.

Collection API dan SecurityResult API menyediakan akses ke keduanya:

  • Nilai metadata dan hasil deteksi (detection.detection)
  • Peristiwa UDM pokok dari aturan yang dirujuk (collection_elements)

Merujuk konten deteksi menggunakan ID aturan atau nama aturan

Anda dapat mereferensikan aturan berdasarkan nama atau ID-nya. Sebaiknya gunakan pendekatan ini jika logika deteksi Anda bergantung pada aturan tertentu. Mereferensikan aturan yang relevan menurut nama atau ID akan meningkatkan performa dan mencegah waktu tunggu habis dengan mengurangi data yang dianalisis. Misalnya, Anda dapat langsung membuat kueri kolom seperti target.url atau principal.ip dari deteksi sebelumnya yang diketahui.

  • Merujuk aturan menurut ID aturan (direkomendasikan): gunakan kolom detection.detection.rule_id untuk merujuk aturan menurut ID. Anda dapat menemukan ID aturan di URL aturan di Google SecOps. Aturan buatan pengguna memiliki ID dalam format ru_UUID, sedangkan deteksi pilihan memiliki ID dalam format ur_UUID. Contoh:

    detection.detection.rule_id = "ru_e0d3f371-6832-4d20-b0ad-1f4e234acb2b"

  • Merujuk aturan berdasarkan nama aturan: gunakan kolom detection.detection.rule_name untuk merujuk aturan berdasarkan nama. Anda dapat menentukan nama aturan yang tepat atau menggunakan ekspresi reguler untuk mencocokkannya. Contoh:

    • detection.detection.rule_name = "My Rule Name"
    • detection.detection.rule_name = "/PartOfName/"

Catatan: Sebaiknya gunakan ID aturan untuk referensi karena ID bersifat unik dan tidak berubah. Nama aturan dapat diubah, yang berpotensi merusak deteksi komposit Anda.

Menggabungkan peristiwa dan deteksi

Aturan komposit dapat menggabungkan berbagai sumber data, termasuk peristiwa UDM, data grafik entitas, dan kolom deteksi. Panduan berikut berlaku:

  • Gunakan variabel berbeda per sumber—Tetapkan variabel peristiwa unik ke setiap sumber data (misalnya, $e untuk peristiwa, $d untuk deteksi), dengan sumber data yang mencakup peristiwa, entitas, dan deteksi.
  • Gabungkan sumber berdasarkan konteks bersama—Hubungkan sumber data menggunakan nilai umum, seperti ID pengguna, alamat IP, atau nama domain dalam kondisi aturan Anda.
  • Tentukan periode pencocokan—Selalu sertakan klausa match dengan periode waktu tidak lebih dari 48 jam.

Contoh:

rule CheckCuratedDetection_with_EDR_and_EG {
  meta:
    author = "noone@cymbal.com"
  events:
    $d.detection.detection.rule_name = /SCC: Custom Modules: Configurable Bad Domain/
    $d.detection.collection_elements.references.event.network.dns.questions.name = $domain
    $d.detection.collection_elements.references.event.principal.asset.hostname = $hostname

    $e.metadata.log_type = "LIMACHARLIE_EDR"
    $e.metadata.product_event_type = "NETWORK_CONNECTIONS"
    $domain = re.capture($e.principal.process.command_line, "\\s([a-zA-Z0-9.-]+\\.[a-zA-Z0-9.-]+)$")
    $hostname = re.capture($e.principal.hostname, "([^.]*)")

    $prevalence.graph.metadata.entity_type = "DOMAIN_NAME"
    $prevalence.graph.metadata.source_type = "DERIVED_CONTEXT"
    $prevalence.graph.entity.hostname = $domain
    $prevalence.graph.entity.domain.prevalence.day_count = 10
    $prevalence.graph.entity.domain.prevalence.rolling_max <= 5
    $prevalence.graph.entity.domain.prevalence.rolling_max > 0

  match:
    $hostname over 1h

  outcome:
    $risk_score = 80
    $CL_target = array($domain)

  condition:
    $e and $d and $prevalence
}

Membuat deteksi gabungan berurutan

Deteksi komposit berurutan mengidentifikasi pola peristiwa terkait yang urutan deteksinya penting, seperti deteksi upaya login brute force yang diikuti dengan login yang berhasil. Pola ini dapat menggabungkan beberapa deteksi dasar, peristiwa UDM mentah, atau keduanya.

Untuk membuat deteksi komposit berurutan, Anda harus menerapkan urutan tersebut dalam aturan Anda. Untuk menerapkan urutan yang diharapkan, gunakan salah satu metode berikut:

  • Jendela geser: Tentukan urutan deteksi menggunakan jendela geser dalam kondisi match Anda.
  • Perbandingan stempel waktu: Bandingkan stempel waktu deteksi dalam logika aturan Anda untuk memverifikasi bahwa stempel waktu tersebut terjadi dalam urutan yang dipilih.

Contoh:

events:
    $d1.detection.detection.rule_name = "fileEvent_rule"
    $userid = $d1.detection.detection.outcomes["user"]
    $hostname = $d1.detection.detection.outcomes["hostname"]

    $d2.detection.detection.rule_name = "processExecution_rule"
    $userid = $d2.detection.detection.outcomes["user"]
    $hostname = $d2.detection.detection.outcomes["hostname"]

    $d3.detection.detection.rule_name = "networkEvent_rule"
    $userid = $d3.detection.detection.outcomes["user"]
    $hostname = $d3.detection.detection.outcomes["hostname"]

$d3.detection.collection_elements.references.event.metadata.event_timestamp.seconds > $d2.detection.collection_elements.references.event.metadata.event_timestamp.seconds

  match:
    $userid over 24h after $d1

Ekspresi Boolean

Ekspresi boolean adalah ekspresi dengan jenis boolean.

Perbandingan

Untuk ekspresi biner yang akan digunakan sebagai kondisi, gunakan sintaksis berikut:

  • <EXPR> <OP> <EXPR>

Ekspresi dapat berupa kolom peristiwa, variabel, literal, atau ekspresi fungsi.

Contoh:

  • $e.source.hostname = "host1234"
  • $e.source.port < 1024
  • 1024 < $e.source.port
  • $e1.source.hostname != $e2.target.hostname
  • $e1.metadata.collected_timestamp.seconds > $e2.metadata.collected_timestamp.seconds
  • $port >= 25
  • $host = $e2.target.hostname
  • "google-test" = strings.concat($e.principal.hostname, "-test")
  • "email@google.org" = re.replace($e.network.email.from, "com", "org")

Jika kedua sisi adalah literal, hal ini dianggap sebagai error kompilasi.

Functions

Beberapa ekspresi fungsi menampilkan nilai boolean, yang dapat digunakan sebagai predikat individual di bagian events. Fungsi tersebut adalah:

  • re.regex()
  • net.ip_in_range_cidr()

Contoh:

  • re.regex($e.principal.hostname, `.*\.google\.com`)
  • net.ip_in_range_cidr($e.principal.ip, "192.0.2.0/24")

Ekspresi daftar referensi

Anda dapat menggunakan daftar rujukan di bagian peristiwa. Lihat bagian tentang Daftar Referensi untuk mengetahui detail selengkapnya.

Ekspresi logis

Anda dapat menggunakan operator logis and dan logis or di bagian events seperti yang ditunjukkan dalam contoh berikut:

  • $e.metadata.event_type = "NETWORK_DNS" or $e.metadata.event_type = "NETWORK_DHCP"
  • ($e.metadata.event_type = "NETWORK_DNS" and $e.principal.ip = "192.0.2.12") or ($e.metadata.event_type = "NETWORK_DHCP" and $e.principal.mac = "AB:CD:01:10:EF:22")
  • not $e.metadata.event_type = "NETWORK_DNS"

Secara default, urutan prioritas dari tertinggi ke terendah adalah not, and, or.

Misalnya, "a atau b dan c" dievaluasi sebagai "a atau (b dan c)" jika operator or dan and ditentukan secara eksplisit dalam ekspresi.

Di bagian events, predikat digabungkan menggunakan operator and jika operator tidak ditentukan secara eksplisit.

Urutan evaluasi mungkin berbeda jika operator and tersirat dalam ekspresi.

Misalnya, perhatikan ekspresi perbandingan berikut yang or-nya ditentukan secara eksplisit. Operator and tersirat.

$e1.field = "bat"
or $e1.field = "baz"
$e2.field = "bar"

Contoh ini ditafsirkan sebagai berikut:

($e1.field = "bat" or $e1.field = "baz")
and ($e2.field = "bar")

Karena or ditentukan secara eksplisit, predikat di sekitar or dikelompokkan dan dievaluasi terlebih dahulu. Predikat terakhir, $e2.field = "bar" digabungkan secara implisit menggunakan and. Hasilnya adalah urutan evaluasi berubah.

Jenis yang di-enum

Anda dapat menggunakan operator dengan jenis yang di-enum. Hal ini dapat diterapkan pada aturan untuk menyederhanakan dan mengoptimalkan (menggunakan operator, bukan daftar referensi) performa.

Dalam contoh berikut, 'USER_UNCATEGORIZED' dan 'USER_RESOURCE_DELETION' sesuai dengan 15000 dan 15014, sehingga aturan akan mencari semua peristiwa yang tercantum:

$e.metadata.event_type >= "USER_CATEGORIZED" and $e.metadata.event_type <= "USER_RESOURCE_DELETION"

Daftar acara:

  • USER_RESOURCE_DELETION
  • USER_RESOURCE_UPDATE_CONTENT
  • USER_RESOURCE_UPDATE_PERMISSIONS
  • USER_STATS
  • USER_UNCATEGORIZED

Pengubah Nocase

Jika memiliki ekspresi perbandingan antara nilai string atau ekspresi reguler, Anda dapat menambahkan nocase di akhir ekspresi untuk mengabaikan kapitalisasi.

  • $e.principal.hostname != "http-server" nocase
  • $e1.principal.hostname = $e2.target.hostname nocase
  • $e.principal.hostname = /dns-server-[0-9]+/ nocase
  • re.regex($e.target.hostname, `client-[0-9]+`) nocase

Ini tidak dapat digunakan jika jenis kolom adalah nilai yang di-enum. Contoh berikut tidak valid dan akan menghasilkan error kompilasi:

  • $e.metadata.event_type = "NETWORK_DNS" nocase
  • $e.network.ip_protocol = "TCP" nocase

Kolom berulang

Dalam Model Data Terpadu (UDM), beberapa kolom diberi label sebagai berulang, yang menunjukkan bahwa kolom tersebut adalah daftar nilai atau jenis pesan lainnya.

Kolom berulang dan ekspresi boolean

Ada 2 jenis ekspresi boolean yang bertindak pada kolom berulang:

  1. Diubah
  2. Tidak dimodifikasi

Pertimbangkan peristiwa berikut:

event_original {
  principal {
    // ip is a repeated field
    ip: [ "192.0.2.1", "192.0.2.2", "192.0.2.3" ]

    hostname: "host"
  }
}

Ekspresi yang diubah

Bagian berikut menjelaskan tujuan dan cara menggunakan pengubah any dan all dalam ekspresi.

apa pun

Jika elemen mana pun dari kolom berulang memenuhi kondisi, peristiwa secara keseluruhan memenuhi kondisi.

  • event_original memenuhi any $e.principal.ip = "192.0.2.1".
  • event_original gagal any $e.repeated_field.field_a = "9.9.9.9.
semua

Jika semua elemen kolom berulang memenuhi kondisi, acara secara keseluruhan memenuhi kondisi.

  • event_original memenuhi net.ip_in_range_cidr(all $e.principal.ip, "192.0.2.0/8").
  • event_original gagal all $e.principal.ip = "192.0.2.2".

Saat menulis kondisi dengan any atau all, perhatikan bahwa meniadakan kondisi dengan not mungkin tidak memiliki arti yang sama dengan menggunakan operator yang dinegasi.

Contoh:

  • not all $e.principal.ip = "192.168.12.16" memeriksa apakah tidak semua alamat IP cocok dengan 192.168.12.16, yang berarti aturan tersebut memeriksa apakah setidaknya satu alamat IP tidak cocok dengan 192.168.12.16.
  • all $e.principal.ip != "192.168.12.16" memeriksa apakah semua alamat IP tidak cocok dengan 192.168.12.16, yang berarti aturan tersebut memeriksa bahwa tidak ada alamat IP yang cocok dengan 192.168.12.16.

Batasan:

  • Operator any dan all hanya kompatibel dengan kolom berulang (bukan kolom skalar).
  • any dan all tidak dapat digunakan untuk menggabungkan dua kolom berulang. Misalnya, any $e1.principal.ip = $e2.principal.ip tidak valid.
  • Operator any dan all tidak didukung dengan ekspresi daftar referensi.

Ekspresi yang tidak dimodifikasi

Dengan ekspresi yang tidak diubah, setiap elemen dalam kolom berulang diperlakukan secara terpisah. Jika kolom berulang suatu peristiwa berisi n elemen, aturan akan diterapkan pada n salinan peristiwa, di mana setiap salinan memiliki salah satu elemen kolom berulang. Salinan ini bersifat sementara dan tidak disimpan.

Aturan ini diterapkan pada salinan berikut:

salinan acara principal.ip principal.hostname
event_copy_1 "192.0.2.1" "host"
event_copy_2 "192.0.2.2" "host"
event_copy_3 "192.0.2.3" "host"

Jika salinan peristiwa memenuhi semua kondisi yang tidak diubah pada kolom berulang, peristiwa secara keseluruhan memenuhi semua kondisi. Artinya, jika Anda memiliki beberapa kondisi pada kolom berulang, salinan peristiwa harus memenuhi semua kondisi tersebut. Contoh aturan berikut menggunakan set data contoh sebelumnya untuk menunjukkan perilaku ini.

Aturan berikut menampilkan satu kecocokan saat dijalankan terhadap set data contoh event_original, karena event_copy_1 memenuhi semua predikat peristiwa:

rule repeated_field_1 {
  meta:
  events:
    net.ip_in_range_cidr($e.principal.ip, "192.0.2.0/8") // Checks if IP address matches 192.x.x.x
    $e.principal.ip = "192.0.2.1"
  condition:
    $e
}

Aturan berikut tidak menampilkan kecocokan saat dijalankan terhadap set data contoh event_original, karena tidak ada salinan peristiwa di $e.principal.ip yang memenuhi semua predikat peristiwa.

rule repeated_field_2 {
  meta:
  events:
    $e.principal.ip = "192.0.2.1"
    $e.principal.ip = "192.0.2.2"
  condition:
    $e
}

Ekspresi yang diubah pada kolom berulang kompatibel dengan ekspresi yang tidak diubah pada kolom berulang karena daftar elemen sama untuk setiap salinan peristiwa. Pertimbangkan aturan berikut:

rule repeated_field_3 {
  meta:
  events:
    any $e.principal.ip = "192.0.2.1"
    $e.principal.ip = "192.0.2.3"
  condition:
    $e
}

Aturan ini diterapkan pada salinan berikut:

salinan acara principal.ip $e.principal.ip
event_copy_1 "192.0.2.1" ["192.0.2.1", "192.0.2.2", "192.0.2.3"]
event_copy_2 "192.0.2.2" ["192.0.2.1", "192.0.2.2", "192.0.2.3"]
event_copy_3 "192.0.2.3" ["192.0.2.1", "192.0.2.2", "192.0.2.3"]

Dalam hal ini, semua salinan memenuhi any $e.principal.ip = "192.0.2.1", tetapi hanya event_copy_3 yang memenuhi $e.principal.ip = "192.0.2.3". Akibatnya, acara secara keseluruhan akan cocok.

Cara lain untuk memahami jenis ekspresi ini adalah:

  • Ekspresi pada kolom berulang yang menggunakan any atau all beroperasi pada daftar di event_original.
  • Ekspresi pada kolom berulang yang tidak menggunakan any atau all beroperasi pada setiap peristiwa event_copy_n.

Kolom berulang dan placeholder

Kolom berulang berfungsi dengan penetapan placeholder. Mirip dengan ekspresi yang tidak diubah pada kolom berulang, salinan peristiwa dibuat untuk setiap elemen. Dengan menggunakan contoh event_copy yang sama, placeholder mengambil nilai kolom berulang event_copy_n, untuk setiap salinan peristiwa dengan n adalah nomor salinan peristiwa. Jika placeholder digunakan di bagian kecocokan, hal ini dapat menghasilkan beberapa kecocokan.

Contoh berikut menghasilkan satu kecocokan. Placeholder $ip sama dengan 192.0.2.1 untuk event_copy_1, yang memenuhi predikat dalam aturan. Contoh peristiwa kecocokan berisi satu elemen, event_original.

// Generates 1 match.
rule repeated_field_placeholder1 {
  meta:
  events:
    $ip = $e.principal.ip
    $ip = "192.0.2.1"
    $host = $e.principal.hostname

  match:
    $host over 5m

  condition:
    $e
}

Contoh berikut menghasilkan tiga kecocokan. Placeholder $ip sama dengan nilai yang berbeda, untuk setiap salinan event_copy_n yang berbeda. Pengelompokan dilakukan pada $ip karena berada di bagian kecocokan. Oleh karena itu, Anda akan mendapatkan tiga kecocokan dengan setiap kecocokan memiliki nilai yang berbeda untuk variabel kecocokan $ip. Setiap kecocokan memiliki contoh peristiwa yang sama: satu elemen, event_original.

// Generates 3 matches.
rule repeated_field_placeholder2 {
  meta:
  events:
    $ip = $e.principal.ip
    net.ip_in_range_cidr($ip, "192.0.2.0/8") // Checks if IP matches 192.x.x.x

  match:
    $ip over 5m

  condition:
    $e
}

Hasil menggunakan placeholder yang ditetapkan ke kolom berulang

Penampung ditetapkan ke setiap elemen dari setiap kolom berulang - bukan seluruh daftar. Oleh karena itu, saat digunakan di bagian hasil, hasil dihitung hanya menggunakan elemen yang memenuhi bagian sebelumnya.

Pertimbangkan aturan berikut:

rule outcome_repeated_field_placeholder {
  meta:
  events:
    $ip = $e.principal.ip
    $ip = "192.0.2.1" or $ip = "192.0.2.2"
    $host = $e.principal.hostname

  match:
    $host over 5m

  outcome:
    $o = array_distinct($ip)

  condition:
    $e
}

Ada 4 tahap eksekusi untuk aturan ini. Tahap pertama adalah penyalinan peristiwa:

salinan acara $ip $host $e
event_copy_1 "192.0.2.1" "host" event_id
event_copy_2 "192.0.2.2" "host" event_id
event_copy_3 "192.0.2.3" "host" event_id

Bagian peristiwa kemudian akan memfilter baris yang tidak cocok dengan filter:

salinan acara $ip $host $e
event_copy_1 "192.0.2.1" "host" event_id
event_copy_2 "192.0.2.2" "host" event_id

event_copy_3 difilter karena "192.0.2.3" tidak memenuhi $ip = "192.0.2.1" or $ip = "192.0.2.2".

Bagian kecocokan kemudian akan dikelompokkan berdasarkan variabel kecocokan dan bagian hasil akan melakukan penggabungan pada setiap grup:

$host $o $e
"host" ["192.0.2.1", "192.0.2.2"] event_id

$o = array_distinct($ip) dihitung menggunakan $ip dari tahap sebelumnya, bukan tahap penyalinan peristiwa.

Terakhir, bagian kondisi akan memfilter setiap grup. Karena aturan ini hanya memeriksa keberadaan $e, baris dari sebelumnya akan menghasilkan satu deteksi.

$o tidak berisi semua elemen dari $e.principal.ip karena tidak semua elemen memenuhi semua kondisi di bagian peristiwa. Namun, semua elemen e.principal.ip akan muncul dalam contoh peristiwa karena contoh peristiwa menggunakan event_original.

Pengindeksan array

Anda dapat melakukan pengindeksan array pada kolom berulang. Untuk mengakses elemen kolom berulang ke-n, gunakan sintaksis daftar standar (elemen diindeks 0). Elemen di luar batas menampilkan nilai default.

  • $e.principal.ip[0] = "192.168.12.16"
  • $e.principal.ip[999] = "" Jika ada kurang dari 1.000 elemen, nilai ini akan dievaluasi menjadi true.

Batasan:

  • Indeks harus berupa literal bilangan bulat non-negatif. Misalnya, $e.principal.ip[-1] tidak valid.
  • Nilai yang memiliki jenis int (misalnya, placeholder yang ditetapkan ke int) tidak dihitung.
  • Pengindeksan array tidak dapat digabungkan dengan any atau all. Misalnya, any $e.intermediary.ip[0] tidak valid.
  • Pengindeksan array tidak dapat digabungkan dengan sintaksis peta. Misalnya, $e.additional.fields[0]["key"] tidak valid.
  • Jika jalur kolom berisi beberapa kolom berulang, semua kolom berulang harus menggunakan pengindeksan array. Misalnya, $e.intermediary.ip[0] tidak valid karena intermediary dan ip adalah kolom berulang, tetapi hanya ada indeks untuk ip.

Pesan berulang

Jika kolom message diulang, efek yang tidak diinginkan adalah mengurangi kemungkinan kecocokan. Hal ini diilustrasikan dalam contoh berikut.

Pertimbangkan peristiwa berikut:

event_repeated_message {
  // about is a repeated message field.
  about {
    // ip is a repeated string field.
    ip: [ "192.0.2.1", "192.0.2.2", "192.0.2.3" ]

    hostname: "alice"
  }
  about {
    hostname: "bob"
  }
}

Seperti yang dinyatakan untuk ekspresi yang tidak diubah pada kolom berulang, salinan sementara peristiwa dibuat untuk setiap elemen kolom berulang. Pertimbangkan aturan berikut:

rule repeated_message_1 {
  meta:
  events:
    $e.about.ip = "192.0.2.1"
    $e.about.hostname = "bob"
  condition:
    $e
}

Aturan ini diterapkan pada salinan berikut:

salinan acara about.ip about.hostname
event_copy_1 "192.0.2.1" "alice"
event_copy_2 "192.0.2.2" "alice"
event_copy_3 "192.0.2.3" "alice"
event_copy_4 "" "bob"

Peristiwa tidak cocok dengan aturan karena tidak ada salinan peristiwa yang memenuhi semua ekspresi.

Pesan berulang dan pengindeksan array

Perilaku tidak terduga lainnya dapat terjadi saat menggunakan pengindeksan array dengan ekspresi yang tidak dimodifikasi pada kolom pesan berulang. Perhatikan contoh aturan berikut yang menggunakan pengindeksan array:

rule repeated_message_2 {
  meta:
  events:
    $e.about.ip = "192.0.2.1"
    $e.about[1].hostname = "bob"
  condition:
    $e
}

Aturan ini diterapkan ke salinan berikut:

salinan acara about.ip about[1].hostname
event_copy_1 "192.0.2.1" "bob"
event_copy_2 "192.0.2.2" "bob"
event_copy_3 "192.0.2.3" "bob"
event_copy_4 "" "bob"

Karena event_copy_1 memenuhi semua ekspresi dalam repeated_message_2, peristiwa cocok dengan aturan.

Hal ini dapat menyebabkan perilaku yang tidak terduga karena aturan repeated_message_1 tidak memiliki pengindeksan array dan tidak menghasilkan kecocokan, sedangkan aturan repeated_message_2 menggunakan pengindeksan array dan menghasilkan kecocokan.

Komentar

Tentukan komentar dengan dua karakter garis miring (// comment) atau komentar multi-baris yang dipisahkan menggunakan karakter garis miring tanda bintang (/* comment */), seperti yang Anda lakukan di C.

Literal

Bilangan bulat dan float non-negatif, string, boolean, dan literal ekspresi reguler didukung.

Literal string dan ekspresi reguler

Anda dapat menggunakan salah satu karakter kutipan berikut untuk menyertakan string di YARA-L 2.0. Namun, teks yang dikutip ditafsirkan secara berbeda, bergantung pada mana yang Anda gunakan.

  1. Tanda petik ganda (") — Gunakan untuk string normal. Harus menyertakan karakter escape.
    Misalnya: "hello\tworld" —\t ditafsirkan sebagai tab

  2. Tanda petik terbalik (`) — Digunakan untuk menafsirkan semua karakter secara harfiah.
    Misalnya: `hello\tworld` —\t tidak ditafsirkan sebagai tab

Untuk ekspresi reguler, Anda memiliki dua opsi.

Jika Anda ingin menggunakan ekspresi reguler secara langsung tanpa fungsi re.regex(), gunakan /regex/ untuk literal ekspresi reguler.

Anda juga dapat menggunakan literal string sebagai literal ekspresi reguler saat menggunakan fungsi re.regex(). Perhatikan bahwa untuk literal string tanda kutip ganda, Anda harus meng-escape karakter garis miring terbalik dengan karakter garis miring terbalik, yang mungkin terlihat aneh.

Misalnya, ekspresi reguler berikut setara:

  • re.regex($e.network.email.from, `.*altostrat\.com`)
  • re.regex($e.network.email.from, ".*altostrat\\.com")
  • $e.network.email.from = /.*altostrat\.com/

Google merekomendasikan penggunaan kembali karakter kutipan untuk string dalam ekspresi reguler agar lebih mudah dibaca.

Operator

Anda dapat menggunakan operator berikut di YARA-L:

Operator Deskripsi
= equal/declaration
!= tidak sama dengan
< kurang dari
<= kurang dari atau sama dengan
> lebih dari
>= lebih besar dari atau sama dengan

Variabel

Di YARA-L 2.0, semua variabel direpresentasikan sebagai $<variable name>.

Anda dapat menentukan jenis variabel berikut:

  • Variabel peristiwa — Merepresentasikan grup peristiwa dalam bentuk yang dinormalisasi (UDM) atau peristiwa entitas. Tentukan kondisi untuk variabel peristiwa di bagian events. Anda mengidentifikasi variabel peristiwa menggunakan nama, sumber peristiwa, dan kolom peristiwa. Sumber yang diizinkan adalah udm (untuk peristiwa yang dinormalisasi) dan graph (untuk peristiwa entitas). Jika sumber tidak disertakan, udm ditetapkan sebagai sumber default. Kolom peristiwa direpresentasikan sebagai rangkaian .<field name> (misalnya, $e.field1.field2). Rantai kolom peristiwa selalu dimulai dari sumber tingkat teratas (UDM atau Entitas).

  • Variabel kecocokan — Deklarasikan di bagian match. Variabel kecocokan menjadi kolom pengelompokan untuk kueri, karena satu baris ditampilkan untuk setiap set unik variabel kecocokan (dan untuk setiap jangka waktu). Jika aturan menemukan kecocokan, nilai variabel kecocokan akan ditampilkan. Tentukan apa yang diwakili oleh setiap variabel kecocokan di bagian events.

  • Variabel placeholder — Deklarasikan dan tentukan di bagian events. Variabel placeholder mirip dengan variabel kecocokan. Namun, Anda dapat menggunakan variabel placeholder di bagian condition untuk menentukan kondisi kecocokan.

Gunakan variabel kecocokan dan variabel placeholder untuk menyatakan hubungan antara kolom peristiwa melalui kondisi gabungan transitif (lihat Sintaksis Bagian Peristiwa untuk mengetahui detail selengkapnya).

Kata kunci

Kata kunci di YARA-L 2.0 tidak peka huruf besar/kecil. Misalnya, and atau AND setara. Nama variabel tidak boleh bertentangan dengan kata kunci. Misalnya, $AND atau $outcome tidak valid.

Berikut adalah kata kunci untuk aturan mesin deteksi: rule, meta, match, over, events, condition, outcome, options, and, or, not, nocase, in, regex, cidr, before, after, all, any, if, max, min, sum, array, array_distinct, count, count_distinct, is, dan null.

Maps

YARA-L mendukung akses peta untuk Struct dan Label.

Struct dan Label

Beberapa kolom UDM menggunakan jenis data Struct atau Label.

Untuk menelusuri pasangan nilai kunci tertentu di Struct dan Label, gunakan sintaksis peta standar:

// A Struct field.
$e.udm.additional.fields["pod_name"] = "kube-scheduler"
// A Label field.
$e.metadata.ingestion_labels["MetadataKeyDeletion"] = "startup-script"

Akses peta selalu menampilkan string.

Kasus yang didukung

Berikut adalah kasus penggunaan kata kunci yang didukung.

Bagian Peristiwa dan Hasil
// Using a Struct field in the events section
events:
  $e.udm.additional.fields["pod_name"] = "kube-scheduler"

// Using a Label field in the outcome section
outcome:
  $value = array_distinct($e.metadata.ingestion_labels["MetadataKeyDeletion"])
Menetapkan nilai peta ke Placeholder
$placeholder = $u1.metadata.ingestion_labels["MetadataKeyDeletion"]
Menggunakan kolom peta dalam kondisi gabungan
// using a Struct field in a join condition between two udm events $u1 and $u2
$u1.metadata.event_type = $u2.udm.additional.fields["pod_name"]

Kasus yang tidak didukung

Peta tidak didukung dalam kasus berikut.

Menggabungkan kata kunci any atau all dengan peta

Misalnya, hal berikut tidak didukung:

all $e.udm.additional.fields["pod_name"] = "kube-scheduler"
Jenis nilai lainnya

Sintaks peta hanya dapat menampilkan nilai string. Dalam kasus jenis data Struct, sintaksis peta hanya dapat mengakses kunci yang nilainya berupa string. Mengakses kunci yang nilainya berupa jenis primitif lain seperti bilangan bulat, tidak dapat dilakukan.

Penanganan nilai duplikat

Akses peta selalu menampilkan satu nilai. Dalam kasus ekstrem yang tidak umum ketika akses peta dapat merujuk ke beberapa nilai, akses peta akan menampilkan nilai pertama secara deterministik.

Hal ini dapat terjadi dalam salah satu kasus berikut:

  • Label memiliki kunci duplikat.

    Struktur label merepresentasikan peta, tetapi tidak menerapkan keunikan kunci. Menurut konvensi, peta harus memiliki kunci unik, sehingga Google SecOps tidak merekomendasikan pengisian label dengan kunci duplikat.

    Teks aturan $e.metadata.ingestion_labels["dupe-key"] akan menampilkan nilai pertama yang mungkin, val1, jika dijalankan pada contoh data berikut:

    // Disrecommended usage of label with a duplicate key:
    event {
      metadata{
        ingestion_labels{
          key: "dupe-key"
          value: "val1" // This is the first possible value for "dupe-key"
        }
        ingestion_labels{
          key: "dupe-key"
          value: "val2"
        }
      }
    }
    
  • Label memiliki kolom berulang ancestor.

    Kolom berulang dapat berisi label sebagai kolom turunan. Dua entri berbeda dalam kolom berulang tingkat atas dapat berisi label yang memiliki kunci yang sama. Teks aturan $e.security_result.rule_labels["key"] akan menampilkan nilai pertama yang mungkin, val3, jika dijalankan pada contoh data berikut:

    event {
      // security_result is a repeated field.
      security_result {
        threat_name: "threat1"
        rule_labels {
          key: "key"
          value: "val3" // This is the first possible value for "key"
        }
      }
      security_result {
        threat_name: "threat2"
        rule_labels {
          key: "key"
          value: "val4"
        }
      }
    }
    

Functions

Bagian ini menjelaskan fungsi YARA-L 2.0 yang dapat Anda gunakan dalam aturan dan penelusuran mesin deteksi.

Fungsi ini dapat digunakan di bagian berikut dari aturan YARA-L:

arrays.concat

arrays.concat(string_array, string_array)

Deskripsi

Menampilkan array string baru dengan menyalin elemen dari array string asli.

Jenis data parameter

ARRAY_STRINGS, ARRAY_STRINGS

Jenis hasil yang ditampilkan

ARRAY_STRINGS

Contoh kode

Contoh 1

Contoh berikut menggabungkan dua array string yang berbeda.

arrays.concat(["test1", "test2"], ["test3"]) = ["test1", "test2", "test3"]
Contoh 2

Contoh berikut menggabungkan array dengan string kosong.

arrays.concat([""], [""]) = ["", ""]
Contoh 3

Contoh berikut menggabungkan array kosong.

arrays.concat([], []) = []

arrays.join_string

arrays.join_string(array_of_strings, optional_delimiter)

Deskripsi

Mengonversi array string menjadi satu string yang dipisahkan oleh parameter opsional. Jika tidak ada pemisah yang diberikan, string kosong akan digunakan.

Jenis data parameter

ARRAY_STRINGS, STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Berikut beberapa contoh cara menggunakan fungsi ini:

Contoh 1

Contoh ini menggabungkan array dengan elemen non-null dan pemisah.

arrays.join_string(["foo", "bar"], ",") = "foo,bar"
Contoh 2

Contoh ini menggabungkan array dengan elemen null dan pemisah.

arrays.join_string(["foo", NULL, "bar"], ",") = "foo,bar"
Contoh 3

Contoh ini menggabungkan array dengan elemen non-null dan tanpa pemisah.

arrays.join_string(["foo", "bar"]) = "foobar"

arrays.length

arrays.length(repeatedField)

Deskripsi

Menampilkan jumlah elemen kolom berulang.

Jenis data parameter

LIST

Jenis hasil yang ditampilkan

NUMBER

Contoh kode

Contoh 1

Menampilkan jumlah elemen kolom berulang.

arrays.length($e.principal.ip) = 2
Contoh 2

Jika ada beberapa kolom berulang di sepanjang jalur, fungsi ini akan menampilkan total jumlah elemen kolom berulang.

arrays.length($e.intermediary.ip) = 3

arrays.max

arrays.max(array_of_ints_or_floats)

Deskripsi

Menampilkan elemen terbesar dalam array atau nol jika array kosong.

Jenis data parameter

ARRAY_INTS|ARRAY_FLOATS

Jenis hasil yang ditampilkan

FLOAT

Contoh kode

Berikut beberapa contoh cara menggunakan fungsi ini:

Contoh 1

Contoh ini menampilkan elemen yang lebih besar dalam array bilangan bulat.

arrays.max([10, 20]) = 20.000000
Contoh 2

Contoh ini menampilkan elemen yang lebih besar dalam array float.

arrays.max([10.000000, 20.000000]) = 20.000000

arrays.min

arrays.min(array_of_ints_or_floats[, ignore_zeros=false])

Deskripsi

Menampilkan elemen terkecil dalam array atau nol jika array kosong. Jika argumen kedua opsional ditetapkan ke benar (true), elemen yang sama dengan nol akan diabaikan.

Jenis data parameter

ARRAY_INTS|ARRAY_FLOATS, BOOL

Jenis hasil yang ditampilkan

FLOAT

Contoh kode

Berikut beberapa contoh cara menggunakan fungsi ini:

Contoh 1

Contoh ini menampilkan elemen terkecil dalam array bilangan bulat.

arrays.min([10, 20]) = 10.000000
Contoh 2

Contoh ini menampilkan elemen terkecil dalam array float.

arrays.min([10.000000, 20.000000]) = 10.000000
Contoh 3

Contoh ini menampilkan elemen terkecil dalam array float, sambil mengabaikan nol.

arrays.min([10.000000, 20.000000, 0.0], true) = 10.000000

arrays.size

arrays.size( array )

Deskripsi

Menampilkan ukuran array. Menampilkan 0 untuk array kosong.

Jenis data parameter

ARRAY_STRINGS|ARRAY_INTS|ARRAY_FLOATS

Jenis hasil yang ditampilkan

INT

Contoh kode

Contoh 1

Contoh ini menggunakan array string yang berisi dua elemen.

arrays.size(["test1", "test2"]) = 2
Contoh 2

Contoh ini menggunakan array int yang berisi 3 elemen.

arrays.size([1, 2, 3]) = 3
Contoh 3

Contoh ini menggunakan array float yang berisi 1 elemen

arrays.size([1.200000]) = 1
Contoh 4

Contoh ini menggunakan array kosong.

arrays.size([]) = 0

arrays.index_to_float

arrays.index_to_float(array, index)

Deskripsi

Menampilkan elemen pada indeks array yang ditentukan. Elemen pada indeks tersebut ditampilkan sebagai float.

Indeks adalah nilai bilangan bulat yang mewakili posisi elemen dalam array. Secara default, elemen pertama array memiliki indeks 0, dan elemen terakhir memiliki indeks n-1, dengan n adalah ukuran array. Pengindeksan negatif memungkinkan akses ke elemen array relatif terhadap akhir array. Misalnya, indeks -1 merujuk ke elemen terakhir dalam array dan indeks -2 merujuk ke elemen kedua dari terakhir dalam array.

Jenis data parameter

ARRAY_STRINGS|ARRAY_INTS|ARRAY_FLOATS, INT

Jenis hasil yang ditampilkan

FLOAT

Contoh kode

Contoh 1

Contoh berikut mengambil elemen pada indeks 1 dari array float.

arrays.index_to_float([1.2, 2.1, 3.5, 4.6], 1) // 2.1
Contoh 2

Contoh berikut mengambil elemen pada indeks -1 dari array float.

arrays.index_to_float([1.2, 2.1, 3.5, 4.6], 0-1) // 4.6
Contoh 3

Contoh berikut mengambil elemen untuk indeks yang lebih besar dari ukuran array.

arrays.index_to_float([1.2, 2.1, 3.5, 4.6], 6) // 0.0
Contoh 4

Contoh berikut mengambil elemen dari array kosong.

arrays.index_to_float([], 0) // 0.0
Contoh 5

Contoh berikut mengambil elemen pada indeks 1 dari array string.

arrays.index_to_float(["1.2", "3.3", "2.4"], 1) // 3.3
Contoh 6

Contoh berikut mengambil elemen pada indeks 2 dari array bilangan bulat.

arrays.index_to_float([1, 3, 2], 2) // 2.0

arrays.index_to_int

arrays.index_to_int(array_of_inputs, index)

Deskripsi

Menampilkan nilai pada indeks tertentu dalam array sebagai bilangan bulat.

Indeks adalah nilai bilangan bulat yang mewakili posisi elemen dalam array. Secara default, elemen pertama array memiliki indeks 0, dan elemen terakhir memiliki indeks n-1, dengan n adalah ukuran array. Pengindeksan negatif memungkinkan akses ke elemen array relatif terhadap akhir array. Misalnya, indeks -1 merujuk ke elemen terakhir dalam array dan indeks -2 merujuk ke elemen kedua dari terakhir dalam array.

Jenis data parameter

ARRAY_STRINGS|ARRAY_INTS|ARRAY_FLOATS, INT

Jenis hasil yang ditampilkan

INT

Contoh kode

Contoh 1

Panggilan fungsi ini menampilkan 0 saat nilai pada indeks adalah string non-numerik.

arrays.index_to_int(["str0", "str1", "str2"], 1) = 0
Contoh 2

Fungsi ini menampilkan elemen pada indeks -1.

arrays.index_to_int(["44", "11", "22", "33"], 0-1) = 33
Contoh 3

Menampilkan 0 untuk elemen di luar batas.

arrays.index_to_int(["44", "11", "22", "33"], 5) = 0
Contoh 4

Fungsi ini mengambil elemen dari array float pada indeks 1.

arrays.index_to_int([1.100000, 1.200000, 1.300000], 1) = 1
Contoh 5

Fungsi ini mengambil elemen dari array int pada indeks 0.

arrays.index_to_int([1, 2, 3], 0) = 1

arrays.index_to_str

arrays.index_to_str(array, index)

Deskripsi

Menampilkan elemen pada indeks tertentu dari array sebagai string. Indeks adalah nilai bilangan bulat yang mewakili posisi elemen dalam array. Secara default, elemen pertama array memiliki indeks 0, dan elemen terakhir memiliki indeks n-1, dengan n adalah ukuran array. Pengindeksan negatif memungkinkan akses ke elemen array dari akhir array. Misalnya, indeks -1 merujuk ke elemen terakhir dalam array dan indeks -2 merujuk ke elemen kedua dari terakhir dalam array.

Jenis data parameter

ARRAY_STRINGS|ARRAY_INTS|ARRAY_FLOATS, INT

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Contoh berikut mengambil elemen pada indeks 1 dari array string.

arrays.index_to_str(["test1", "test2", "test3", "test4"], 1) // "test2"
Contoh 2

Contoh berikut mengambil elemen pada indeks -1 (elemen terakhir array) dari array string.

arrays.index_to_str(["test1", "test2", "test3", "test4"], 0-1) // "test4"
Contoh 3

Contoh berikut mengambil elemen untuk indeks yang lebih besar dari ukuran array, yang menampilkan string kosong.

arrays.index_to_str(["test1", "test2", "test3", "test4"], 6) // ""
Contoh 4

Contoh berikut mengambil elemen dari array kosong.

arrays.index_to_str([], 0) // ""
Contoh 5

Contoh berikut mengambil elemen pada indeks 0 dari array float. Output ditampilkan sebagai string.

arrays.index_to_str([1.200000, 3.300000, 2.400000], 0) // "1.2"
Contoh 6

Contoh berikut mengambil elemen pada indeks 2 dari array bilangan bulat. Outputnya dalam bentuk string.

arrays.index_to_str([1, 3, 2], 2) // "2"

cast.as_bool

cast.as_bool(string_or_int)

Deskripsi

Fungsi mengonversi nilai int atau string menjadi nilai bool. Panggilan fungsi dengan nilai yang tidak dapat di-cast akan menampilkan FALSE. Menampilkan TRUE hanya untuk bilangan bulat 1 dan string 'true' yang tidak peka huruf besar/kecil.

Jenis data parameter

INT|STRING

Jenis hasil yang ditampilkan

BOOL

Contoh kode

Contoh 1

Contoh ini menunjukkan cara melakukan transmisi string non-boolean

cast.as_bool("123") = false
Contoh 2

Bilangan bulat benar (1)

cast.as_bool(1) = true
Contoh 3

String benar

cast.as_bool("true") = true
Contoh 4

String benar huruf kapital

cast.as_bool("TRUE") = true
Contoh 5

Bilangan bulat negatif

cast.as_bool(0-1) = false
Contoh 6

Integer salah (0)

cast.as_bool(0) = false
Contoh 7

string kosong

cast.as_bool("") = false

cast.as_float

cast.as_float(string_to_cast)

Deskripsi

Mengonversi string numerik menjadi float. Setiap panggilan fungsi dengan nilai yang tidak dapat di-casting akan menampilkan 0. Float mempertahankan presisi hingga 7 digit desimal.

Jenis data parameter

STRING

Jenis hasil yang ditampilkan

FLOAT

Contoh kode

Contoh 1

Mentransmisikan string non-numerik akan menampilkan 0.

cast.as_float("str") = 0.0000000
Contoh 2

Mentransmisikan string kosong akan menampilkan 0.

cast.as_float("") = 0.0000000
Contoh 3

Mentransmisikan string numerik yang valid akan menampilkan nilai float.

cast.as_float("1.012345678") = 1.0123456

cast.as_string

cast.as_string(int_or_bytes_or_bool, optional_default_string)

Deskripsi

Fungsi cast.as_string mengubah nilai INT, BYTES, atau BOOL menjadi representasi stringnya. Anda dapat memberikan argumen default_string opsional untuk menangani kasus saat transmisi gagal. Jika Anda menghilangkan argumen default_string, atau jika input adalah urutan byte UTF-8 atau BASE64 yang tidak valid, fungsi akan menampilkan string kosong.

Jenis data parameter

INT|BYTES|BOOL, STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Konversi Integer ke String

Fungsi ini mengonversi bilangan bulat 123 menjadi string "123".

cast.as_string(123) = "123"
Konversi Float ke String

Fungsi ini mengonversi float 2.25 menjadi string "2.25".

cast.as_string(2.25) = "2.25"
Konversi Byte ke String

Fungsi ini mengonversi b'01 biner mentah menjadi string "\x01".

cast.as_string(b'01, "") = "\x01"
Konversi Boolean ke String

Fungsi ini mengonversi boolean true menjadi string "true".

cast.as_string(true, "") = "true"
Konversi Gagal (Default ke String yang Diberikan Secara Opsional)

Fungsi ini secara default menggunakan string "casting error" jika nilai yang diberikan tidak valid.

cast.as_string(9223372036854775808, "casting error") = "casting error"

sidik jari

Didukung di:
hash.fingerprint2011(byteOrString)

Deskripsi

Fungsi ini menghitung hash fingerprint2011 dari urutan byte atau string input. Fungsi ini menampilkan nilai INT yang tidak bertanda dalam rentang [2, 0xFFFFFFFFFFFFFFFF].

Jenis data parameter

BTYE, STRING

Jenis hasil yang ditampilkan

INT

Contoh kode

id_fingerprint = hash.fingerprint2011("user123")

grup

Didukung di:
group(field1, field2, field3, ...)

Deskripsi

Kelompokkan kolom dengan jenis yang serupa ke dalam variabel placeholder.

Dalam penelusuran UDM, kolom yang dikelompokkan digunakan untuk menelusuri beberapa kolom dengan jenis yang serupa. Fungsi grup mirip dengan kolom yang dikelompokkan, tetapi memungkinkan Anda memilih kolom yang ingin dikelompokkan untuk memicu deteksi. Anda dapat menggunakan fungsi grup untuk mengumpulkan informasi tentang entitas tertentu (misalnya, nama host, alamat IP, atau ID pengguna) di berbagai Jenis kata benda.

Contoh kode

Contoh 1

Kelompokkan semua alamat IP dan berikan jumlah alamat IP yang paling umum dalam rentang waktu yang dipindai secara menurun.

$ip = group(principal.ip, about.ip, target.ip)
$ip != ""
match:
  $ip
outcome:
  $count = count_distinct(metadata.id)
order:
  $count desc

hash.sha256

Didukung di:
hash.sha256(string)

Deskripsi

Menampilkan hash SHA-256 dari string input.

Jenis data parameter

STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Contoh ini menunjukkan hash SHA-256 saat input berupa string yang valid.

hash.sha256("str") = "8c25cb3686462e9a86d2883c5688a22fe738b0bbc85f458d2d2b5f3f667c6d5a"
Contoh 2

Contoh ini menunjukkan hash SHA-256 saat input berupa string kosong.

hash.sha256("") = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"

math.abs

math.abs(numericExpression)

Deskripsi

Menampilkan nilai absolut dari ekspresi bilangan bulat atau float.

Jenis data parameter

NUMBER

Jenis hasil yang ditampilkan

NUMBER

Contoh kode

Contoh 1

Contoh ini menampilkan True jika peristiwa terjadi lebih dari 5 menit dari waktu yang ditentukan (dalam detik dari epoch Unix), terlepas dari apakah peristiwa terjadi sebelum atau setelah waktu yang ditentukan. Panggilan ke math.abs tidak dapat bergantung pada beberapa variabel atau placeholder. Misalnya, Anda tidak dapat mengganti nilai waktu yang di-hardcode 1643687343 dalam contoh berikut dengan $e2.metadata.event_timestamp.seconds.

300 < math.abs($e1.metadata.event_timestamp.seconds - 1643687343)

math.ceil

math.ceil(number)

Deskripsi

Menampilkan bilangan bulat terkecil yang tidak lebih kecil dari bilangan yang diberikan (membulatkan ke atas). Akan menampilkan 0 jika inputnya null atau terlalu besar untuk dimuat dalam int64.

Jenis data parameter

FLOAT

Jenis hasil yang ditampilkan

INT

Contoh kode

Bagian ini berisi contoh penggunaan math.ceil.

Contoh 1

Contoh ini menampilkan ceil bilangan bulat.

math.ceil(2.000000) = 2
Contoh 2

Contoh ini menampilkan ceil angka negatif.

math.ceil(0-1.200000) = -1
Contoh 3

Contoh ini menampilkan 0 sebagai ceil dari angka yang terlalu besar untuk bilangan bulat 64 bit.

math.ceil(184467440737095516160.0) = 0

math.floor

math.floor(float_val)

Deskripsi

Menampilkan nilai bilangan bulat terbesar yang tidak lebih besar dari nilai yang diberikan (membulatkan ke bawah). Menampilkan 0 jika input adalah null atau terlalu besar untuk dimuat dalam int64.

Jenis data parameter

FLOAT

Jenis hasil yang ditampilkan

INT

Contoh kode

Contoh 1

Contoh ini menunjukkan kasus bilangan positif.

math.floor(1.234568) = 1
Contoh 2

Contoh ini menunjukkan kasus angka negatif.

math.floor(0-1.234568) = -2
Contoh 3

Contoh ini menunjukkan kasus nol.

math.floor(0.000000) = 0

math.geo_distance

Didukung di:
math.geo_distance(longitude1, latitude1, longitude2, latitude2))

Deskripsi

Menampilkan jarak antara dua lokasi geografis (koordinat) dalam meter. Menampilkan -1 jika koordinat tidak valid.

Jenis data parameter

FLOAT, FLOAT, FLOAT, FLOAT

Jenis hasil yang ditampilkan

FLOAT

Contoh kode

Contoh 1

Contoh berikut menampilkan jarak saat semua parameter adalah koordinat yang valid:

math.geo_distance(-122.020287, 37.407574, -122.021810, 37.407574) = 134.564318
Contoh 2

Contoh berikut menampilkan jarak saat salah satu parameter adalah koordinat yang dipangkas:

math.geo_distance(-122.000000, 37.407574, -122.021810, 37.407574) = 1926.421905
Contoh 3

Contoh berikut menampilkan -1 jika salah satu parameter adalah koordinat yang tidak valid:

math.geo_distance(0-122.897680, 37.407574, 0-122.021810, 97.407574) = -1.000000
Contoh 4

Contoh berikut menampilkan 0 jika koordinatnya sama:

math.geo_distance(-122.897680, 37.407574, -122.897680, 37.407574) = 0.000000

math.is_increasing

math.is_increasing(num1, num2, num3)

Deskripsi

Mengambil daftar nilai numerik (bilangan bulat atau ganda) dan menampilkan True jika nilai dalam urutan menaik, dan False jika sebaliknya.

Jenis data parameter

INT|FLOAT, INT|FLOAT, INT|FLOAT

Jenis hasil yang ditampilkan

BOOL

Contoh kode

Contoh 1

Contoh ini mencakup nilai seperti stempel waktu dalam detik.

math.is_increasing(1716769112, 1716769113, 1716769114) = true
Contoh 2

Contoh ini mencakup satu nilai ganda negatif, satu nilai INT64 nol, dan satu nilai INT64 positif.

math.is_increasing(-1.200000, 0, 3) = true
Contoh 3

Contoh ini mencakup satu nilai ganda negatif, satu nilai INT64 nol, dan satu nilai INT64 negatif.

math.is_increasing(0-1.200000, 0, 0-3) = false
Contoh 4

Contoh ini mencakup dua nilai ganda negatif dan satu nilai INT64 nol.

math.is_increasing(0-1.200000, 0-1.50000, 0) = false
Contoh 5

Contoh ini mencakup satu nilai ganda negatif dan dua nilai yang sama.

math.is_increasing(0-1.200000, 0, 0) = false

math.log

math.log(numericExpression)

Deskripsi

Menampilkan nilai log natural dari ekspresi bilangan bulat atau float.

Jenis data parameter

NUMBER

Jenis hasil yang ditampilkan

NUMBER

Contoh kode

Contoh 1
math.log($e1.network.sent_bytes) > 20

math.pow

math.pow(base, exponent)

Deskripsi

Menampilkan nilai argumen pertama yang dipangkatkan dengan argumen kedua. Menampilkan 0 jika terjadi overflow.

Jenis data parameter

basis: INT|FLOAT eksponen: INT|FLOAT

Jenis hasil yang ditampilkan

FLOAT

Contoh kode

Contoh 1

Contoh ini menunjukkan kasus bilangan bulat.

math.pow(2, 2) // 4.00
Contoh 2

Contoh ini menunjukkan kasus dasar pecahan.

math.pow(2.200000, 3) // 10.648
Contoh 3

Contoh ini menunjukkan kasus dasar dan pangkat pecahan.

math.pow(2.200000, 1.200000) // 2.575771
Contoh 4

Contoh ini menunjukkan kasus pangkat negatif.

math.pow(3, 0-3) // 0.037037
Contoh 5

Contoh ini menunjukkan kasus pangkat pecahan.

math.pow(3, 0-1.200000) // 0.267581
Contoh 6

Contoh ini menunjukkan kasus dasar negatif.

math.pow(0-3, 0-3) // -0.037037
Contoh 7

Contoh ini menunjukkan kasus dasar nol.

math.pow(0, 3) // 0
Contoh 8

Contoh ini menunjukkan kasus daya nol.

math.pow(9223372036854775807, 0) // 1
Contoh 9

Contoh ini menunjukkan kasus dasar yang besar.

math.pow(9223372036854775807, 1.200000) // 57262152889751593549824

math.random

math.random()

Deskripsi

Menghasilkan nilai pseudo-acak berjenis DOUBLE dalam rentang [0, 1), inklusif 0 dan eksklusif 1.

Jenis hasil yang ditampilkan

FLOAT

Contoh kode

Contoh berikut memeriksa apakah nilai acak berada dalam rentang [0, 1). none if(math.random() >= 0 and math.random() < 1) = true

math.round

Didukung di:
math.round(numericExpression, decimalPlaces)

Deskripsi

Menampilkan nilai yang dibulatkan ke bilangan bulat terdekat atau ke jumlah tempat desimal yang ditentukan.

Jenis data parameter

NUMBER

Jenis hasil yang ditampilkan

NUMBER

Contoh kode

math.round(10.7) // returns 11
math.round(1.2567, 2) // returns 1.25
math.round(0-10.7) // returns -11
math.round(0-1.2) // returns -1
math.round(4) // returns 4, math.round(integer) returns the integer

math.sqrt

math.sqrt(number)

Deskripsi

Menampilkan akar kuadrat dari bilangan yang diberikan. Menampilkan 0 jika angka negatif.

Jenis data parameter

INT|FLOAT

Jenis hasil yang ditampilkan

FLOAT

Contoh kode

Contoh 1

Contoh ini menampilkan akar kuadrat argumen int.

math.sqrt(3) = 1.732051
Contoh 2

Contoh ini menampilkan akar kuadrat argumen int negatif.

math.sqrt(-3) = 0.000000
Contoh 3

Contoh ini menampilkan akar kuadrat dari argumen nol.

math.sqrt(0) = 0.000000
Contoh 4

Contoh ini menampilkan akar kuadrat dari argumen float.

math.sqrt(9.223372) = 3.037000
Contoh 5

Contoh ini menampilkan akar kuadrat argumen float negatif.

math.sqrt(0-1.200000) = 0.000000

metrik

Didukung di:

Fungsi metrik dapat menggabungkan data historis dalam jumlah besar. Anda dapat menggunakan ini dalam aturan menggunakan metrics.functionName() di bagian hasil.

Untuk mengetahui informasi selengkapnya, lihat Metrik YARA-L.

net.ip_in_range_cidr

net.ip_in_range_cidr(ipAddress, subnetworkRange)

Deskripsi

Menampilkan true jika alamat IP yang diberikan berada dalam subnetwork yang ditentukan.

Anda dapat menggunakan YARA-L untuk menelusuri peristiwa UDM di semua alamat IP dalam subnetwork menggunakan pernyataan net.ip_in_range_cidr(). IPv4 dan IPv6 didukung.

Untuk menelusuri di seluruh rentang alamat IP, tentukan kolom UDM IP dan rentang CIDR. YARA-L dapat menangani kolom alamat IP tunggal dan berulang.

Untuk menelusuri di seluruh rentang alamat IP, tentukan kolom UDM ip dan rentang Classless Inter-Domain Routing (CIDR). YARA-L dapat menangani kolom alamat IP tunggal dan berulang.

Jenis data parameter

STRING, STRING

Jenis hasil yang ditampilkan

BOOL

Contoh kode

Contoh 1

Contoh IPv4:

net.ip_in_range_cidr($e.principal.ip, "192.0.2.0/24")
Contoh 2

Contoh IPv6:

net.ip_in_range_cidr($e.network.dhcp.yiaddr, "2001:db8::/32")

Untuk contoh aturan yang menggunakan pernyataan net.ip_in_range_cidr(), lihat contoh aturan di Satu Peristiwa dalam Rentang Alamat IP.)

re.regex

Anda dapat menentukan pencocokan ekspresi reguler di YARA-L 2.0 menggunakan salah satu sintaks berikut:

  • Menggunakan sintaksis YARA-L — Terkait dengan peristiwa. Berikut adalah representasi generik dari sintaksis ini:

    $e.field = /regex/
    
  • Menggunakan sintaksis YARA-L — Sebagai fungsi yang menggunakan parameter berikut:

    • Kolom tempat ekspresi reguler diterapkan.
    • Regular expression yang ditentukan sebagai string.

    Berikut adalah representasi generik dari sintaksis ini:

    re.regex($e.field, `regex`)
    

Deskripsi

Fungsi ini menampilkan true jika string berisi substring yang cocok dengan ekspresi reguler yang diberikan. Anda tidak perlu menambahkan .* di awal atau di akhir ekspresi reguler.

Catatan
  • Untuk mencocokkan string yang tepat atau hanya awalan atau akhiran, sertakan karakter anchor ^ (awal) dan $ (akhir) dalam ekspresi reguler. Misalnya, /^full$/ cocok dengan "full" secara persis, sedangkan /full/ dapat cocok dengan "fullest", "lawfull", dan "joyfully".
  • Jika kolom UDM menyertakan karakter baris baru, regexp hanya cocok dengan baris pertama kolom UDM. Untuk menerapkan pencocokan kolom UDM penuh, tambahkan (?s) ke ekspresi reguler. Misalnya, ganti /.*allUDM.*/ dengan /(?s).*allUDM.*/.
  • Anda dapat menggunakan pengubah nocase setelah string untuk menunjukkan bahwa penelusuran harus mengabaikan kapitalisasi.

Jenis data parameter

STRING, STRING

Jenis ekspresi parameter

ANY, ANY

Jenis hasil yang ditampilkan

BOOL

Contoh kode

Contoh 1
// Equivalent to $e.principal.hostname = /google/
re.regex($e.principal.hostname, "google")

re.capture

re.capture(stringText, regex)

Deskripsi

Mengambil (mengekstraksi) data dari string menggunakan pola ekspresi reguler yang diberikan dalam argumen.

Fungsi ini menggunakan dua argumen:

  • stringText: string asli yang akan dicari.
  • regex: ekspresi reguler yang menunjukkan pola yang akan dicari.

Ekspresi reguler dapat berisi 0 atau 1 grup tangkapan dalam tanda kurung. Jika ekspresi reguler berisi 0 grup tangkapan, fungsi akan menampilkan substring yang cocok secara keseluruhan pertama. Jika ekspresi reguler berisi 1 grup tangkapan, fungsi ini akan menampilkan substring pertama yang cocok untuk grup tangkapan. Menentukan dua atau lebih banyak grup pengambilan akan menampilkan error compiler.

Jenis data parameter

STRING, STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Dalam contoh ini, jika $e.principal.hostname berisi "aaa1bbaa2", pernyataan berikut akan benar, karena fungsi menampilkan instance pertama. Contoh ini tidak memiliki grup tangkapan.

"aaa1" = re.capture($e.principal.hostname, "a+[1-9]")
Contoh 2

Contoh ini mengambil semua teks setelah simbol @ dalam email. Jika kolom $e.network.email.from adalah test@google.com, contoh akan menampilkan google.com. Contoh berikut berisi satu grup tangkapan.

"google.com" = re.capture($e.network.email.from , "@(.*)")
Contoh 3

Jika ekspresi reguler tidak cocok dengan substring apa pun dalam teks, fungsi akan menampilkan string kosong. Anda dapat menghilangkan peristiwa yang tidak cocok dengan mengecualikan string kosong, yang sangat penting saat Anda menggunakan re.capture() dengan ketidaksetaraan:

// Exclude the empty string to omit events where no match occurs.
"" != re.capture($e.network.email.from , "@(.*)")

// Exclude a specific string with an inequality.
"google.com" != re.capture($e.network.email.from , "@(.*)")

re.replace

re.replace(stringText, replaceRegex, replacementText)

Deskripsi

Melakukan penggantian ekspresi reguler.

Fungsi ini menggunakan tiga argumen:

  • stringText: string asli.
  • replaceRegex: ekspresi reguler yang menunjukkan pola yang akan dicari.
  • replacementText: Teks yang akan disisipkan ke dalam setiap kecocokan.

Menampilkan string baru yang berasal dari stringText asli, dengan semua substring yang cocok dengan pola di replaceRegex diganti dengan nilai di replacementText. Anda dapat menggunakan digit yang di-escape dengan garis miring terbalik (\1 hingga \9) dalam replacementText untuk menyisipkan teks yang cocok dengan grup yang diberi tanda kurung dalam pola replaceRegex. Gunakan \0 untuk merujuk ke keseluruhan teks yang cocok.

Fungsi ini menggantikan kecocokan yang tidak tumpang-tindih dan akan memprioritaskan penggantian kemunculan pertama yang ditemukan. Misalnya, re.replace("banana", "ana", "111") menampilkan string "b111na".

Jenis data parameter

STRING, STRING, STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Contoh ini mengambil semua yang ada setelah simbol @ dalam email, mengganti com dengan org, lalu menampilkan hasilnya. Perhatikan penggunaan fungsi bertingkat.

"email@google.org" = re.replace($e.network.email.from, "com", "org")
Contoh 2

Contoh ini menggunakan digit yang di-escape dengan garis miring terbalik dalam argumen replacementText untuk merujuk kecocokan ke pola replaceRegex.

"test1.com.google" = re.replace(
                       $e.principal.hostname, // holds "test1.test2.google.com"
                       "test2\.([a-z]*)\.([a-z]*)",
                       "\\2.\\1"  // \\1 holds "google", \\2 holds "com"
                     )
Contoh 3

Perhatikan kasus berikut saat menangani string kosong dan re.replace():

Menggunakan string kosong sebagai replaceRegex:

// In the function call below, if $e.principal.hostname contains "name",
// the result is: 1n1a1m1e1, because an empty string is found next to
// every character in `stringText`.
re.replace($e.principal.hostname, "", "1")

Untuk mengganti string kosong, Anda dapat menggunakan "^$" sebagai replaceRegex:

// In the function call below, if $e.principal.hostname contains the empty
// string, "", the result is: "none".
re.replace($e.principal.hostname, "^$", "none")

sample_rate

Didukung di:
optimization.sample_rate(byteOrString, rateNumerator, rateDenominator)

Deskripsi

Fungsi ini menentukan apakah akan menyertakan peristiwa berdasarkan strategi pengambilan sampel deterministik. Fungsi ini menampilkan:

  • true untuk sebagian kecil nilai input, setara dengan (rateNumerator / rateDenominator), yang menunjukkan bahwa peristiwa harus disertakan dalam sampel.
  • false yang menunjukkan bahwa peristiwa tidak boleh disertakan dalam sampel.

Fungsi ini berguna untuk skenario pengoptimalan saat Anda hanya ingin memproses sebagian kecil peristiwa. Setara dengan:

hash.fingerprint2011(byteOrString) % rateDenominator < rateNumerator

Jenis data parameter

  • byteOrString: Ekspresi yang dievaluasi ke BYTE atau STRING.
  • rateNumerator: 'INT'
  • rateDenominator: 'INT'

Jenis hasil yang ditampilkan

BOOL

Contoh kode

events:
    $e.metadata.event_type = "NETWORK_CONNECTION"
    $asset_id = $e.principal.asset.asset_id
    optimization.sample_rate($e.metadata.id, 1, 5) // Only 1 out of every 5 events

  match:
    $asset_id over 1h

  outcome:
    $event_count = count_distinct($e.metadata.id)
  // estimate the usage by multiplying by the inverse of the sample rate
    $usage_past_hour = sum(5.0 * $e.network.sent_bytes)

 condition:
  // Requiring a certain number of events after sampling avoids bias (e.g. a
  // device with just 1 connection will still show up 20% of the time and
  // if we multiply that traffic by 5, we'll get an incorrect estimate)
  $e and ($usage_past_hour > 1000000000) and $event_count >= 100

strings.base64_decode

strings.base64_decode(encodedString)

Deskripsi

Menampilkan string yang berisi versi string berenkode yang didekode base64.

Fungsi ini menggunakan satu string berenkode base64 sebagai argumen. Jika encodedString bukan string berenkode base64 yang valid, fungsi akan menampilkan encodedString tanpa perubahan.

Jenis data parameter

STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1
"test" = strings.base64_decode($e.principal.domain.name)

strings.coalesce

strings.coalesce(a, b, c, ...)

Deskripsi

Fungsi ini menggunakan argumen dalam jumlah tak terbatas dan menampilkan nilai ekspresi pertama yang tidak dievaluasi ke string kosong (misalnya, "nilai bukan nol"). Jika semua argumen bernilai string kosong, panggilan fungsi akan menampilkan string kosong.

Argumen dapat berupa literal, kolom peristiwa, atau panggilan fungsi. Semua argumen harus berjenis STRING. Jika ada argumen yang merupakan kolom peristiwa, atribut harus berasal dari peristiwa yang sama.

Jenis data parameter

STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Contoh berikut menyertakan variabel string sebagai argumen. Kondisi dievaluasi sebagai benar jika (1) $e.network.email.from adalah suspicious@gmail.com atau (2) $e.network.email.from kosong dan $e.network.email.to adalah suspicious@gmail.com.

"suspicious@gmail.com" = strings.coalesce($e.network.email.from, $e.network.email.to)
Contoh 2

Contoh berikut memanggil fungsi coalesce dengan lebih dari dua argumen. Kondisi ini membandingkan alamat IP non-null pertama dari peristiwa $e dengan nilai dalam daftar referensi ip_watchlist. Urutan penggabungan argumen dalam panggilan ini sama dengan urutan argumen tersebut didaftarkan dalam kondisi aturan:

  1. $e.principal.ip dievaluasi terlebih dahulu.
  2. $e.src.ip dievaluasi berikutnya.
  3. $e.target.ip dievaluasi berikutnya.
  4. Terakhir, string "No IP" ditampilkan sebagai nilai default jika kolom ip sebelumnya tidak disetel.
strings.coalesce($e.principal.ip, $e.src.ip, $e.target.ip, "No IP") in %ip_watchlist
Contoh 3

Contoh berikut mencoba menggabungkan principal.hostname dari peristiwa $e1 dan peristiwa $e2. Tindakan ini akan menampilkan error compiler karena argumennya adalah variabel peristiwa yang berbeda.

// returns a compiler error
"test" = strings.coalesce($e1.principal.hostname, $e2.principal.hostname)

strings.concat

strings.concat(a, b, c, ...)

Deskripsi

Menampilkan gabungan dari sejumlah item yang tidak terbatas, yang masing-masing dapat berupa string, bilangan bulat, atau float.

Jika ada argumen yang merupakan kolom peristiwa, atribut harus berasal dari peristiwa yang sama.

Jenis data parameter

STRING, FLOAT, INT

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Contoh berikut menyertakan variabel string dan variabel bilangan bulat sebagai argumen. principal.hostname dan principal.port berasal dari peristiwa yang sama, $e, dan digabungkan untuk menampilkan string.

"google:80" = strings.concat($e.principal.hostname, ":", $e.principal.port)
Contoh 2

Contoh berikut menyertakan variabel string dan literal string sebagai argumen.

"google-test" = strings.concat($e.principal.hostname, "-test") // Matches the event when $e.principal.hostname = "google"
Contoh 3

Contoh berikut menyertakan variabel string dan literal float sebagai argumen. Jika direpresentasikan sebagai string, float yang merupakan bilangan bulat diformat tanpa titik desimal (misalnya, 1.0 direpresentasikan sebagai "1"). Selain itu, float yang melebihi enam belas digit desimal akan dipangkas menjadi enam belas tempat desimal.

"google2.5" = strings.concat($e.principal.hostname, 2.5)
Contoh 4

Contoh berikut menyertakan variabel string, literal string, variabel bilangan bulat, dan literal float sebagai argumen. Semua variabel berasal dari peristiwa yang sama, $e, dan digabungkan dengan literal untuk menampilkan string.

"google-test802.5" = strings.concat($e.principal.hostname, "-test", $e.principal.port, 2.5)
Contoh 5

Contoh berikut mencoba menggabungkan principal.port dari peristiwa $e1, dengan principal.hostname dari peristiwa $e2. Hal ini akan menampilkan error compiler karena argumennya adalah variabel peristiwa yang berbeda.

// Will not compile
"test" = strings.concat($e1.principal.port, $e2.principal.hostname)

strings.contains

strings.contains( str, substr )

Deskripsi

Menampilkan nilai benar jika string tertentu berisi substring yang ditentukan. Jika tidak, nilai salah (false) akan ditampilkan.

Jenis data parameter

STRING, STRING

Jenis hasil yang ditampilkan

BOOL

Contoh kode

Contoh 1

Contoh ini menampilkan nilai benar karena string memiliki substring "is".

strings.contains("thisisastring", "is") = true
Contoh 2

Contoh ini menampilkan nilai salah (false) karena string tidak memiliki substring "that".

strings.contains("thisisastring", "that") = false

strings.count_substrings

strings.count_substrings(string_to_search_in, substring_to_count)

Deskripsi

Jika diberi string dan substring, akan menampilkan int64 dari jumlah kemunculan substring yang tidak tumpang-tindih dalam string.

Jenis data parameter

STRING, STRING

Jenis hasil yang ditampilkan

INT

Contoh kode

Bagian ini berisi contoh yang menghitung berapa kali substring muncul dalam string tertentu.

Contoh 1

Contoh ini menggunakan string non-null dan karakter substring tunggal non-null.

strings.count_substrings("this`string`has`four`backticks", "`") = 4
Contoh 2

Contoh ini menggunakan string non-null dan substring non-null yang lebih dari satu karakter.

strings.count_substrings("str", "str") = 1
Contoh 3

Contoh ini menggunakan string non-null dan substring kosong.

strings.count_substrings("str", "") = 0
Contoh 4

Contoh ini menggunakan string kosong dan substring non-null yang lebih dari satu karakter.

strings.count_substrings("", "str") = 0
Contoh 5

Contoh ini menggunakan string kosong dan substring kosong.

strings.count_substrings("", "") = 0
Contoh 6

Contoh ini menggunakan string non-null dan substring non-null yang lebih dari satu karakter dan lebih dari satu kemunculan.

strings.count_substrings("fooABAbarABAbazABA", "AB") = 3
Contoh 7

Contoh ini menggunakan string non-null dan substring non-null yang lebih dari satu karakter dan lebih dari satu kemunculan. Hal ini menyoroti batasan dengan kemunculan substring yang tumpang-tindih

strings.count_substrings("ABABABA", "ABA") = 2

strings.extract_domain

strings.extract_domain(url_string)

Deskripsi

Mengekstrak domain dari string.

Jenis data parameter

STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Contoh ini menunjukkan string kosong

strings.extract_domain("") = ""
Contoh 2

string acak, bukan URL

strings.extract_domain("1234") = ""
Contoh 3

beberapa garis miring terbalik

strings.extract_domain("\\\\") = ""
Contoh 4

karakter non-alfabet ditangani dengan baik

strings.extract_domain("http://例子.卷筒纸.中国") = "卷筒纸.中国"
Contoh 5

menangani URI

strings.extract_domain("mailto:?to=&subject=&body=") = ""
Contoh 6

beberapa karakter sebelum URL sebenarnya

strings.extract_domain("     \t   !$5*^)&dahgsdfs;http://www.google.com") = "google.com"
Contoh 7

karakter khusus dalam URI #

strings.extract_domain("test#@google.com") = ""
Contoh 8

karakter khusus dalam URL #

strings.extract_domain("https://test#@google.com") = ""
Contoh 9

kasus pengujian positif

strings.extract_domain("https://google.co.in") = "google.co.in"

strings.extract_hostname

strings.extract_hostname(string)

Deskripsi

Mengekstrak nama host dari string. Fungsi ini peka huruf besar/kecil.

Jenis data parameter

STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Contoh ini menampilkan string kosong.

strings.extract_hostname("") = ""
Contoh 2

string acak, bukan URL

strings.extract_hostname("1234") = "1234"
Contoh 3

beberapa garis miring terbalik

strings.extract_hostname("\\\\") = ""
Contoh 4

karakter non-Inggris ditangani dengan baik

strings.extract_hostname("http://例子.卷筒纸.中国") = "例子.卷筒纸.中国"
Contoh 5

menangani URI

strings.extract_hostname("mailto:?to=&subject=&body=") = "mailto"
Contoh 6

beberapa karakter sebelum URL sebenarnya

strings.extract_hostname("     \t   !$5*^)&dahgsdfs;http://www.google.com") = "www.google.com"
Contoh 7

karakter khusus dalam URI #

strings.extract_hostname("test#@google.com") = "test"
Contoh 8

karakter khusus dalam URL #

strings.extract_hostname("https://test#@google.com") = "test"

strings.from_base64

strings.from_base64(base64_encoded_string)

Deskripsi

Fungsi mengonversi nilai STRING berenkode base64 menjadi nilai BYTES biner mentah. Panggilan fungsi dengan nilai yang tidak dapat di-cast akan menampilkan BYTES kosong secara default.

Jenis data parameter

STRING

Jenis hasil yang ditampilkan

BYTES

Contoh kode

Konversi String Berenkode Base64 ke Byte

Fungsi ini mengonversi string berenkode base64 ke representasi byte biner mentahnya.

strings.from_base64("AAAAAG+OxVhtAm+d2sVuny/hW4oAAAAAAQAAAM0AAAA=") = b'000000006f8ec5586d026f9ddac56e9f2fe15b8a0000000001000000cd000000
Konversi Gagal (Default ke Byte Kosong)

Fungsi ini secara default akan menampilkan byte kosong jika nilai yang diberikan tidak valid.

strings.from_base64("invalid-value") = b'

strings.from_hex

strings.from_hex(hex_string)

Deskripsi

Menampilkan byte yang terkait dengan string hex yang diberikan.

Jenis data parameter

STRING

Jenis hasil yang ditampilkan

BYTES

Contoh kode

Mendapatkan byte yang terkait dengan string hex tertentu.

Contoh 1

Contoh ini menunjukkan konversi karakter non-hex.

strings.from_hex("str") // returns empty bytes
Contoh 2

Contoh ini menunjukkan input dengan string kosong.

strings.from_hex("") // returns empty bytes
Contoh 3

Contoh ini menunjukkan konversi string hex.

strings.from_hex("1234") // returns 1234 bytes
Contoh 4

Contoh ini menunjukkan konversi karakter non-ASCII.

strings.from_hex("筒纸.中国") // returns empty bytes

strings.length

strings.length(string_value)

Deskripsi

Menampilkan jumlah karakter dalam string input.

Jenis data parameter

STRING

Jenis hasil yang ditampilkan

INT

Contoh kode

Contoh 1

Berikut adalah contoh dengan pengujian string.

strings.length("str") = 3
Contoh 2

Berikut adalah contoh dengan string kosong sebagai input.

strings.length("") = 0
Contoh 3

Berikut adalah contoh dengan string karakter khusus.

strings.length("!@#$%^&*()-_") = 12
Contoh 4

Berikut adalah contoh dengan string yang memiliki spasi.

strings.length("This is a test string") = 21

strings.ltrim

strings.ltrim(string_to_trim, cutset)

Deskripsi

Memangkas ruang kosong di depan dari string tertentu. Fungsi ini menghapus karakter di awal yang ada dalam cutset tersebut.

Jenis data parameter

STRING, STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Berikut adalah contoh kasus penggunaan.

Contoh 1

Contoh ini menggunakan argumen pertama dan kedua yang sama.

strings.ltrim("str", "str") = ""
Contoh 2

Contoh ini menggunakan string kosong sebagai argumen kedua.

strings.ltrim("str", "") = "str"
Contoh 3

Contoh ini menggunakan string kosong sebagai argumen pertama, dan string sebagai argumen kedua.

strings.ltrim("", "str") = ""
Contoh 4

Contoh ini menggunakan string yang berisi spasi kosong, dan string sebagai argumen kedua.

strings.ltrim("a aastraa aa ", " a") = "straa aa "

strings.reverse

strings.reverse(STRING)

Deskripsi

Menampilkan string yang merupakan kebalikan dari string input.

Jenis data parameter

STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Contoh berikut meneruskan string pendek.

strings.reverse("str") = "rts"  // The function returns 'rts'.
Contoh 2

Contoh berikut meneruskan string kosong.

strings.reverse("") = ""
Contoh 3

Contoh berikut meneruskan palindrom.

strings.reverse("tacocat") = "tacocat"

strings.rtrim

strings.rtrim(string_to_trim, cutset)

Deskripsi

Memangkas ruang kosong di akhir dari string tertentu. Menghapus karakter di akhir yang ada dalam cutset tersebut.

Jenis data parameter

STRING, STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Berikut adalah contoh kasus penggunaan.

Contoh 1

Contoh berikut meneruskan string yang sama sebagai argumen pertama dan kedua.

strings.rtrim("str", "str") = ""
Contoh 2

Contoh berikut meneruskan string kosong sebagai argumen kedua.

strings.rtrim("str", "") = "str"
Contoh 3

Contoh berikut meneruskan string kosong sebagai argumen pertama dan string tidak kosong sebagai argumen kedua.

strings.rtrim("", "str") = ""
Contoh 4

Contoh berikut meneruskan string yang berisi spasi sebagai argumen pertama dan string yang tidak kosong sebagai argumen kedua.

strings.rtrim("a aastraa aa ", " a") = "a aasstr"

strings.to_lower

strings.to_lower(stringText)

Deskripsi

Fungsi ini mengambil string input dan menampilkan string setelah mengubah semua karakter menjadi huruf kecil

Jenis data parameter

STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Contoh berikut menampilkan true.

"test@google.com" = strings.to_lower($e.network.email.to)

strings.to_upper

strings.to_upper(string_val)

Deskripsi

Menampilkan string asli dengan semua karakter alfabet dalam huruf besar.

Jenis data parameter

STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Contoh berikut menampilkan argumen yang diberikan dalam huruf besar.

strings.to_upper("example") = "EXAMPLE"

strings.trim

strings.trim(string_to_trim, cutset)

Deskripsi

Memangkas spasi kosong di awal dan akhir dari string yang diberikan. Selain itu, hapus karakter yang tidak diinginkan (ditentukan oleh argumen cutset) dari string input.

Jenis data parameter

STRING, STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Berikut adalah contoh kasus penggunaan.

Contoh 1

Dalam contoh berikut, string yang sama diteruskan sebagai string input dan cutset, yang menghasilkan string kosong.

strings.trim("str", "str") // ""
Contoh 2

Dalam contoh berikut, string kosong diteruskan sebagai cutset, yang menghasilkan string asli str karena tidak ada karakter yang ditentukan dalam cutset untuk dihapus.

strings.trim("str", "") = "str"
Contoh 3

Dalam contoh berikut, fungsi menghasilkan string kosong karena string input sudah kosong dan tidak ada karakter yang akan dihapus.

strings.trim("", "str") = ""
Contoh 4

Dalam contoh berikut, fungsi menghasilkan str karena fungsi trim menghapus hal berikut:

  • spasi di akhir "a aastraa aa "
  • karakter yang ditentukan dalam cutset (spasi, a)
strings.trim("a aastraa aa ", " a") = "str"

strings.url_decode

strings.url_decode(url_string)

Deskripsi

Mengingat string URL, dekode karakter escape dan tangani karakter UTF-8 yang telah dienkode. Menampilkan string kosong jika decoding gagal.

Jenis data parameter

STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Contoh ini menunjukkan kasus pengujian positif.

strings.url_decode("three%20nine%20four") = "three nine four"
Contoh 2

Contoh ini menunjukkan kasus string kosong.

strings.url_decode("") // ""
Contoh 3

Contoh ini menunjukkan penanganan karakter non-alfabet.

strings.url_decode("%E4%B8%8A%E6%B5%B7%2B%E4%B8%AD%E5%9C%8B") // "上海+中國"
Contoh 4

Contoh ini menunjukkan contoh dekode URL.

strings.url_decode("http://www.google.com%3Fparam1%3D%22+1+%3E+2+%22%26param2%3D2%3B") // 'http://www.google.com?param1="+1+>+2+"&param2=2;'

timestamp.as_unix_seconds

timestamp.as_unix_seconds(timestamp [, time_zone])

Deskripsi

Fungsi ini menampilkan bilangan bulat yang merepresentasikan jumlah detik setelah epoch Unix untuk string stempel waktu yang diberikan.

  • timestamp adalah string yang merepresentasikan stempel waktu epoch yang valid. Formatnya harus %F %T.
  • time_zone bersifat opsional dan merupakan string yang merepresentasikan zona waktu. Jika dihapus, defaultnya adalah GMT. Anda dapat menentukan zona waktu menggunakan literal string. Opsinya adalah sebagai berikut:
    • Nama database TZ, misalnya America/Los_Angeles. Untuk mengetahui informasi selengkapnya, lihat daftar zona waktu database tz di Wikipedia.
    • Offset zona waktu dari UTC, dalam format(+|-)H[H][:M[M]], misalnya: "-08:00".

Berikut adalah contoh penentu time_zone yang valid, yang dapat Anda teruskan sebagai argumen kedua ke fungsi ekstraksi waktu:

"America/Los_Angeles", or "-08:00". ("PST" is not supported)
"America/New_York", or "-05:00". ("EST" is not supported)
"Europe/London"
"UTC"
"GMT"

Jenis data parameter

STRING, STRING

Jenis hasil yang ditampilkan

INT

Contoh kode

Contoh 1

Stempel waktu epoch yang valid

timestamp.as_unix_seconds("2024-02-22 10:43:00") = 1708598580
Contoh 2

Stempel waktu epoch yang valid dengan zona waktu America/New_York

timestamp.as_unix_seconds("2024-02-22 10:43:00", "America/New_York") = 1708616580

timestamp.current_seconds

timestamp.current_seconds()

Deskripsi

Menampilkan bilangan bulat yang merepresentasikan waktu saat ini dalam detik Unix. Nilai ini kira-kira sama dengan stempel waktu deteksi dan didasarkan pada waktu aturan dijalankan. Fungsi ini adalah sinonim dari fungsi timestamp.now().

Jenis data parameter

NONE

Jenis hasil yang ditampilkan

INT

Contoh kode

Contoh 1

Contoh berikut menampilkan true jika masa berlaku sertifikat telah berakhir selama lebih dari 24 jam. Fungsi ini menghitung selisih waktu dengan mengurangi detik Unix saat ini, lalu membandingkan menggunakan operator lebih besar dari.

86400 < timestamp.current_seconds() - $e.network.tls.certificate.not_after

timestamp.get_date

timestamp.get_date(unix_seconds [, time_zone])

Deskripsi

Fungsi ini menampilkan string dalam format YYYY-MM-DD, yang merepresentasikan hari saat stempel waktu berada.

  • unix_seconds adalah bilangan bulat yang merepresentasikan jumlah detik setelah epoch Unix, seperti $e.metadata.event_timestamp.seconds, atau placeholder yang berisi nilai tersebut.
  • time_zone bersifat opsional dan merupakan string yang merepresentasikan time_zone. Jika dihapus, defaultnya adalah "GMT". Anda dapat menentukan zona waktu menggunakan literal string. Opsinya adalah:
    • Nama database TZ, misalnya "America/Los_Angeles". Untuk informasi selengkapnya, lihat kolom"Nama Database TZ" dari halaman ini
    • Offset zona waktu dari UTC, dalam format(+|-)H[H][:M[M]], misalnya: "-08:00".

Berikut adalah contoh penentu time_zone yang valid, yang dapat Anda teruskan sebagai argumen kedua ke fungsi ekstraksi waktu:

"America/Los_Angeles", or "-08:00". ("PST" is not supported)
"America/New_York", or "-05:00". ("EST" is not supported)
"Europe/London"
"UTC"
"GMT"

Jenis data parameter

INT, STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Dalam contoh ini, argumen time_zone tidak ada, sehingga secara default akan menjadi "GMT".

$ts = $e.metadata.collected_timestamp.seconds

timestamp.get_date($ts) = "2024-02-19"
Contoh 2

Contoh ini menggunakan literal string untuk menentukan time_zone.

$ts = $e.metadata.collected_timestamp.seconds

timestamp.get_date($ts, "America/Los_Angeles") = "2024-02-20"

timestamp.get_minute

timestamp.get_minute(unix_seconds [, time_zone])

Deskripsi

Fungsi ini menampilkan bilangan bulat dalam rentang [0, 59] yang merepresentasikan menit.

  • unix_seconds adalah bilangan bulat yang merepresentasikan jumlah detik setelah epoch Unix, seperti $e.metadata.event_timestamp.seconds, atau placeholder yang berisi nilai tersebut.
  • time_zone bersifat opsional dan merupakan string yang merepresentasikan zona waktu. Jika dihilangkan, defaultnya adalah "GMT". Anda dapat menentukan zona waktu menggunakan literal string. Opsinya adalah:
    • Nama database TZ, misalnya "America/Los_Angeles". Untuk informasi selengkapnya, lihat kolom"Nama Database TZ" dari halaman ini
    • Offset zona waktu dari UTC, dalam format(+|-)H[H][:M[M]], misalnya: "-08:00".

Berikut adalah contoh penentu time_zone yang valid, yang dapat Anda teruskan sebagai argumen kedua ke fungsi ekstraksi waktu:

"America/Los_Angeles", or "-08:00". ("PST" is not supported)
"America/New_York", or "-05:00". ("EST" is not supported)
"Europe/London"
"UTC"
"GMT"

Jenis data parameter

INT, STRING

Jenis hasil yang ditampilkan

INT

Contoh kode

Contoh 1

Dalam contoh ini, argumen time_zone tidak ada, sehingga secara default akan menjadi "GMT".

$ts = $e.metadata.collected_timestamp.seconds

timestamp.get_hour($ts) = 15
Contoh 2

Contoh ini menggunakan literal string untuk menentukan time_zone.

$ts = $e.metadata.collected_timestamp.seconds

timestamp.get_hour($ts, "America/Los_Angeles") = 15

timestamp.get_hour

timestamp.get_hour(unix_seconds [, time_zone])

Deskripsi

Fungsi ini menampilkan bilangan bulat dalam rentang [0, 23] yang merepresentasikan jam.

  • unix_seconds adalah bilangan bulat yang merepresentasikan jumlah detik setelah epoch Unix, seperti $e.metadata.event_timestamp.seconds, atau placeholder yang berisi nilai tersebut.
  • time_zone bersifat opsional dan merupakan string yang merepresentasikan zona waktu. Jika dihapus, defaultnya adalah "GMT". Anda dapat menentukan zona waktu menggunakan literal string. Opsinya adalah:
    • Nama database TZ, misalnya "America/Los_Angeles". Untuk informasi selengkapnya, lihat kolom"Nama Database TZ" dari halaman ini
    • Offset zona waktu dari UTC, dalam format(+|-)H[H][:M[M]], misalnya: "-08:00".

Berikut adalah contoh penentu time_zone yang valid, yang dapat Anda teruskan sebagai argumen kedua ke fungsi ekstraksi waktu:

"America/Los_Angeles", or "-08:00". ("PST" is not supported)
"America/New_York", or "-05:00". ("EST" is not supported)
"Europe/London"
"UTC"
"GMT"

Jenis data parameter

INT, STRING

Jenis hasil yang ditampilkan

INT

Contoh kode

Contoh 1

Dalam contoh ini, argumen time_zone tidak ada, sehingga secara default akan menjadi "GMT".

$ts = $e.metadata.collected_timestamp.seconds

timestamp.get_hour($ts) = 15
Contoh 2

Contoh ini menggunakan literal string untuk menentukan time_zone.

$ts = $e.metadata.collected_timestamp.seconds

timestamp.get_hour($ts, "America/Los_Angeles") = 15

timestamp.get_day_of_week

timestamp.get_day_of_week(unix_seconds [, time_zone])

Deskripsi

Fungsi ini menampilkan bilangan bulat dalam rentang [1, 7] yang merepresentasikan hari dalam seminggu, dimulai dengan hari Minggu. Misalnya, 1 = Minggu dan 2 = Senin.

  • unix_seconds adalah bilangan bulat yang merepresentasikan jumlah detik setelah epoch Unix, seperti $e.metadata.event_timestamp.seconds, atau placeholder yang berisi nilai tersebut.
  • time_zone bersifat opsional dan merupakan string yang merepresentasikan time_zone. Jika dihapus, defaultnya adalah "GMT". Anda dapat menentukan zona waktu menggunakan literal string. Opsinya adalah:
    • Nama database TZ, misalnya "America/Los_Angeles". Untuk informasi selengkapnya, lihat kolom"Nama Database TZ" dari halaman ini
    • Offset zona waktu dari UTC, dalam format(+|-)H[H][:M[M]], misalnya: "-08:00".

Berikut adalah contoh penentu time_zone yang valid, yang dapat Anda teruskan sebagai argumen kedua ke fungsi ekstraksi waktu:

"America/Los_Angeles", or "-08:00". ("PST" is not supported)
"America/New_York", or "-05:00". ("EST" is not supported)
"Europe/London"
"UTC"
"GMT"

Jenis data parameter

INT, STRING

Jenis hasil yang ditampilkan

INT

Contoh kode

Contoh 1

Dalam contoh ini, argumen time_zone tidak ada, sehingga secara default akan menjadi "GMT".

$ts = $e.metadata.collected_timestamp.seconds

timestamp.get_day_of_week($ts) = 6
Contoh 2

Contoh ini menggunakan literal string untuk menentukan time_zone.

$ts = $e.metadata.collected_timestamp.seconds

timestamp.get_day_of_week($ts, "America/Los_Angeles") = 6

timestamp.get_timestamp

timestamp.get_timestamp(unix_seconds, optional timestamp_format/time_granularity, optional timezone)

Deskripsi

Fungsi ini menampilkan string dalam format YYYY-MM-DD, yang merepresentasikan hari saat stempel waktu berada.

  • unix_seconds adalah bilangan bulat yang merepresentasikan jumlah detik setelah epoch Unix, seperti $e.metadata.event_timestamp.seconds, atau placeholder yang berisi nilai tersebut.
  • timestamp_format bersifat opsional dan merupakan string yang merepresentasikan format stempel waktu. Jika dihilangkan, defaultnya adalah %F %T. Anda dapat menentukan format menggunakan string format tanggal waktu atau salah satu perincian waktu berikut: SECOND, MINUTE, HOUR, DATE, WEEK, MONTH, atau YEAR. Untuk opsi pemformatan lainnya, lihat Memformat elemen untuk bagian tanggal dan waktu
  • time_zone bersifat opsional dan merupakan string yang merepresentasikan zona waktu. Jika dihapus, defaultnya adalah GMT. Anda dapat menentukan zona waktu menggunakan literal string. Opsinya adalah sebagai berikut:
    • Nama database Zona Waktu (TZ) IANA, misalnya, America/Los_Angeles. Untuk mengetahui informasi selengkapnya, lihat daftar zona waktu database tz di Wikipedia.
    • Offset zona waktu dari UTC, dalam format (+|-)H[H][:M[M]], misalnya: "-08:00".

Berikut adalah contoh penentu time_zone yang valid, yang dapat Anda teruskan sebagai argumen kedua ke fungsi ekstraksi waktu:

"America/Los_Angeles", or "-08:00". ("PST" is not supported)
"America/New_York", or "-05:00". ("EST" is not supported)
"Europe/London"
"UTC"
"GMT"

Jenis data parameter

INT, STRING, STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Dalam contoh ini, argumen time_zone dihilangkan, sehingga secara default ditetapkan ke GMT.

$ts = $e.metadata.collected_timestamp.seconds

timestamp.get_timestamp($ts) = "2024-02-22 10:43:51"
Contoh 2

Contoh ini menggunakan literal string untuk menentukan time_zone.

$ts = $e.metadata.collected_timestamp.seconds

timestamp.get_timestamp($ts, "%F %T", "America/Los_Angeles") = "2024-02-22 10:43:51"
Contoh 3

Contoh ini menggunakan literal string untuk menentukan timestamp_format.

$ts = $e.metadata.collected_timestamp.seconds

timestamp.get_timestamp($ts, "%Y-%m", "GMT") = "2024-02"
Contoh 4

Contoh ini memformat stempel waktu unix sebagai string dengan perincian detik.

timestamp.get_timestamp(1708598631, "SECOND", "GMT") = "2024-02-22 10:43:51"
Contoh 5

Contoh ini memformat stempel waktu Unix sebagai string pada perincian menit.

timestamp.get_timestamp(1708598631, "MINUTE", "GMT") = "2024-02-22 10:43"
Contoh 6

Contoh ini memformat stempel waktu Unix sebagai string dengan perincian per jam.

timestamp.get_timestamp(1708598631, "HOUR", "GMT") = "2024-02-22 10"
Contoh 7

Contoh ini memformat stempel waktu unix sebagai string dengan perincian hari.

timestamp.get_timestamp(1708598631, "DATE", "GMT") = "2024-02-22"
Contoh 8

Contoh ini memformat stempel waktu unix sebagai string dengan perincian minggu.

timestamp.get_timestamp(1708598631, "WEEK", "GMT") = "2024-02-18"
Contoh 9

Contoh ini memformat stempel waktu Unix sebagai string dengan perincian bulanan.

timestamp.get_timestamp(1708598631, "MONTH", "GMT") = "2024-02"
Contoh 10

Contoh ini memformat stempel waktu Unix sebagai string pada perincian tahun.

timestamp.get_timestamp(1708598631, "YEAR", "GMT") = "2024"

timestamp.get_week

timestamp.get_week(unix_seconds [, time_zone])

Deskripsi

Fungsi ini menampilkan bilangan bulat dalam rentang [0, 53] yang mewakili minggu dalam setahun. Minggu dimulai pada hari Minggu. Tanggal sebelum hari Minggu pertama dalam setahun adalah pada minggu 0.

  • unix_seconds adalah bilangan bulat yang merepresentasikan jumlah detik setelah epoch Unix, seperti $e.metadata.event_timestamp.seconds, atau placeholder yang berisi nilai tersebut.
  • time_zone bersifat opsional dan merupakan string yang merepresentasikan zona waktu. Jika dihapus, defaultnya adalah "GMT". Anda dapat menentukan zona waktu menggunakan literal string. Opsinya adalah:
    • Nama database TZ, misalnya "America/Los_Angeles". Untuk informasi selengkapnya, lihat kolom"Nama Database TZ" dari halaman ini
    • Offset zona waktu dari UTC, dalam format(+|-)H[H][:M[M]], misalnya: "-08:00".

Berikut adalah contoh penentu time_zone yang valid, yang dapat Anda teruskan sebagai argumen kedua ke fungsi ekstraksi waktu:

"America/Los_Angeles", or "-08:00". ("PST" is not supported)
"America/New_York", or "-05:00". ("EST" is not supported)
"Europe/London"
"UTC"
"GMT"

Jenis data parameter

INT, STRING

Jenis hasil yang ditampilkan

INT

Contoh kode

Contoh 1

Dalam contoh ini, argumen time_zone tidak ada, sehingga secara default akan menjadi "GMT".

$ts = $e.metadata.collected_timestamp.seconds

timestamp.get_week($ts) = 0
Contoh 2

Contoh ini menggunakan literal string untuk menentukan time_zone.

$ts = $e.metadata.collected_timestamp.seconds

timestamp.get_week($ts, "America/Los_Angeles") = 0

timestamp.now

timestamp.now()

Deskripsi

Menampilkan jumlah detik sejak 1970-01-01 00.00.00 UTC. Ini juga dikenal sebagai waktu epoch Unix.

Jenis hasil yang ditampilkan

INT

Contoh kode

Contoh 1

Contoh berikut menampilkan stempel waktu untuk kode yang dieksekusi pada 22 Mei 2024 pukul 18.16.59.

timestamp.now() = 1716401819 // Unix epoch time in seconds for May 22, 2024 at 18:16:59

window.avg

Didukung di:
window.avg(numeric_values [, should_ignore_zero_values])

Deskripsi

Menampilkan rata-rata nilai input (yang dapat berupa Integer atau Float). Menetapkan argumen kedua opsional ke benar (true) akan mengabaikan nilai nol.

Jenis data parameter

INT|FLOAT

Jenis hasil yang ditampilkan

FLOAT

Contoh kode

Contoh 1

Contoh ini menunjukkan rata-rata bilangan bulat.

// This rule sets the outcome $size_mode to the average
// file size in the 5 minute match window.
events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $size_mode = window.avg($e.file.size) // yields 2.5 if the event file size values in the match window are 1, 2, 3 and 4
Contoh 2

Contoh ini menunjukkan rata-rata float.

events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $size_mode = window.avg($e.file.size) // yields 1.75 if the event file size values in the match window are 1.1 and 2.4
Contoh 3

Rata-rata input negatif

events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $size_mode = window.avg($e.file.size) // yields 0.6 if the event file size values in the match window are -1.1, 1.1, 0.0 and 2.4
Contoh 4

0 pengembalian 0

events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $size_mode = window.avg($e.file.size) // yields 0 if the event file size values in the match window is 0
Contoh 5

Mengabaikan 0 nilai

events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $size_mode = window.avg($e.file.size, true) // yields 394 if the event file size values in the match window are 0, 0, 0 and 394

window.first

Didukung di:
window.first(values_to_sort_by, values_to_return)

Deskripsi

Fungsi agregasi ini menampilkan nilai string yang berasal dari peristiwa dengan nilai int berkorelasi terendah di jendela pencocokan. Contoh kasus penggunaan adalah mendapatkan userid dari peristiwa dengan stempel waktu terendah di periode pencocokan (peristiwa paling awal).

Jenis data parameter

INT, STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Mendapatkan nilai string yang berasal dari peristiwa dengan nilai int berkorelasi terendah di jendela pencocokan.

// This rule sets the outcome $first_event to the lowest correlated int value
// in the 5 minute match window.
events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $first_event = window.first($e.metadata.timestamp.seconds, $e.metadata.event_type) // yields v1 if the events in the match window are 1, 2 and 3 and corresponding values v1, v2, and v3.

window.last

Didukung di:
window.last(values_to_sort_by, values_to_return)

Deskripsi

Fungsi agregasi ini menampilkan nilai string yang berasal dari peristiwa dengan nilai int berkorelasi tertinggi dalam jendela kecocokan. Contoh kasus penggunaan adalah mendapatkan userid dari peristiwa dengan stempel waktu terendah di jendela kecocokan (stempel waktu tertinggi).

Jenis data parameter

INT, STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Mendapatkan nilai string yang berasal dari peristiwa dengan nilai int berkorelasi tertinggi dalam periode pencocokan.

// This rule sets the outcome $last_event to the highest correlated int value
// in the 5 minute match window.
events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $last_event = window.first($e.metadata.timestamp.seconds, $e.metadata.event_type) // yields v3 if the events in the match window are 1, 2 and 3 and corresponding values v1, v2, and v3.

window.median

Didukung di:
window.median(numeric_values, should_ignore_zero_values)

Deskripsi

Menampilkan median nilai input. Jika ada 2 nilai median, hanya 1 yang akan dipilih secara non-deterministik sebagai nilai yang ditampilkan.

Jenis data parameter

INT|FLOAT, BOOL

Jenis hasil yang ditampilkan

FLOAT

Contoh kode

Contoh 1

Contoh ini menampilkan median saat nilai input bukan nol.

rule median_file_size {
    meta:
    events:
      $e.metadata.event_type = "FILE_COPY"
        $userid = $e.principal.user.userid
    match:
      $userid over 1h
    outcome:
      $median_file_size = window.median($e.principal.file.size) // returns 2 if the file sizes in the match window are [1, 2, 3]
  condition:
      $e
}
Contoh 2

Contoh ini menampilkan median saat input menyertakan beberapa nilai nol yang tidak boleh diabaikan.

rule median_file_size {
    meta:
    events:
      $e.metadata.event_type = "FILE_COPY"
        $userid = $e.principal.user.userid
    match:
      $userid over 1h
    outcome:
      $median_file_size = window.median($e.principal.file.size) // returns 1 if the file sizes in the match window are [0,0, 1, 2, 3]
  condition:
      $e
}
Contoh 3

Contoh ini menampilkan median saat input menyertakan beberapa nilai nol yang harus diabaikan.

rule median_file_size {
    meta:
    events:
      $e.metadata.event_type = "FILE_COPY"
        $userid = $e.principal.user.userid
    match:
      $userid over 1h
    outcome:
      $median_file_size = window.median($e.principal.file.size, true) // returns 2 if the file sizes in the match window are [0,0, 1, 2, 3]
  condition:
      $e
}
Contoh 4

Contoh ini menampilkan median saat input mencakup semua nilai nol yang harus diabaikan.

rule median_file_size {
    meta:
    events:
      $e.metadata.event_type = "FILE_COPY"
        $userid = $e.principal.user.userid
    match:
      $userid over 1h
    outcome:
      $median_file_size = window.median($e.principal.file.size) // returns 0 if the file sizes in the match window are [0,0]
  condition:
      $e
}
Contoh 5

Contoh ini menunjukkan bahwa, jika ada beberapa median, hanya satu median yang ditampilkan.

rule median_file_size {
    meta:
    events:
      $e.metadata.event_type = "FILE_COPY"
        $userid = $e.principal.user.userid
    match:
      $userid over 1h
    outcome:
      $median_file_size = window.median($e.principal.file.size) // returns 1 if the file sizes in the match window are [1, 2, 3, 4]
  condition:
      $e
}

window.mode

Didukung di:
window.mode(values)

Deskripsi

Menampilkan mode nilai input. Jika ada beberapa kemungkinan nilai mode, hanya salah satu nilai tersebut yang akan dipilih secara non-deterministik sebagai nilai yang ditampilkan.

Jenis data parameter

INT|FLOAT|STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Contoh 1

Mendapatkan mode nilai di jendela kecocokan.

// This rule sets the outcome $size_mode to the most frequently occurring
// file size in the 5 minute match window.
events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $size_mode = window.mode($e.file.size) // yields 1.6 if the event file size values in the match window are 1.6, 2, and 1.6

window.stddev

Didukung di:
window.stddev(numeric_values)

Deskripsi

Menampilkan simpangan baku nilai input dalam jendela kecocokan.

Jenis data parameter

INT|FLOAT

Jenis hasil yang ditampilkan

FLOAT

Contoh kode

Contoh 1

Contoh ini menampilkan simpangan baku bilangan bulat dalam jendela kecocokan.

// This rule creates a detection when the file size stddev in 5 minutes for a user is over a threshold.
events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $p1 = window.stddev($e.file.size) // yields 4.0 if the event file size values in the match window are [10, 14, 18].
condition:
  $e and #p1 > 2
Contoh 2

Contoh ini menampilkan simpangan baku float dalam jendela pencocokan.

events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $p1 = window.stddev($e.file.size) // yields 4.488686 if the event file size values in the match window are [10.00, 14.80, 18.97].
condition:
  $e and #p1 > 2
Contoh 3

Contoh ini menampilkan simpangan baku dalam jendela kecocokan yang berisi angka negatif.

events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $p1 = window.stddev($e.file.size) // yields 48.644972 if the event file size values in the match window are [-1, -56, -98].
condition:
  $e and #p1 > 2
Contoh 4

Contoh ini menampilkan simpangan baku nol jika semua nilai dalam jendela kecocokan sama.

events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $p1 = window.stddev($e.file.size) // yields 0.000000 if the event file size values in the match window are [1, 1, 1].
condition:
  $e and #p1 > 2
Contoh 5

Contoh ini menampilkan simpangan baku jendela kecocokan yang berisi angka positif dan negatif.

events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $p1 = window.stddev($e.file.size) // yields 1.000000 if the event file size values in the match window are [1, 0, -1].
condition:
  $e and #p1 > 10

window.variance

Didukung di:
window.variance(values)

Deskripsi

Fungsi ini menampilkan varians yang ditentukan dari nilai input.

Jenis data parameter

INT|FLOAT

Jenis hasil yang ditampilkan

FLOAT

Contoh kode

Contoh 1

Contoh ini menampilkan varians semua bilangan bulat.

// This rule creates a detection when the file size variance in 5 minutes for a user is over a threshold.
events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $p1 = window.variance($e.file.size) // yields 16 if the event file size values in the match window are [10, 14, 18].
condition:
  $e and #p1 > 10
Contoh 2

Contoh ini menampilkan varians semua float.

events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $p1 = window.variance($e.file.size) // yields 20.148300 if the event file size values in the match window are [10.00, 14.80, 18.97].
condition:
  $e and #p1 > 10
Contoh 3

Contoh ini menampilkan variansi angka negatif.

events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $p1 = window.variance($e.file.size) // yields 2366.333333 if the event file size values in the match window are [-1, -56, -98].
condition:
  $e and #p1 > 10
Contoh 4

Contoh ini menampilkan nilai varians kecil.

events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $p1 = window.variance($e.file.size) // yields 0.000000 if the event file size values in the match window are [0.000000, 0.000000, 0.000100].
condition:
  $e and #p1 > 10
Contoh 5

Contoh ini menampilkan varians nol.

events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $p1 = window.variance($e.file.size) // yields 0.000000 if the event file size values in the match window are [1, 1, 1].
condition:
  $e and #p1 > 10
Contoh 6

Contoh ini menampilkan varians bilangan positif dan negatif.

events:
 $e.user.userid = $userid
match:
 $userid over 5m
outcome:
  $p1 = window.variance($e.file.size) // yields 1.000000 if the event file size values in the match window are [1, 0, -1].
condition:
  $e and #p1 > 10

bytes.to_base64

bytes.to_base64(bytes, optional_default_string)

Deskripsi

Fungsi mengonversi nilai bytes menjadi base64 encoded string. Panggilan fungsi dengan nilai yang tidak dapat di-cast akan menampilkan string kosong secara default.

Jenis data parameter

BYTES, STRING

Jenis hasil yang ditampilkan

STRING

Contoh kode

Byte Biner Mentah ke String Berenkode Base64

Fungsi ini mengonversi byte biner mentah menjadi string berenkode base64.

bytes.to_base64(b'000000006f8ec5586d026f9ddac56e9f2fe15b8a0000000001000000cd000000) = "AAAAAG+OxVhtAm+d2sVuny/hW4oAAAAAAQAAAM0AAAA="
Konversi Gagal (Default ke String yang Diberikan Secara Opsional)

Fungsi ini secara default menggunakan "invalid bytes" jika nilai byte yang diberikan tidak valid.

bytes.to_base64(b'000000006f8ec5586d", "invalid bytes") = "invalid bytes"

Penetapan fungsi ke placeholder

Anda dapat menetapkan hasil panggilan fungsi ke placeholder di bagian events. Contoh:

$placeholder = strings.concat($e.principal.hostname, "my-string").

Kemudian, Anda dapat menggunakan variabel placeholder di bagian match, condition, dan outcome. Namun, ada dua batasan pada penetapan fungsi ke placeholder:

  1. Setiap placeholder dalam penetapan fungsi ke placeholder harus ditetapkan ke ekspresi yang berisi kolom peristiwa. Misalnya, contoh berikut valid:

    $ph1 = $e.principal.hostname
    $ph2 = $e.src.hostname
    
    // Both $ph1 and $ph2 have been assigned to an expression containing an event field.
    $ph1 = strings.concat($ph2, ".com")
    
    $ph1 = $e.network.email.from
    $ph2 = strings.concat($e.principal.hostname, "@gmail.com")
    
    // Both $ph1 and $ph2 have been assigned to an expression containing an event field.
    $ph1 = strings.to_lower($ph2)
    

    Namun, contoh berikut tidak valid:

    $ph1 = strings.concat($e.principal.hostname, "foo")
    $ph2 = strings.concat($ph1, "bar") // $ph2 has NOT been assigned to an expression containing an event field.
    
  2. Panggilan fungsi harus bergantung pada satu dan hanya satu peristiwa. Namun, lebih dari satu kolom dari peristiwa yang sama dapat digunakan dalam argumen panggilan fungsi. Misalnya, kode berikut valid:

    $ph = strings.concat($event.principal.hostname, "string2")

    $ph = strings.concat($event.principal.hostname, $event.src.hostname)

    Namun, berikut ini tidak valid:

    $ph = strings.concat("string1", "string2")

    $ph = strings.concat($event.principal.hostname, $anotherEvent.src.hostname)

Sintaksis Daftar Referensi

Lihat halaman tentang Daftar Referensi kami untuk mengetahui informasi selengkapnya tentang perilaku daftar referensi dan sintaksis daftar referensi.

Anda dapat menggunakan daftar referensi di bagian events atau outcome. Berikut adalah sintaksis untuk menggunakan berbagai jenis daftar referensi dalam aturan:

// STRING reference list
$e.principal.hostname in %string_reference_list

// REGEX reference list
$e.principal.hostname in regex %regex_reference_list

// CIDR reference list
$e.principal.ip in cidr %cidr_reference_list

Anda juga dapat menggunakan operator not dan operator nocase dengan daftar referensi seperti yang ditunjukkan dalam contoh berikut:

// Exclude events whose hostnames match substrings in my_regex_list.
not $e.principal.hostname in regex %my_regex_list

// Event hostnames must match at least 1 string in my_string_list (case insensitive).
$e.principal.hostname in %my_string_list nocase

Operator nocase kompatibel dengan daftar STRING dan daftar REGEX.

Untuk alasan performa, Detection Engine membatasi penggunaan daftar referensi.

  • Pernyataan in maksimum dalam aturan, dengan atau tanpa operator khusus: 7
  • Pernyataan in maksimum dengan operator regex: 4
  • Pernyataan in maksimum dengan operator cidr: 2

Pemeriksaan jenis

Google SecOps melakukan pemeriksaan jenis terhadap sintaksis YARA-L saat Anda membuat aturan dalam antarmuka. Kesalahan pemeriksaan jenis yang ditampilkan membantu Anda merevisi aturan sedemikian rupa untuk memverifikasi bahwa aturan tersebut akan berfungsi seperti yang diharapkan.

Berikut adalah contoh predikat tidak valid:

// $e.target.port is of type integer which cannot be compared to a string.
$e.target.port = "80"

// "LOGIN" is not a valid event_type enum value.
$e.metadata.event_type = "LOGIN"

Pengambilan Sampel Peristiwa Deteksi

Deteksi dari aturan multi-peristiwa berisi sampel peristiwa untuk memberikan konteks tentang peristiwa yang menyebabkan deteksi. Ada batas hingga 10 sampel peristiwa untuk setiap variabel peristiwa yang ditentukan dalam aturan. Misalnya, jika aturan menentukan 2 variabel peristiwa, setiap deteksi dapat memiliki hingga 20 sampel peristiwa. Batas berlaku untuk setiap variabel peristiwa secara terpisah. Jika satu variabel peristiwa memiliki 2 peristiwa yang berlaku dalam deteksi ini, dan variabel peristiwa lainnya memiliki 15 peristiwa yang berlaku, deteksi yang dihasilkan berisi 12 sampel peristiwa (2 + 10).

Setiap sampel peristiwa yang melebihi batas akan dihilangkan dari deteksi.

Jika Anda menginginkan informasi lebih lanjut tentang peristiwa yang menyebabkan deteksi, Anda dapat menggunakan agregasi di bagian hasil untuk menampilkan informasi tambahan dalam deteksi Anda.

Jika melihat deteksi di UI, Anda dapat mendownload semua sampel peristiwa untuk deteksi. Untuk mengetahui informasi selengkapnya, lihat Peristiwa download.

Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.