Kondisi dalam penelusuran dan dasbor UDM menggunakan YARA-L 2.0
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 bagianevents
.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 bagianevents
.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 saatOR
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 denganAND
. 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
(tempatn >= 0
)#var >= m
(tempatm > 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
(tempatn > 0
)#var <= m
(tempatm >= 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 N dari X dalam penelusuran UDM
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.