כללי ברירת המחדל לזיהוי
שפת הכללים של YARA-L
YARA-L היא שפת כללי זיהוי שפותחה על ידי Google. המטרה של YARA-L היא להתרחק מזיהויים כשאילתות נתונים בלבד, ולעבור לחקירות בפועל שמבוססות על אירועים. השפה YARA-L נגזרת מהשפה YARA, שנמצאת בשימוש נפוץ בניתוח של תוכנות זדוניות. האות L מייצגת יומנים. YARA-L מאפשרת לכם לנצל את כל המידע ממקורות שונים בזיהויים, ולקשר בין האירועים האלה להתראות שניתן לפעול לפיהן. מידע נוסף מופיע במאמר סקירה כללית על שפת YARA-L 2.0.
כללי זיהוי לדוגמה ב-Google Security Operations
כדי לעזור לכם להטמיע מהר יותר את מנוע הזיהוי של Google SecOps, יש מאגר ב-GitHub עם כללים לדוגמה. המאגר הזה מכיל כמה קטגוריות שונות של כללי זיהוי, כולל:
- Google Cloud CloudAudit
- Google Workspace
- אזהרות אינפורמטיביות
- תוכנה זדונית
- MITRE ATT&CK
- כללים של SOC prime
- אירועים חשודים
כל קטגוריה מתבססת על גישה ספציפית לאופן שבו היא מציגה מקורות נתונים, ומציינת באילו אירועים והצהרות התאמה להשתמש.
דוגמאות לכללים ולשינויים
הכלל הבא יוצר משתנה אירוע $e1 שמשמש למעקב אחרי סוג האירוע. משתנה האירוע יכול להיות כל ערך שיש לו משמעות לנתונים שנבדקים. השדה ב-UDM שנבדק באירוע הזה הוא
metadata.eventype, ולכן הגיוני פשוט לקרוא לו e1. השורות הבאות
מחפשות מקרים ספציפיים של התאמות לביטויים רגולריים ב-e1. התנאי שיוצר זיהוי ב-Google SecOps הוא כל פעם שהאירוע $e1 מתרחש. לצורך כוונון, מסופק תנאי not כדי להחריג נתיבים מסוימים שאינם זדוניים לארגומנט של שורת הפקודה. אפשר להוסיף לכלל הזה עוד not תנאים
אם מזהים תוצאות חיוביות כוזבות שחוזרות לעיתים קרובות מנתיבי קבצים ידועים אחרים.
rule suspicious_unusual_location_svchost_execution
{
meta:
author = "Google Cloud Security"
description = "Windows 'svchost' executed from an unusual location"
yara_version = "YL2.0"
rule_version = "1.0"
events:
$e1.metadata.event_type = "PROCESS_LAUNCH"
re.regex($e1.principal.process.command_line, `\bsvchost(\.exe)?\b`) nocase
not re.regex($e1.principal.process.command_line, `\\Windows\\System32\\`) nocase
condition:
$e1
}
ציון של יותר ממשתנה אירוע אחד
בעזרת YARA-L אפשר להשתמש ביותר ממשתנה אירוע אחד בכלל. בדוגמה הבאה, הכלל כולל את האירועים $e1 ו-$e2. התנאי מציין את התנאי הלוגי שמפעיל את הזיהוי.
rule ExcludeZeroValues {
meta:
author = "noone@google.com"
events:
$e1.metadata.event_type = "NETWORK_DNS"
$e1.principal.hostname = $hostname
// $e1.principal.user.userid may be empty string.
$e1.principal.user.userid != "Guest"
$e2.metadata.event_type = "NETWORK_HTTP"
$e2.principal.hostname = $hostname
// $e2.target.asset_id cannot be empty string as explicitly specified.
$e2.target.asset_id != ""
match:
// $hostname cannot be empty string.
$hostname over 1h
condition:
$e1 and $e2
}
הקטע 'תוצאת הכללים'
אפשר להשתמש בקטע התוצאה כדי להגדיר משתני אחזקה בתוך זיהוי הכלל, כדי לספק העשרה לצריכה במורד הזרם. לדוגמה, אפשר להוסיף מידע על ניקוד חומרה שמבוסס על נתונים מהאירועים שמנותחים. הזיהוי הבא בוחן שני אירועים כדי לשייך את הערך $hostname. אם הערך $hostnames מתאים לתקופה של 5 דקות, יוקצה ניקוד חומרה. כשמשתמשים בתקופות זמן, מנוע הזיהוי של Google SecOps בודק רק את בלוקי הזמן הנפרדים שציינתם.
rule OutcomeRuleMultiEvent {
meta:
author = "noone@google.com"
events:
$u.udm.principal.hostname = $hostname
$asset_context.graph.entity.hostname = $hostname
$severity = $asset_context.graph.entity.asset.vulnerabilities.severity
match:
$hostname over 5m
outcome:
$risk_score =
max(
100
+ if($hostname = "my-hostname", 100, 50)
+ if($severity = "HIGH", 10)
+ if($severity = "MEDIUM", 5)
+ if($severity = "LOW", 1)
)
$asset_id_list =
array(
if($u.principal.asset_id = "",
"Empty asset id",
$u.principal.asset_id
)
)
$asset_id_distinct_list = array_distinct($u.principal.asset_id)
$asset_id_count = count($u.principal.asset_id)
$asset_id_distinct_count = count_distinct($u.principal.asset_id)
condition:
$u and $asset_context and $risk_score > 50 and not arrays.contains($asset_id_list, "id_1234")
}
סיכום
YARA-L היא שפת זיהוי גמישה שמאפשרת לכם לבדוק אירועי אבטחה ולא רק להחזיר שאילתת נתונים. משתנה האירוע משמש למעקב אחרי הערכים של השדות שבהם נעשה שימוש בקטע התנאים של הכלל. אתם יכולים להשתמש באירוע יחיד, במספר אירועים לאורך זמן, ליצור קורלציה בין מקורות כדי לקבל ערך יחיד (כמו $hostname ממקורות נתונים שונים), ואפילו להשתמש בכלים כמו ביטויים רגולריים כדי לספק התאמות. חשוב להתאים את הכללים לסביבה שלכם. אפשר לעשות זאת על ידי הגדרת החרגות בלוגיקה. אפשר גם להשתמש ברשימות הפניה כדי לקבץ פריטים ואז להפנות לרשימה הזו בכלל. חשוב לזכור שלא צריך לקבל התראה על כל זיהוי ב-Google SecOps. אתם יכולים לעקוב אחרי זיהויים למטרות שונות, ולהגדיר התראות רק על אלה שאתם קובעים שהם הכי קריטיים בסביבה שלכם.
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.