תחביר של קטע התנאי
במסמך הזה מוסבר איך אפשר להשתמש בקטע 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 $e2- מילת המפתח
orלא נתמכת בתנאים לא מוגבלים. ($u1 or $u2) and $e1 and $e2- אין תמיכה במילת המפתח
orבין משתני אירועים שונים. not $u1 and $u2 and $e1 and $e2- אסור להשתמש במילת המפתח
notבתנאים של אירועים ופלייס הולדרים. #port < 50 and #ip = 0- למרות שה-placeholder מפנה לכל האירועים והישויות של UDM, כל תנאי משויך הוא בלתי מוגבל. המשמעות היא שאף אחד מהאירועים ב-UDM לא מוגבל, ולכן הכלל לא מצליח להתקמפל.
תנאים להערכת תוצאות
אפשר לכלול תנאים למשתני התוצאה בקטע condition, בשילוב עם מילת המפתח and או or, או לפני מילת המפתח not.
התנאים של התוצאה מוגדרים בצורה שונה בהתאם לסוג משתנה התוצאה:
מספר שלם: השוואה לליטרל של מספר שלם באמצעות האופרטורים
=, >, >=, <, <=, !=לדוגמה:$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.