Ikhtisar bahasa YARA-L 2.0

YARA-L 2.0 adalah bahasa komputer yang digunakan untuk membuat aturan penelusuran melalui data log perusahaan saat diserap ke akun Chronicle Anda. Sintaks YARA-L berasal dari bahasa YARA yang dikembangkan oleh VirusTotal. Bahasa ini bekerja bersama dengan Chronicle Detection Engine dan memungkinkan Anda mencari ancaman dan peristiwa lain di seluruh volume data yang besar. Lihat juga sintaks bahasa YARA-L 2.0

Struktur aturan

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

  1. meta
  2. acara
  3. kecocokan (opsional)
  4. ketentuan

Berikut ini menggambarkan struktur generik 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.
    // Identical to the meta section in YARA-L.
    //
    // For example:
    // author = "Analyst #2112"
    // date = "08/09/2020"
    // description = "suspicious domain detected"

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

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

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

Contoh aturan YARA-L 2.0

Contoh berikut menunjukkan aturan yang ditulis dalam YARA-L 2.0. Masing-masing menunjukkan cara menghubungkan peristiwa dalam bahasa aturan.

Login dari berbagai kota

Aturan berikut menelusuri pengguna yang telah login ke perusahaan Anda dari dua kota atau lebih dalam waktu kurang dari 5 menit:

rule DifferentCityLogin {
  meta:

  events:
    $udm.metadata.event_type = "USER_LOGIN"
    $udm.principal.user.userid = $user
    $udm.principal.location.city = $city

  match:
    $user over 5m

  condition:
    #city > 1
}

Variabel pencocokan: $user

Variabel peristiwa:$udm

Variabel Placeholder: $city $user

Berikut ini penjelasan cara kerja aturan ini:

  • Mengelompokkan peristiwa dengan nama pengguna ($user) dan mengembalikannya ($user) saat ditemukan kecocokan.
  • Rentang waktu adalah 5 menit, artinya hanya peristiwa yang jaraknya kurang dari 5 menit yang berkorelasi.
  • Menelusuri grup acara ($udm) yang jenis acaranya USER_LOGIN.
  • Untuk grup acara tersebut, aturan memanggil ID pengguna sebagai $user dan kota login sebagai $city.
  • Menampilkan kecocokan jika jumlah $city nilai yang berbeda lebih besar dari 1 dalam grup peristiwa ($udm) dalam rentang waktu 5 menit.

Pembuatan dan penghapusan pengguna yang cepat

Aturan berikut menelusuri pengguna yang telah dibuat dan kemudian dihapus dalam waktu 4 jam:

  rule UserCreationThenDeletion {
  meta:

  events:
    $create.target.user.userid = $user
    $create.metadata.event_type = "USER_CREATION"

    $delete.target.user.userid = $user
    $delete.metadata.event_type = "USER_DELETION"

    $create.metadata.event_timestamp.seconds <=
       $delete.metadata.event_timestamp.seconds

  match:
    $user over 4h

  condition:
    $create and $delete
}

Variabel peristiwa:$create dan $delete

Variabel pencocokan: $user

Variabel Placeholder: T/A

Berikut ini penjelasan cara kerja aturan ini:

  • Mengelompokkan peristiwa dengan nama pengguna ($user) dan mengembalikannya ($user) saat ditemukan kecocokan.
  • Jangka waktu adalah 4 jam, artinya hanya peristiwa yang dipisahkan kurang dari 4 jam yang berkorelasi.
  • Menelusuri dua grup peristiwa ($create dan $delete, dengan $create setara dengan #create >= 1).
  • $create sesuai dengan USER_CREATION peristiwa dan memanggil ID pengguna sebagai $user.
  • $user digunakan untuk menggabungkan dua grup acara bersama-sama.
  • $delete sesuai dengan USER_DELETION peristiwa dan memanggil ID pengguna sebagai $user. Aturan ini mencari kecocokan dengan ID pengguna di dua grup peristiwa adalah sama.
  • Aturan ini mencari kasus saat peristiwa dari $delete terjadi setelah peristiwa dari $create, yang menampilkan kecocokan saat ditemukan.

Acara tunggal versus multi-acara

Contoh aturan berikut menunjukkan cara membuat aturan untuk menelusuri satu peristiwa, lalu memodifikasinya untuk menelusuri beberapa peristiwa.

Berikut adalah aturan peristiwa versi tunggal:

rule SingleEventRule {
  meta:
    author = "noone@altostrat.com"

  events:
    $e.metadata.event_type = "USER_LOGIN"

  condition:
    $e
}

Aturan ini hanya menelusuri peristiwa proses masuk pengguna dan akan mengembalikan peristiwa pertama yang ditemukan dalam data perusahaan yang disimpan dalam akun Chronicle Anda.

Berikut adalah versi aturan multi-peristiwa:

rule MultiEventRule {
  meta:
    author = "noone@altostrat.com"

  events:
    $e.metadata.event_type = "USER_LOGIN"
    $e.principal.user.userid = $user

  match:
    $user over 10m

  condition:
    #e >= 10
}

Aturan ini menelusuri pengguna yang telah masuk setidaknya 10 kali dalam waktu kurang dari 10 menit.

Satu peristiwa dalam rentang alamat IP

Contoh berikut menunjukkan aturan peristiwa tunggal yang menelusuri kecocokan antara dua pengguna tertentu dan rentang alamat IP tertentu:

rule OrsAndNetworkRange {
  meta:
    author = "noone@altostrat.com"

  events:
    // Checks CIDR ranges.
    net.ip_in_range_cidr($e.principal.ip, "203.0.113.0/24")

    // Detection when the hostname field matches either value using or.
    $e.principal.hostname = /pbateman/ or $e.principal.hostname = /sspade/

  condition:
    $e
}

Kolom berulang

Contoh berikut membantu menggambarkan konsep kolom berulang. Kolom udm.principal.ip biasanya direpresentasikan sebagai array.

Misalnya, host mungkin memiliki beberapa alamat IP:

principal.ip [192.0.2.5, 198.51.100.10, 192.0.2.16]

Jika Anda menyertakan pernyataan berikut dalam aturan:

$e.principal.ip = "192.0.2.16"

Chronicle menelusuri alamat IP ini dalam larik (dan akan menemukannya dalam contoh ini). Pernyataan ini tidak berarti bahwa host hanya memiliki satu alamat IP.

Aturan berikut menelusuri peristiwa saat alamat IP sumber telah terhubung ke alamat IP target saat membuat permintaan ke lebih dari 50 port target yang berbeda dalam rentang waktu kurang dari satu menit. Ini mungkin adalah entitas berbahaya yang menelusuri port jaringan yang tidak aman.

rule RepeatedFieldsRuleExample {
  meta:
    author = "noone@altostrat.com"

  events:
    $e.principal.ip = $source_ip
    $e.target.ip = $target_ip
    $e.target.port = $target_port

  match:
    $source_ip, $target_ip over 1m

  condition:
    #target_port > 50
}

Ekspresi reguler dalam aturan

Contoh ekspresi reguler YARA-L 2.0 berikut menelusuri peristiwa dengan email yang diterima dari domain altostrat.com. Karena nocase telah ditambahkan ke perbandingan $host variabel regex dan fungsi regex, kedua perbandingan ini tidak membedakan huruf besar / kecil.

rule RegexRuleExample {
  meta:
    author = "noone@altostrat.com"

  events:
    $e.principal.hostname = $host
    $host = /.*HoSt.*/ nocase
    re.regex($e.network.email.from, `.*altostrat\.com`) nocase

  match:
    $host over 10m

  condition:
    #e > 10
}

YARA-L jendela geser

Secara default, aturan YARA-L 2.0 dievaluasi menggunakan jendela hop. Rentang waktu data peristiwa perusahaan dibagi menjadi kumpulan jendela melompat yang tumpang-tindih, masing-masing dengan durasi yang ditentukan di bagian match. Peristiwa kemudian dikorelasikan dalam setiap jendela hop. Dengan jendela hop, Anda tidak dapat menelusuri peristiwa yang terjadi dalam urutan tertentu (misalnya, e1 terjadi hingga 2 menit setelah e2). Kemunculan peristiwa e1 dan kemunculan peristiwa e2 berkorelasi selama keduanya berada dalam durasi jendela melompat satu sama lain.

Aturan juga dapat dievaluasi menggunakan jendela geser. Dengan jendela geser, jendela geser dengan durasi yang ditentukan di bagian match dihasilkan saat memulai atau diakhiri dengan variabel peristiwa pivot yang ditentukan. Peristiwa kemudian dikorelasikan dalam setiap jendela geser. Hal ini memungkinkan penelusuran peristiwa yang terjadi dalam urutan tertentu (misalnya, e1 terjadi dalam 2 menit sejak e2). Kemunculan peristiwa e1 dan kemunculan peristiwa e2 berkorelasi jika peristiwa e1 terjadi dalam durasi jendela geser setelah peristiwa e2.

Sintaks aturan jendela geser

Tentukan jendela geser di bagian pencocokan aturan sebagai berikut:

<match-variable-name-1>, <match-variable-name-2>, ... over <sliding-window- duration> before|after <pivot-event-variable-name>

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

Contoh aturan jendela geser

Contoh jendela geser YARA-L 2.0 berikut menelusuri tidak adanya peristiwa firewall_2 setelah peristiwa firewall_1. Kata kunci after digunakan dengan variabel peristiwa pivot $e1 untuk menentukan bahwa hanya 10 menit jendela setelah setiap peristiwa firewall_1 harus diperiksa saat menghubungkan peristiwa.

rule SlidingWindowRuleExample {
  meta:
    author = "noone@google.com"

  events:
    $e1.metadata.product_name = "firewall_1"
    $e1.principal.hostname = $host

    $e2.metadata.product_name = "firewall_2"
    $e2.principal.hostname = $host

  match:
    $host over 10m after $e1

  condition:
    $e1 and !$e2
}