תחביר של קטע האירועים
הקטע events חייב להופיע מיד אחרי הקטע meta בכלל. הוא מגדיר אילו אירועים השאילתה צריכה לבדוק ואילו מאפיינים ספציפיים האירועים האלה צריכים לכלול כדי להיחשב רלוונטיים לזיהוי פוטנציאלי.
הקטע events הוא חובה בכללים, בחיפושים ובמרכזי הבקרה.
בקטע events מציינים את הפרדיקטים הבאים:
- הצהרות על משתנים
- מסננים של משתני אירועים
- צירופים של משתני אירוע
הגדרת הקטע של האירועים
כללים ושאילתות שמתמקדים רק בסוג אחד של אירוע יכולים לכלול משתנה אירוע יחיד, כמו:
events:
$e.metadata.event_type = "USER_LOGIN" // 'e' is the common convention for a single event
כללים ושאילתות שדורשים קורלציה בין שני סוגים שונים או יותר של אירועים (למשל, התחברות של משתמש ואחריה שינוי בקובץ), דורשים משתנה לכל סוג אירוע:
events:
$login.metadata.event_type = "USER_LOGIN" // Event 1: User Login
$file_op.metadata.event_type = "FILE_MODIFICATION" // Event 2: File Modification
אחרי שמצהירים על משתנה מסוג 'אירוע', משתמשים בו כקידומת כדי לגשת לשדות ספציפיים מסוג האירוע הזה. לדוגמה, בקטע event הבא מסננים אירועים של ניסיונות כניסה שנכשלו מ-Okta:
events:
$e.metadata.vendor_name = "Okta"
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "FAIL"
הצהרות על משתנים
כדי להצהיר על משתנים, משתמשים בתחביר הבא:
<EVENT_FIELD> = <VAR><VAR> = <EVENT_FIELD>
שתי הדוגמאות הבאות שקולות:
$e.source.hostname = $hostname$userid = $e.principal.user.userid
ההצהרה הזו מציינת שהמשתנה הזה מייצג את השדה שצוין עבור משתנה האירוע. כששדה האירוע הוא שדה חוזר, המשתנה match יכול לייצג כל ערך במערך. אפשר גם להקצות כמה שדות של אירועים למשתנה יחיד של התאמה או של placeholder. זה נקרא תנאי הצטרפות טרנזיטיבי.
לדוגמה:
$e1.source.ip = $ip$e2.target.ip = $ip
שווה ל:
$e1.source.ip = $ip$e1.source.ip = $e2.target.ip
כשמשתמשים במשתנה, צריך להצהיר עליו באמצעות הצהרת משתנה. אם משתמשים במשתנה בלי להצהיר עליו, תופעל שגיאת קומפילציה.
מידע נוסף על משתנים זמין במאמר ביטויים, אופרטורים ומבנים אחרים.
מסננים של משתני אירועים
ביטוי בוליאני שפועל על משתנה אירוע יחיד נחשב למסנן.
צירופים של משתני אירוע
כל משתני האירועים שמשמשים בכלל חייבים להיות משולבים עם כל משתני האירועים האחרים באחת מהדרכים הבאות:
באמצעות השוואה ישירה בין שדות אירועים של שני משתני האירועים שצורפו, למשל:
$e1.field = $e2.field. הביטוי לא יכול לכלול פעולות אריתמטיות (כמו $\text{+, -, *, /}$).באופן עקיף באמצעות צירוף טרנזיטיבי שכולל רק שדה אירוע (הגדרה של 'צירוף טרנזיטיבי' מופיעה בהצהרת משתנה). הביטוי לא יכול לכלול פעולות אריתמטיות.
לדוגמה, אם משתמשים ב-$e1, ב-$e2 וב-$e3 בכלל, הקטעים הבאים של events הם תקינים:
events:
$e1.principal.hostname = $e2.src.hostname // $e1 joins with $e2
$e2.principal.ip = $e3.src.ip // $e2 joins with $e3
events:
// $e1 joins with $e2 using function to event comparison
re.capture($e1.src.hostname, ".*") = $e2.target.hostname
events:
// $e1 joins with $e2 using an `or` expression
$e1.principal.hostname = $e2.src.hostname
or $e1.principal.hostname = $e2.target.hostname
or $e1.principal.hostname = $e2.principal.hostname
events:
// all of $e1, $e2 and $e3 are transitively joined using the placeholder variable $ip
$e1.src.ip = $ip
$e2.target.ip = $ip
$e3.about.ip = $ip
events:
// $e1 and $e2 are transitively joined using function to event comparison
re.capture($e2.principal.application, ".*") = $app
$e1.principal.hostname = $app
עם זאת, בדוגמאות הבאות מוצגים קטעים לא תקינים של events.
events:
// Event to arithmetic comparison is an invalid join condition for $e1 and $e2.
$e1.principal.port = $e2.src.port + 1
events:
$e1.src.ip = $ip
$e2.target.ip = $ip
$e3.about.ip = "192.1.2.0" //$e3 is not joined with $e1 or $e2.
events:
$e1.src.port = $port
// Arithmetic to placeholder comparison is an invalid transitive join condition.
$e2.principal.port + 800 = $port
המאמרים הבאים
מידע נוסף
- ביטויים, אופרטורים ומבנים שמשמשים ב-YARA-L 2.0
- פונקציות ב-YARA-L 2.0
- יצירת כללי זיהוי מורכבים
- דוגמאות: שאילתות YARA-L 2.0
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.