Masalah umum YARA-L 2.0
Dokumen ini ditujukan untuk Detection Engineer yang ingin men-debug logika aturan dan mengoptimalkan eksekusi YARA-L 2.0. Dokumen ini menjelaskan cara menangani perilaku mesin yang tidak standar, seperti pembatalan kolom, perluasan produk Cartesian dalam agregasi, dan konsistensi pengayaan. Dengan mengikuti metode ini, Anda dapat mencegah error logika yang menyebabkan nilai hasil yang meningkat atau deteksi yang terlewatkan.
YARA-L 2.0 menggunakan model eksekusi tertentu yang kolom berulangnya diperluas menjadi baris peristiwa individual selama evaluasi. Karena transformasi ini terjadi di tingkat mesin, mereferensikan beberapa kolom berulang atau melakukan aritmetika pada jenis UDM yang tidak bertanda memerlukan solusi sintaksis tertentu untuk menghindari error kompilator atau kumpulan hasil yang salah. Dokumen ini menguraikan batasan teknis tersebut dan pola logika yang diperlukan untuk menyelesaikannya.
Sebelum memulai
Pastikan akun Anda memiliki hak teknis berikut sebelum menguji atau mengubah aturan YARA-L 2.0:
Peran IAM yang diperlukan
roles/chronicle.viewer(Security Operations Viewer): Untuk melihat aturan yang ada dan metadata deteksi.roles/chronicle.editor(Security Operations Editor): Untuk mengubah logika aturan dan menyimpan perubahan.
Izin yang diperlukan
chronicle.rules.runTest: Diperlukan untuk menjalankan fitur Run Test pada data historis.chronicle.detections.get: Untuk memeriksa output peristiwa yang tidak dibatalkan di dasbor deteksi.
Terminologi utama
- UDM (Unified Data Model): Skema yang dinormalisasi yang digunakan untuk menyusun semua telemetri keamanan yang diserap di seluruh platform.
- Pembatalan: Perluasan tingkat mesin dari satu peristiwa UDM yang berisi kolom berulang (array) menjadi beberapa baris. Setiap baris mewakili elemen unik dari array, yang dapat menyebabkan perkalian baris selama evaluasi aturan.
- T₀ (operasi awal): Eksekusi pertama aturan pada telemetri yang masuk. Hal ini terjadi selama fase "streaming", sering kali sebelum proses pengayaan latar belakang (seperti GeoIP atau ASN true-up) diselesaikan.
Agregasi hasil dengan pembatalan kolom berulang
Saat aturan mereferensikan kolom berulang dalam variabel peristiwa dengan beberapa elemen, setiap elemen akan dibagi menjadi baris peristiwa terpisah.
Misalnya, dua alamat IP di kolom berulang target.ip pada peristiwa $e dibagi menjadi dua instance $e, masing-masing dengan nilai target.ip yang berbeda.
rule outbound_ip_per_app {
meta:
events:
$e.principal.application = $app
match:
$app over 10m
outcome:
$outbound_ip_count = count($e.target.ip) // yields 2.
condition:
$e
}
Catatan peristiwa: Sebelum dan sesudah pembatalan
Tabel di bagian ini menunjukkan cara satu peristiwa yang berisi array alamat IP diubah menjadi dua catatan berbeda.
Sebelum pembatalan
Tabel berikut menunjukkan catatan peristiwa sebelum membatalkan kolom berulang:
| metadata.id | principal.application | target.ip |
|---|---|---|
aaaaaaaaa |
Google SecOps |
[192.0.2.20, 192.0.2.28] |
Setelah pembatalan
Tabel berikut menunjukkan catatan peristiwa setelah membatalkan kolom berulang:
| metadata.id | principal.application | target.ip |
|---|---|---|
aaaaaaaaa |
Google SecOps |
192.0.2.20 |
aaaaaaaaa |
Google SecOps |
192.0.2.28 |
Kolom berulang bertingkat (Cartesian product)
Saat aturan mereferensikan kolom berulang yang bertingkat dalam kolom lain, seperti security_results.action, pembatalan terjadi di kedua tingkat (induk dan turunan) secara bersamaan. Hal ini menghasilkan produk Cartesian dari semua elemen.
Dalam contoh berikut, peristiwa $e dengan dua nilai berulang di security_results dan dua nilai berulang di security_results.actions dibatalkan menjadi empat instance.
rule security_action_per_app {
meta:
events:
$e.principal.application = $app
match:
$app over 10m
outcome:
$security_action_count = count($e.security_results.actions) // yields 4.
condition:
$e
}
Catatan peristiwa sebelum pembatalan bertingkat
Catatan asli menyimpan tindakan dalam struktur array bertingkat.
| metadata.id | principal.application | security_results |
|---|---|---|
aaaaaaaaa |
Google SecOps |
[ { actions: [ ALLOW, FAIL ] }, { actions: [ CHALLENGE, BLOCK ] } ] |
Catatan peristiwa setelah pembatalan bertingkat
Setelah perluasan, setiap tindakan unik menjadi barisnya sendiri, yang dapat menyebabkan jumlah yang tidak terduga dalam agregasi yang tidak berbeda.
| metadata.id | principal.application | security_results.actions |
|---|---|---|
aaaaaaaaa |
Google SecOps |
ALLOW |
aaaaaaaaa |
Google SecOps |
FAIL |
aaaaaaaaa |
Google SecOps |
CHALLENGE |
aaaaaaaaa |
Google SecOps |
BLOCK |
Dampak pada kolom yang tidak terkait
Perilaku pembatalan ini dalam evaluasi aturan dapat menghasilkan agregasi hasil yang tidak terduga saat aturan mereferensikan satu atau beberapa kolom berulang dengan kolom induk yang juga merupakan kolom berulang. Agregasi yang tidak berbeda seperti sum(), array(), dan count() tidak dapat memperhitungkan nilai duplikat pada kolom lain pada peristiwa yang sama yang dihasilkan oleh perilaku pembatalan.
Dalam contoh berikut, peristiwa $e memiliki satu nama host (google.com), tetapi hasilnya (hostnames) diagregasi di atas empat instance yang tidak dibatalkan dari peristiwa $e yang sama, masing-masing dengan nilai principal.hostname duplikat. Hasil ini menghasilkan empat nama host (bukan satu) karena pembatalan nilai berulang pada security_results.actions.
rule security_action_per_app {
meta:
events:
$e.principal.application = $app
match:
$app over 10m
outcome:
$hostnames = array($e.principal.hostname) // yields 4.
$security_action_count = count($e.security_results.action) // yields 4.
condition:
$e
}
Catatan peristiwa sebelum pembatalan dengan kolom yang tidak terkait
Nama host adalah satu nilai, tetapi berada di samping hasil keamanan berulang.
| metadata.id | principal.application | principal.hostname | security_results |
|---|---|---|---|
aaaaaaaaa |
Google SecOps |
google.com |
[ { action: [ ALLOW, FAIL ] }, { action: [ CHALLENGE, BLOCK ] } ] |
Catatan peristiwa setelah pembatalan dengan kolom yang tidak terkait
Nama host kini diduplikasi di empat baris, sehingga fungsi array() mengambilnya empat kali.
| metadata.id | principal.application | principal.hostname | security_results.action |
|---|---|---|---|
aaaaaaaaa |
Google SecOps |
google.com |
ALLOW |
aaaaaaaaa |
Google SecOps |
google.com |
FAIL |
aaaaaaaaa |
Google SecOps |
google.com |
CHALLENGE |
aaaaaaaaa |
Google SecOps |
google.com |
BLOCK |
Solusi untuk perilaku pembatalan
Untuk memastikan nilai hasil Anda akurat saat pembatalan terjadi, gunakan versi berbeda dari agregasi yang dipilih. Fungsi berikut mengabaikan baris duplikat yang dibuat dengan pembatalan:
max()min()array_distinct()count_distinct()
Agregasi hasil dengan beberapa variabel peristiwa
Jika aturan berisi beberapa variabel peristiwa, akan ada item terpisah dalam agregasi untuk setiap kombinasi peristiwa yang disertakan dalam deteksi. Misalnya, jika aturan contoh berikut dijalankan terhadap peristiwa yang tercantum:
events:
$e1.field = $e2.field
$e2.somefield = $ph
match:
$ph over 1h
outcome:
$some_outcome = sum(if($e1.otherfield = "value", 1, 0))
condition:
$e1 and $e2
event1:
// UDM event 1
field="a"
somefield="d"
event2:
// UDM event 2
field="b"
somefield="d"
event3:
// UDM event 3
field="c"
somefield="d"
Jumlah dihitung di setiap kombinasi peristiwa, sehingga Anda dapat menggunakan kedua variabel peristiwa dalam penghitungan nilai hasil. Elemen berikut digunakan dalam penghitungan:
1: $e1 = event1, $e2 = event2
2: $e1 = event1, $e2 = event3
3: $e1 = event2, $e2 = event1
4: $e1 = event2, $e2 = event3
5: $e1 = event3, $e2 = event1
5: $e1 = event3, $e2 = event2
Hal ini menghasilkan jumlah maksimum potensial sebesar 6, meskipun $e2 hanya dapat sesuai dengan 3 peristiwa berbeda.
Hal ini memengaruhi jumlah, hitungan, dan array. Untuk jumlah dan array, penggunaan count_distinct atau array_distinct dapat menyelesaikan masalah, tetapi tidak ada solusi untuk jumlah.
Tanda kurung di awal ekspresi
Memulai ekspresi dengan tanda kurung tidak didukung dan memicu error penguraian di editor aturan.
Sintaksis tidak valid
parsing: error with token: ")"
invalid operator in events predicate
Contoh berikut menghasilkan jenis error ini:
($event.metadata.ingested_timestamp.seconds -
$event.metadata.event_timestamp.seconds) / 3600 > 1
Variasi sintaksis yang valid
Variasi sintaksis berikut menampilkan hasil yang sama, tetapi dengan sintaksis yang valid:
$event.metadata.ingested_timestamp.seconds / 3600 -
$event.metadata.event_timestamp.seconds / 3600 > 1
1 / 3600 * ($event.metadata.ingested_timestamp.seconds -
$event.metadata.event_timestamp.seconds) > 1
1 < ($event.metadata.ingested_timestamp.seconds -
$event.metadata.event_timestamp.seconds) / 3600
Array indeks dalam hasil memerlukan agregasi
Mengindeks array secara langsung dalam bagian outcome untuk kolom berulang tidak diizinkan. Hal ini memerlukan variabel placeholder sementara.
outcome:
$principal_user_dept = $suspicious.principal.user.department[0]
Solusi
Ambil indeks array tertentu ke dalam variabel placeholder dalam bagian events, lalu referensikan placeholder tersebut dalam hasil Anda.
events:
$principal_user_dept = $suspicious.principal.user.department[0]
outcome:
$principal_user_department = $principal_user_dept
Kondisi OR dengan tidak adanya
Jika Anda menerapkan kondisi OR antara dua variabel peristiwa terpisah dan jika aturan cocok dengan tidak adanya, aturan akan berhasil dikompilasi, tetapi dapat menghasilkan deteksi positif palsu.
Misalnya, sintaksis aturan berikut dapat cocok dengan peristiwa yang memiliki $event_a.field = "something" meskipun tidak seharusnya:
events:
not ($event_a.field = "something" **or** $event_b.field = "something")
condition:
$event_a and #event_b >= 0
Solusi
Pisahkan pemeriksaan tidak adanya ke dalam blok individual untuk setiap variabel guna mempertahankan integritas logika.
events:
not ($event_a.field = "something")
not ($event_b.field = "something")
condition:
$event_a and #event_b >= 0
Aritmetika dengan kolom peristiwa yang tidak bertanda
Jika Anda mencoba menggunakan konstanta bilangan bulat dalam operasi aritmetika dengan kolom UDM yang jenisnya adalah bilangan bulat yang tidak bertanda, Anda akan mendapatkan error. Contoh:
events:
$total_bytes = $e.network.received_bytes * 2
Konstanta bilangan bulat standar secara default adalah bilangan bulat bertanda, yang tidak kompatibel dengan kolom UDM yang ditentukan sebagai bilangan bulat yang tidak bertanda, seperti network.received_bytes.
Solusi
Anda dapat melewati error ini dengan memaksa konstanta bilangan bulat berperilaku sebagai float melalui operasi pembagian.
events:
$total_bytes = $e.network.received_bytes * (2/1)
Pengayaan GeoIP dan konsistensi tertunda
Sistem memprioritaskan kecepatan daripada akurasi langsung pada tahap pengayaan awal (Streaming dan Sensitif Latensi), yang dapat menyebabkan data hilang dan potensi positif palsu. Sistem terus memperkaya data di latar belakang, tetapi data mungkin tidak tersedia saat aturan dijalankan. Hal ini merupakan bagian dari proses konsistensi normal.
Untuk mencegah positif palsu yang disebabkan oleh jeda pengayaan, periksa secara eksplisit bahwa kolom tidak kosong sebelum mengevaluasi nilainya.
Misalnya, pertimbangkan peristiwa aturan ini:
$e.principal.ip_geo_artifact.network.asn = "16509" AND
$e.principal.ip_geo_artifact.location.country_or_region = "United Kingdom"
Aturan ini bergantung pada fakta bahwa peristiwa harus memiliki $e.principal.ip_geo_artifact.network.asn = "16509" DAN $e.principal.ip_geo_artifact.location.country_or_region = "United Kingdom" yang merupakan kolom yang diperkaya. Jika pengayaan tidak selesai tepat waktu, aturan akan menghasilkan positif palsu.
Untuk menghindarinya, pemeriksaan yang lebih baik untuk aturan ini adalah:
$e.principal.ip_geo_artifact.network.asn != "" AND
$e.principal.ip_geo_artifact.network.asn = "16509" AND
$e.principal.ip_geo_artifact.location.country_or_region != "" AND
$e.principal.ip_geo_artifact.location.country_or_region = "United Kingdom"
Aturan ini menghilangkan kemungkinan peristiwa dipicu oleh IP dengan ASN 16509, tetapi berlokasi di luar Inggris Raya. Hal ini meningkatkan presisi aturan secara keseluruhan.
Pelajari cara memecahkan masalah jeda pengayaan.
Pemecahan masalah
Bagian ini menguraikan ekspektasi performa dan memberikan perbaikan layanan mandiri untuk masalah umum yang perilaku deteksi langsungnya berbeda dengan hasil pengujian.
Peristiwa yang akan datang
Aturan multi-peristiwa dirancang untuk memproses peristiwa dalam urutan kronologis relatif terhadap penyerapan. Jika Anda menentukan dan mengaktifkan aturan multi-peristiwa, aturan tersebut tidak akan membuat deteksi untuk peristiwa dengan stempel waktu mendatang, misalnya saat event.timestamp memiliki tanggal dan waktu yang ditetapkan setelah ingest.timestamp.
Jeda pengayaan
Google SecOps memprioritaskan kecepatan penyerapan untuk menampilkan pemberitahuan awal secepat mungkin. Namun, proses pengayaan latar belakang, seperti menyelesaikan metadata GeoIP, ASN, atau UDM, mengikuti model konsistensi tertunda.
Operasi awal (T₀)
Mesin langsung dapat mengevaluasi aturan sebelum pengayaan latar belakang selesai. Bergantung pada apakah logika Anda mengandalkan kolom yang diperkaya untuk deteksi atau pengecualian, hal ini dapat menyebabkan perbedaan sementara berikut:
Negatif palsu (jeda deteksi): Ini adalah hasil umum. Jika aturan bergantung pada kolom yang diperkaya untuk dipicu (misalnya,
target.user.department == "Finance"), dan kolom tersebut adalahnull, aturan tidak cocok selama operasi awal.Positif palsu (pengecualian terlewatkan): Jika aturan Anda menggunakan kolom yang diperkaya untuk memfilter aktivitas yang diketahui baik (misalnya,
NOT target.ip_geo_country == "US"), aturan dapat memicu positif palsu karena data "pengecualian" belum diterapkan.
Operasi penyesuaian
Operasi latar belakang ini mengevaluasi ulang data setelah penundaan (misalnya, 45 menit atau 30 jam). "Penyesuaian" ini menyatakan deteksi sebagai berikut:
Deteksi terlambat: Peristiwa yang merupakan "negatif palsu" di T₀ kini menghasilkan deteksi setelah pengayaan diselesaikan.
Koreksi: Positif palsu T₀ tetap ada dalam sistem, tetapi data yang sepenuhnya diperkaya terlihat di penampil UDM untuk triase manual.
Perbedaan pengujian
Alat Run Test beroperasi pada data historis yang telah direkonsiliasi. Karena data sepenuhnya diperkaya pada saat Anda menjalankan pengujian manual, Anda dapat langsung melihat hasil "penyesuaian". Artinya, Anda tidak akan melihat negatif palsu T₀ atau positif palsu berbasis pengecualian yang terjadi selama operasi awal langsung.
Perbaikan error
Gunakan tabel berikut untuk mengatasi perbedaan antara pemberitahuan langsung dan hasil pengujian.
| Masalah | Deskripsi | Perbaikan yang dapat ditindaklanjuti |
|---|---|---|
| Kegagalan pengecualian | Aturan diaktifkan meskipun ada pengecualian (misalnya, != "ASN_123") karena kolomnya null selama operasi awal. |
Tambahkan pemeriksaan tidak null ke bagian peristiwa untuk memastikan data diperkaya sebelum evaluasi, misalnya:$e.principal.ip_geo_artifact.network.asn != ""
|
| Perbandingan langsung dengan kecocokan pengujian | Aturan langsung memicu pemberitahuan, tetapi Run Test pada data yang sama menampilkan "No Results". |
Tambahkan $e.field != "" yang memeriksa semua kolom yang diperkaya (GeoIP, ASN, File Path) untuk menyinkronkan perilaku langsung dan historis. |
| Metadata tidak ada | Deteksi muncul di dasbor dengan kolom GeoIP atau File Path kosong. |
Hal ini diharapkan untuk T0 operasi. Untuk memperbaiki, sertakan pemeriksaan field != "" atau tingkatkan offset operasi pertama dalam jadwal operasi Anda untuk memberikan lebih banyak waktu untuk penyerapan.
|
Validasi dan pengujian
Untuk memverifikasi bahwa aturan menangani pengayaan yang tertunda dengan benar, lakukan hal berikut:
Identifikasi jeda: Temukan deteksi yang Anda yakini sebagai positif palsu. Di kolom Detection Type, periksa ikon
<span class="material-icons">lightbulb</span>. Pemberitahuan tanpa ikon ini berasal dari operasi awal yang jeda pengayaannya paling umum.Perbarui logika aturan: Tambahkan pemeriksaan
field != ""untuk semua titik data yang diperkaya yang digunakan dalam logika Anda.
Contoh (jalur file):
$e.target.process.parent_process.file.full_path != ""Uji dan verifikasi:
- Gunakan fitur Run Test untuk memastikan logika Anda masih cocok dengan data historis yang diinginkan.
- Verifikasi bahwa aturan kini hanya dipicu (atau dikecualikan dengan benar) selama operasi penyesuaian setelah kolom pengayaan diisi.
Untuk mengetahui detail selengkapnya, lihat Mengelola jadwal operasi aturan dan Mengonfigurasi jadwal yang disesuaikan untuk aturan.
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.