Sintaksis bagian kondisi
Dokumen ini menjelaskan cara menggunakan bagian condition dari kueri YARA-L. Bagian condition digunakan dalam penelusuran, dasbor, dan diperlukan untuk aturan serta berisi logika untuk memfilter hasil lebih lanjut. Jika digunakan dalam kueri penelusuran atau dasbor, hanya akan menampilkan output yang memenuhi kondisi. Jika digunakan dalam aturan deteksi, kondisi harus dipenuhi untuk memicu pemberitahuan.
Di bagian condition, Anda dapat menggunakan operator boolean, operator perbandingan, dan hasil variabel outcome untuk menentukan apakah kueri harus dipicu.
Menentukan bagian condition
Tentukan ekspresi kondisi untuk peristiwa dan variabel placeholder di bagian condition. Anda juga dapat menentukan kondisi kecocokan untuk peristiwa dan placeholder yang ditentukan di bagian events dan secara opsional menggunakan kata kunci and untuk menentukan kondisi kecocokan menggunakan variabel hasil yang ditentukan di bagian outcome. Lihat Sintaksis bagian hasil.
Anda dapat menggabungkan ekspresi menggunakan kata kunci and atau or:
Gunakan
anddi antara kondisi.Gunakan
orhanya jika kueri berisi satu variabel peristiwa.
Gunakan karakter # di bagian condition sebelum nama variabel peristiwa atau placeholder untuk menunjukkan jumlah peristiwa atau nilai unik yang memenuhi semua kondisi di bagian events. Contoh:
#c > 1 berarti variabel c harus muncul lebih dari 1 kali.
Gunakan karakter $ di bagian condition sebelum nama variabel hasil untuk merepresentasikan nilai hasil tersebut. Jika digunakan sebelum nama variabel acara atau placeholder (misalnya,
$event), ini mewakili #event > 0.
Contoh aturan ini menampilkan deteksi jika ada lebih dari lima (seperti yang ditentukan di bagian condition) kegagalan login
untuk setiap pengguna dalam jangka waktu 10 menit (seperti yang ditentukan di bagian match):
rule failed_logins
{
meta:
author = "Security Team"
description = "Detects multiple failed user logins within 10-minute windows."
severity = "HIGH"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "FAIL"
$user = $e.target.user.userid
match:
$user over 10m
outcome:
$failed_login_count = count($e.metadata.id)
$first_fail_time = min($e.metadata.event_timestamp.seconds)
condition:
#e >= 5
}
Kondisi terbatas dan tidak terbatas
Anda dapat menggunakan kondisi terbatas atau tidak terbatas dalam kueri:
Kondisi terikat memaksa variabel peristiwa terkait ada, yang berarti setidaknya satu kemunculan peristiwa harus muncul dalam deteksi. Berikut adalah kondisi yang dibatasi:
$var // equivalent to #var > 0#var > n // where n >= 0#var >= m // where m > 0Kondisi tanpa batas dapat digunakan untuk mendeteksi tidak adanya peristiwa selama jangka waktu tertentu; misalnya, peristiwa ancaman tanpa peristiwa mitigasi dalam jangka waktu 10 menit. Kondisi tanpa batas memungkinkan variabel peristiwa terkait tidak ada (kueri tidak ada), yang berarti kemungkinan tidak ada kemunculan peristiwa dalam deteksi dan setiap referensi ke kolom pada variabel peristiwa menghasilkan nilai nol.
Berikut adalah kondisi tanpa batas:
!$var // equivalent to #var = 0#var >= 0#var < n // where n > 0#var <= m // where m >= 0
Persyaratan untuk kueri tidak ada
Agar kueri tidak ada dapat dikompilasi, kueri tersebut harus memenuhi persyaratan berikut:
- Setidaknya satu peristiwa UDM harus memiliki kondisi terikat (yaitu, setidaknya satu peristiwa UDM harus ada).
- Jika memiliki kondisi yang tidak terikat, placeholder harus dikaitkan dengan setidaknya satu peristiwa UDM terikat.
- Jika entitas memiliki kondisi yang tidak terikat, entitas tersebut harus dikaitkan dengan setidaknya satu peristiwa UDM yang terikat.
Contoh: kueri tidak ada
Pertimbangkan kueri berikut dengan bagian kondisi yang dihilangkan:
rule NonexistenceExample {
meta:
author = "Google Security"
description = "Example: non-existence query."
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 query.
// 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:
//Add valid condition
}Bagian kondisi yang valid
Berikut adalah contoh yang valid untuk bagian kondisi:
$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$e2tidak terikat dan diizinkan karena terkait dengan$u1, yang terikat. Jika$e2tidak 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.
$ipditetapkan ke$u1dan$u2, serta#ip = 0adalah kondisi yang tidak terikat. Namun, kondisi terikat lebih kuat daripada kondisi tidak terikat. Karena$portditetapkan ke$u1dan#port > 50adalah kondisi yang dibatasi,$u1masih dibatasi.
Bagian kondisi tidak valid
Berikut adalah contoh yang tidak valid untuk bagian kondisi:
$u1 and $e1- Setiap peristiwa dan entitas UDM yang muncul di bagian
eventsharus muncul di bagiancondition(atau memiliki placeholder yang ditetapkan untuknya yang muncul di bagiancondition). $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
ortidak didukung dengan kondisi tanpa batas. ($u1 or $u2) and $e1 and $e2- Kata kunci
ortidak didukung di antara variabel peristiwa yang berbeda. not $u1 and $u2 and $e1 and $e2- Kata kunci
nottidak diizinkan untuk kondisi acara dan placeholder. #port < 50 and #ip = 0- Meskipun placeholder mereferensikan semua peristiwa dan entitas UDM, setiap kondisi terkait tidak terikat. Artinya, tidak ada peristiwa UDM yang dibatasi, sehingga aturan gagal dikompilasi.
Kondisi hasil
Anda dapat menyertakan kondisi untuk variabel hasil di bagian condition, yang digabungkan dengan kata kunci and atau or, atau diawali dengan kata kunci not.
Kondisional hasil ditentukan secara berbeda, bergantung pada jenis variabel hasil:
integer: bandingkan dengan literal bilangan bulat menggunakan operator
=, >, >=, <, <=, !=Misalnya:$risk_score > 10float: bandingkan dengan literal float menggunakan operator
=, >, >=, <, <=, !=Misalnya:$risk_score <= 5.5string: bandingkan dengan literal string dengan
=atau!=Misalnya:$severity = "HIGH"daftar bilangan bulat atau array: tentukan kondisi menggunakan fungsi
arrays.containsMisalnya:arrays.contains($event_ids, "id_1234")
Jika Anda menentukan kondisi hasil dalam kueri yang memiliki bagian match, kueri tersebut diklasifikasikan sebagai kueri multi-peristiwa untuk kuota kueri. Lihat Sintaksis kecocokan untuk mengetahui informasi selengkapnya tentang klasifikasi peristiwa tunggal dan ganda.
Pembatasan
Hindari penggunaan variabel
matchdi bagiancondition. Ini adalah kesalahan semantik karena peristiwa dikelompokkan berdasarkan nilai variabelmatch.Hindari hanya menentukan kondisi tanpa batas pada semua variabel
eventyang ditetapkan ke variabelmatch. Ini adalah error semantik. Agar nilai variabelmatchditampilkan, setidaknya harus ada satu peristiwa yang berisi nilai tersebut.Jika menggunakan jendela geser, variabel peristiwa titik tumpu harus disertakan dalam setidaknya satu kondisi terikat.
Apa langkah selanjutnya?
- Sintaksis bagian opsi
- Menggunakan atau di bagian kondisi
- Menggunakan sintaksis N OF dengan variabel peristiwa
Informasi tambahan
- Ekspresi, operator, dan konstruksi yang digunakan di YARA-L 2.0
- Fungsi di YARA-L 2.0
- Membangun aturan deteksi komposit
- Contoh: Kueri YARA-L 2.0
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.