תחביר של קטע תנאים
במסמך הזה מוסבר איך אפשר להשתמש בקטע condition של שאילתת YARA-L 2.0.
ההשפעה של הקטע condition תלויה בשאלה אם אתם מריצים שאילתה אד-הוק או פורסים כלל מתמשך, באופן הבא:
- בחיפוש ובמרכזי בקרה: פועל כמסנן אחרי, ומחזיר ומציג רק רשומות שעומדות בתנאים של הביטויים שצוינו.
- כללי זיהוי (חובה): משמשים כלוגיקת הטריגר. התראה מופעלת רק אם התנאים מתקיימים (
true) בחלוןmatchנתון.
משתמשים בקטע condition כדי להגדיר ביטויים שמסננים אירועים ומשתני placeholder. כשמשתמשים בו בחיפוש או בשאילתת לוח בקרה, מוצגות רק תוצאות שעומדות בתנאים. כשמשתמשים בו בכלל זיהוי, התנאים צריכים להתקיים כדי להפעיל התראה.
בקטע condition אפשר להשתמש באופרטורים בוליאניים, באופרטורים להשוואה ובתוצאות של משתני outcome כדי לקבוע אם השאילתה צריכה להפעיל את הטריגר.
הגדרת הקטע condition
מגדירים את ביטויי התנאים לאירועים ולמשתני placeholder בקטע condition. אפשר לציין match תנאים למשתנים מהקטע events, ואם רוצים, אפשר להשתמש במילת המפתח and כדי לכלול לוגיקה שמבוססת על הקטע outcome. פרטים נוספים זמינים במאמר בנושא תחביר של קטע התוצאה.
אפשר לחבר בין הביטויים באמצעות מילות המפתח and או or:
משתמשים ב-
andבין התנאים.משתמשים ב-
orרק כשהשאילתה מכילה משתנה אירוע יחיד.
משתמשים בתו # בקטע condition לפני שם של אירוע או של משתנה placeholder כדי לייצג את מספר האירועים או הערכים הייחודיים שעומדים בכל התנאים בקטע events. לדוגמה:
#c > 1 פירושו שהמשתנה c צריך להופיע יותר מפעם אחת.
משתמשים בתו $ בקטע condition לפני כל שם של משתנה תוצאה כדי לייצג את הערך של התוצאה הזו. אם משתמשים בו לפני אירוע או שם של משתנה placeholder (לדוגמה, $event), הוא מייצג את #event > 0.
בדוגמה הזו של כלל, המערכת מחזירה זיהוי אם יש יותר מחמש (כפי שמוגדר בקטע condition) התחברויות שנכשלו לכל משתמש בחלון של 10 דקות (כפי שמוגדר בקטע 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
}
תנאים מוגבלים ולא מוגבלים
אפשר להשתמש בתנאים מוגבלים או לא מוגבלים בשאילתה:
תנאים מוגבלים מחייבים את קיומו של משתנה האירוע המשויך, כלומר לפחות מופע אחד של האירוע חייב להופיע בזיהוי. אלה תנאים מוגבלים:
$var // equivalent to #var > 0#var > n // where n >= 0#var >= m // where m > 0אפשר להשתמש בתנאים ללא הגבלה כדי לזהות היעדר של אירוע במשך תקופה מסוימת. לדוגמה, אירוע איום ללא אירוע של צמצום סיכונים בחלון של 10 דקות. תנאים לא מוגבלים מאפשרים למשתנה האירוע המשויך לא להתקיים (שאילתות של אי-קיום), כלומר יכול להיות שלא יופיע מופע של האירוע בזיהוי, וכל הפניה לשדות במשתנה האירוע תחזיר ערך אפס.
אלה תנאים לא מוגבלים:
!$var // equivalent to #var = 0#var >= 0#var < n // where n > 0#var <= m // where m >= 0
דרישות לשאילתות לגבי אי-קיום
כדי ששאילתת אי-קיום תעבור קומפילציה, היא צריכה לעמוד בדרישות הבאות:
- צריך שיהיה לפחות אירוע אחד ב-UDM עם תנאי מוגבל (כלומר, צריך שיהיה לפחות אירוע אחד ב-UDM).
- אם למחזיק המקום יש תנאי לא מוגבל, הוא חייב להיות משויך לפחות לאירוע אחד מוגבל של UDM.
- אם לישות יש תנאי לא מוגבל, היא צריכה להיות משויכת לפחות לאירוע אחד מוגבל של UDM.
דוגמה: שאילתה לגבי אי-קיום
נבחן את השאילתה הבאה שבה הושמט קטע התנאים:
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
}קטע תנאים תקין
דוגמאות תקינות לקטע של התנאי:
$u1 and !$u2 and $e1 and $e2- כל האירועים והישויות של UDM מופיעים בקטע של התנאי.
- לפחות אירוע אחד ב-UDM מוגבל.
$u1 and !$u2 and $e1 and !$e2-
$e2הוא לא מוגבל ומותר כי הוא משויך ל-$u1, שהוא מוגבל. אם$e2לא היה משויך ל-$u1, הוא היה לא תקין. #port > 50 and #ip = 0- אין אירועים וישויות של UDM בקטע של התנאי, אבל ה-placeholders שמופיעים מכסים את כל האירועים והישויות של UDM.
- התנאי
$ipמוקצה גם ל-$u1וגם ל-$u2, והתנאי#ip = 0הוא תנאי לא מוגבל. עם זאת, תנאים מוגבלים חזקים יותר מתנאים לא מוגבלים. מכיוון שהתנאי$portמוקצה ל-$u1והתנאי#port > 50הוא תנאי מוגבל,$u1עדיין מוגבל.
סעיף התנאים לא תקין
דוגמאות לא חוקיות לקטע של התנאי:
$u1 and $e1- כל אירוע וכל ישות של UDM שמופיעים בקטע
eventsחייבים להופיע בקטעcondition(או שיוקצה להם placeholder שמופיע בקטעcondition). $u1, $u2, $e1, $u2, #port > 50- אסור להשתמש בפסיקים כמפרידים בין תנאים.
!$u1 and !$u2 and $e1 and $e2- ההגדרה הזו לא עומדת בדרישה הראשונה, שלפיה צריך להיות לפחות אירוע אחד ב-UDM עם גבולות.
($u1 or #port < 50) and $u2 and $e1 and $e2orמילת המפתח לא אפשרי עם תנאים לא מוגבלים.($u1 or $u2) and $e1 and $e2- אין תמיכה במילת המפתח
orבין משתני אירועים שונים. not $u1 and $u2 and $e1 and $e2- אסור להשתמש במילת המפתח
notבתנאים של אירועים ושל פלייסולדרים. #port < 50 and #ip = 0- למרות שה-placeholders מתייחסים לכל האירועים והישויות ב-UDM, כל תנאי משויך הוא בלתי מוגבל. המשמעות היא שאף אחד מהאירועים ב-UDM לא מוגבל, ולכן לא ניתן לקמפל את הכלל.
תנאים להשגת תוצאה
אפשר לכלול תנאים למשתני התוצאה בקטע condition, בשילוב עם מילת המפתח and או or, או לפני מילת המפתח not.
התנאים של התוצאה מוגדרים בצורה שונה בהתאם לסוג משתנה התוצאה:
integer: השוואה לליטרל של מספר שלם באמצעות האופרטורים
=, >, >=, <, <=, !=לדוגמה:$risk_score > 10float: השוואה לליטרל מסוג float באמצעות האופרטורים
=, >, >=, <, <=, !=לדוגמה:$risk_score <= 5.5string: השוואה למחרוזת מילולית באמצעות
=או!=לדוגמה:$severity = "HIGH"רשימה של מספרים שלמים או מערכים: מציינים תנאי באמצעות הפונקציה
arrays.contains. לדוגמה:arrays.contains($event_ids, "id_1234")
אם מציינים תנאי לתוצאה בשאילתה שיש לה קטע match, השאילתה מסווגת כשאילתה של כמה אירועים לצורך מכסת השאילתות. מידע נוסף על סיווג של אירוע אחד או כמה אירועים זמין במאמר תחביר של התאמה.
הגבלות
מומלץ להימנע משימוש במשתנה
matchבקטעcondition. זו שגיאה סמנטית כי האירועים מקובצים לפי הערך של המשתנהmatch.אל תציינו רק תנאים לא מוגבלים בכל המשתנים
eventשהמשתנהmatchמוקצה להם. זו שגיאה סמנטית. כדי שיוחזר ערך משתנהmatch, צריך להתקיים לפחות אירוע אחד שמכיל את הערך.אם משתמשים בחלון נע, משתנה אירוע הציר חייב להיות מעורב לפחות בתנאי אחד עם גבולות.
מה השלב הבא?
מידע נוסף
- ביטויים, אופרטורים ומבנים שמשמשים ב-YARA-L 2.0
- פונקציות ב-YARA-L 2.0
- יצירת כללי זיהוי מורכבים
- דוגמאות: שאילתות YARA-L 2.0
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.