Kondisi dalam penelusuran dan dasbor UDM menggunakan YARA-L 2.0

Didukung di:

Bagian condition menentukan kriteria untuk menyertakan data dalam hasil penelusuran. Kondisi ini dievaluasi terhadap variabel peristiwa dan placeholder yang ditentukan di bagian events. Anda dapat menggabungkan kondisi ini menggunakan kata kunci and.

Batasan

Kondisi dalam penelusuran memiliki batasan berikut:

  • Wajib: Bagian match wajib diisi. Atau, Anda dapat menentukan filter yang tidak dikelompokkan langsung dalam bagian events.

  • Wajib: Variabel peristiwa dan placeholder harus digabungkan dalam bagian condition.

  • Hanya ekspresi perbandingan bilangan bulat dan float yang didukung. Ekspresi ini harus memiliki variabel di sebelah kiri dan bilangan bulat atau float di sebelah kanan (misalnya, #c > 1, $port = 80). Operator yang didukung adalah <, >, dan =.

  • Urutan variabel dan klausa dalam bagian condition tidak memengaruhi hasil.

  • Untuk menggunakan variabel hasil di bagian condition, tentukan dan gabungkan variabel tersebut. Anda dapat memfilter variabel hasil yang tidak diagregasi di bagian events.

  • Operasi matematika langsung dengan variabel tidak didukung (misalnya, #e1 + 5 > 6, $o1.sum($pl) > 0).

  • Tidak ada batasan tambahan jika kondisi OR berlaku untuk peristiwa dasar yang sama. Batasan berikut berlaku saat OR digunakan di berbagai peristiwa:

    • Perbandingan tidak ada tidak didukung dengan OR. Misalnya, math.log($outcome1_sent_bytes) > 5 OR (#placeholder2) < 10 tidak didukung.

    • Variabel non-UDM tidak didukung dalam klausa OR yang mencakup peristiwa yang berbeda. Namun, OR didukung dalam konteks satu peristiwa atau saat dikelompokkan dengan AND. Contohnya, $entity and ($udm_event_1 or $placeholder_derived_from_udm_event_1) Berikut contoh lainnya, $entity and ($udm_event_1 or $outcome_udm_event_1_bytes > 1000).

Menghitung karakter (#)

Karakter #, saat mendahului nama variabel peristiwa atau placeholder (misalnya, #c), merepresentasikan jumlah kemunculan unik peristiwa tersebut atau jumlah nilai unik yang memenuhi semua kondisi di bagian events yang terkait dengan variabel tersebut. Misalnya, #c > 1 menyiratkan bahwa peristiwa atau placeholder c harus terjadi lebih dari sekali.

Contoh kueri:

$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp

$e2.principal.hostname = $hostname
$e2.target.hostname = "homedepot.com"
$e2.target.port = 3042 // tcp/udp

match:
$hostname over 1h

condition:
#e1 > 0 or #e2 > 1

Karakter nilai ($)

Fungsi karakter $ bergantung pada konteksnya.

  • Variabel hasil: Jika ditempatkan sebelum nama variabel hasil (misalnya, $risk_score), variabel ini merepresentasikan nilai variabel.

  • Variabel peristiwa atau placeholder: Jika ditempatkan sebelum nama variabel peristiwa atau placeholder (misalnya, $event), variabel ini setara dengan #event > 0 dan menyiratkan bahwa setidaknya satu kemunculan peristiwa tersebut harus ada.

Kondisi peristiwa dan placeholder

Anda dapat menggabungkan beberapa predikat kondisi untuk peristiwa dan variabel placeholder menggunakan kata kunci and.

Contoh penggunaan or (peristiwa tunggal):

condition:
  $ph2 and $ph3

Penting: Saat menulis logika di bagian events atau condition, gunakan ! untuk negasi. Gunakan kata kunci not hanya di bagian outcome.

Kondisi terbatas dan tidak terbatas

Kondisi variabel peristiwa dapat dibatasi atau tidak dibatasi.

Kondisi terikat mengharuskan variabel peristiwa terkait ada. Artinya, setidaknya satu kemunculan peristiwa harus muncul dalam deteksi apa pun.

Contoh:

  • $var (setara dengan #var > 0)
  • #var > n (tempat n >= 0)
  • #var >= m (tempat m > 0)

Contoh kueri:

$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"

match:
$hostname over 1h

condition:
#e1 > 0

Kondisi tanpa batas memungkinkan variabel peristiwa terkait tidak ada. Artinya, kemungkinan tidak ada kemunculan peristiwa yang muncul dalam deteksi. Setiap referensi ke kolom pada variabel peristiwa akan menghasilkan nilai nol. Gunakan ini untuk penelusuran tidak ada.

Contoh:

  • !$var (setara dengan #var = 0)
  • #var >= 0
  • #var < n (tempat n > 0)
  • #var <= m (tempat m >= 0)

Contoh kueri:

$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp

match:
$hostname over 1h

outcome:
$bytes_sent = sum($e1.network.sent_bytes)

condition:
$bytes_sent >= 0

Catatan: Untuk kueri penelusuran tidak ada (menggunakan kondisi tanpa batas), mesin deteksi menambahkan penundaan 1 jam pada latensi yang diharapkan.

Kueri penelusuran dengan kondisi yang tidak terikat harus memenuhi kriteria berikut:

  • Setidaknya satu peristiwa UDM harus memiliki kondisi yang dibatasi; yaitu, setidaknya satu peristiwa UDM harus ada.

  • Placeholder dengan kondisi tidak terikat harus dikaitkan dengan setidaknya satu peristiwa UDM terikat.

  • Entitas dengan kondisi tidak terikat harus dikaitkan dengan setidaknya satu peristiwa UDM terikat.

Kondisi hasil

Anda dapat menentukan kondisi hasil menggunakan variabel hasil, dan menggabungkannya dengan operator logis (and, or, not). Sintaksis perbandingan bergantung pada jenis data variabel hasil.

  • integer dan float: Gunakan =, >, >=, <, <=, != (misalnya, $risk_score > 10, $risk_score <= 5.5).
  • string: Gunakan = atau != (misalnya, $severity = "HIGH").
  • daftar bilangan bulat atau array: Gunakan arrays.contains() (misalnya, arrays.contains($event_ids, "id_1234")).

Contoh kueri:

$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
match:
$hostname over 1h

outcome:
$bytes_sent = sum($e1.network.sent_bytes)

condition:
$e1

Kondisi penelusuran UDM mendukung sintaksis "N dari X", yang memberikan evaluasi fleksibel terhadap beberapa kriteria. Sintaksis ini memungkinkan Anda menentukan bahwa suatu kondisi terpenuhi jika N (jumlah tertentu) dari X (daftar ekspresi boolean) bernilai benar.

Contoh: Pertimbangkan skenario saat Anda ingin mengidentifikasi proses yang menunjukkan beberapa perilaku mencurigakan, tetapi tidak harus semuanya, dari daftar tag yang telah ditentukan sebelumnya yang disediakan oleh pengayaan VirusTotal (VT). Sintaksis "N dari X" mengatasi hal ini dengan memungkinkan Anda menentukan jumlah minimum kondisi yang harus dipenuhi.

Kueri penelusuran UDM berikut mencari proses yang setidaknya tiga kondisinya terpenuhi:


$e.metadata.event_type = "PROCESS_LAUNCH"
$e.target.process.file.full_path = $process

match:
    $process

outcome:
    $first_seen = earliest($e.metadata.event_timestamp)
    $last_seen = latest($e.metadata.event_timestamp)
    $total_events = count($e.metadata.id)
    // Collect all unique tags associated with this process from all its launch events
    $tags = array_distinct($e.target.process.file.tags)

condition:
    // Trigger if at least 3 of the following conditions (tag checks) are true
    3 of [
      arrays.contains($tags, "malware"),
      arrays.contains($tags, "detect-debug-environment"),
      arrays.contains($tags, "checks-disk-space"),
      arrays.contains($tags, "checks-cpu-name"),
      arrays.contains($tags, "invalid-signature"),
      arrays.contains($tags, "self-delete")
    ]

order:
    $total_events desc

Operator ANY of dan ALL of

ANY of [expressions] mengevaluasi ke true jika setidaknya salah satu ekspresi Boolean yang tercantum adalah true. ALL of [expressions] mengharuskan setiap ekspresi yang tercantum berupa true. Gabungkan operator ini dengan kondisi lain menggunakan kata kunci seperti AND.

Contoh:


$e.metadata.event_type = "PROCESS_LAUNCH"
$e.target.process.file.full_path = $process

match:
 $process

outcome:
  $first_seen = timestamp.get_timestamp(min($e.metadata.event_timestamp.seconds))
  $last_seen = timestamp.get_timestamp(max($e.metadata.event_timestamp.seconds))
  $total = count($e.metadata.id)
  $tags = array_distinct($e.target.process.file.tags)
  $vt_first_seen_time = max(if((timestamp.current_seconds() - $e.target.process.file.first_seen_time.seconds) < 86400, 1 , 0))
  $vt_last_analysis_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_analysis_time.seconds) < 86400, 1 , 0))
  $vt_last_modification_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_modification_time.seconds) < 86400, 1 , 0))
  $vt_last_seen_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_seen_time.seconds) < 86400, 1 , 0))

condition:
  3 of [
    arrays.contains($tags, "malware"),
    arrays.contains($tags, "detect-debug-environment"),
    arrays.contains($tags, "checks-disk-space"),
    arrays.contains($tags, "checks-cpu-name"),
    arrays.contains($tags, "invalid-signature"),
    arrays.contains($tags, "self-delete")
  ]
  and ANY of [
    $vt_first_seen_time = 1,
    $vt_last_analysis_time = 1,
    $vt_last_modification_time = 1,
    $vt_last_seen_time = 1
  ]

order:
  $total desc

unselect:
    $vt_first_seen_time,
    $vt_last_analysis_time,
    $vt_last_modification_time,
    $vt_last_seen_time

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