
Тюнинг и рефакторинг Google Chronicle Curated Detections для устранения усталости от алертов и исправления логических ошибок/багов.
Этот репозиторий описывает архитектурные недостатки проектирования, логические несоответствия и стратегии настройки для встроенных курируемых детектов Google SecOps (Chronicle).
Хотя Google Threat Intelligence (GTIG) обеспечивает исключительное концептуальное покрытие угроз (например, отслеживание кампаний APT29/BRICKSTORM), сырые реализации YARA-L для курируемых правил иногда страдают от недочётов реализации, таких как противоречия в логике группировки и захардкоженные пороговые переменные. В реальных корпоративных средах это часто приводит к массовой усталости от алертов.
Этот проект анализирует, почему встроенные правила ломаются или заваливают SOC алертами, и публикует оптимизированные Custom Rules и патчи для решения этих проблем.
Google выпустила набор правил для обнаружения массовой эксфильтрации электронной почты из Microsoft 365 Exchange Online скомпрометированными субъектами службы (Service Principals) (методы, активно используемые APT29/Midnight Blizzard).
Затронутые курируемые правила:
O365 Mailbox Access by Service Principal with Multiple User AgentsO365 Multiple Mailboxes Accessed by Service PrincipalO365 Mailbox Access by Service Principal from Multiple ASNsO365 Multiple Mailboxes Accessed via Microsoft Graph APIЭтот набор правил содержит системные логические расхождения между заявленной целью и реализацией на YARA-L, вероятно, из-за повторного использования кода в рамках пакета правил. Правила не позволяют корректно различать автоматизированные Service Principals и обычную человеческую активность, в результате чего алерты срабатывают на штатное поведение сотрудников.
Несмотря на то, что в описании правила явно указано: «Обнаруживает Service Principal с одним идентификатором сессии O365...», секция match YARA-L в правиле «Multiple User Agents» группирует по $application_id, а не по идентификатору сессии ($session_id). Это полностью противоречит заявленной цели правила, объединяя несвязанные человеческие входы в систему за 3-часовое окно только потому, что они используют одно и то же приложение.
Правила отслеживают аномальные паттерны поведения (смену IP, ASN или User-Agent), привязанные к конкретному ClientAppId. Хотя Google включает регулярное выражение исключений для нескольких нативных приложений Microsoft, они необъяснимо пропустили самый распространённый человеческий мобильный клиент — Microsoft Outlook Mobile App (27922004-5251-4030-b22d-91ecd9a37ea4).
Multiple ASNs и Multiple IPs. Разные сотрудники, использующие iOS и Android для проверки одного и того же общего ящика отдела, вызывают алерт Multiple User Agents.Для идентификации фоновых сервисных учётных записей логика Google опирается на условие:
$e.principal.user.userid != $e.target.user.userid
[email protected]). Этот недостаток проектирования создаёт огромный шум на обычном операционном человеческом трафике.Чтобы исправить эти недостатки проектирования, у вас есть два варианта в зависимости от ваших операционных потребностей:
Вариант 1: Встроенные исключения SIEM (быстрое исправление)
Вам не обязательно отключать правила или писать собственный код. Вы можете просто создать исключение (Exclusion) непосредственно в интерфейсе SIEM Google SecOps. Просто добавьте исключение, нацеленное на ClientAppId для Outlook Mobile (27922004-5251-4030-b22d-91ecd9a37ea4), а также для ваших авторизованных резервных приложений (например, Keepit). Это немедленно остановит поток ложных срабатываний, сохранив при этом активными курируемые правила Google.
Вариант 2: Развертывание Custom Rules (архитектурное исправление)
Если вы хотите полностью исправить глубинные недостатки логики группировки (например, несоответствие $application_id), вам необходимо отключить курируемые детекты и развернуть Custom Rules. Исправления включают:
27922004-...) в белый список.match для корректной агрегации по сессии.rule custom_ttp_o365_mailbox_access_by_service_principal_with_multiple_uas {
meta:
rule_name = "[CUSTOM] O365 Mailbox Access by Service Principal with Multiple User Agents"
description = "Detects a Service Principal with a single O365 session ID accessing O365 mailboxes with multiple user agents. Tuned to fix grouping logic and exclude Outlook Mobile (Public Client) human traffic."
severity = "Low"
tactic = "TA0009"
technique = "T1114.002"
events:
$e.metadata.log_type = "OFFICE_365"
$e.metadata.product_event_type = "MailItemsAccessed" nocase
$e.target.application = "Exchange"
$e.security_result.detection_fields["RecordType"] = /^(2|50)$/
// Extract actual Session ID and App ID
$session_id = $e.network.session_id
$application_id = $e.additional.fields["ClientAppId"]
$e.principal.user.userid !=$e.target.user.userid
(
$e.network.http.user_agent = /AppId/ nocase or $e.additional.fields["ClientAppId"] = /./
)
// EXCLUSIONS: Added Outlook Mobile + Standard Google Exclusions
$e.additional.fields["ClientAppId"] != /^(27922004-5251-4030-b22d-91ecd9a37ea4|bea75f7a-2505-46e8-9bf6-d3f7da9c9da7|b52893c8-bc2e-47fc-918b-77022b299bbc|...)$/ nocase
match:
// Group by both App AND Session to isolate the specific token lifecycle
$application_id,$session_id over 3h
outcome:
$vendor_name = "Microsoft"
$product_name = "Office 365"
$source_ua_dc = count_distinct($e.network.http.user_agent)
$client_app_id = array_distinct($e.additional.fields["ClientAppId"])
condition:
// Triggers if the SAME session rotates 2+ User Agents
$e and $source_ua_dc >= 2
}
(Та же логика, но в исключениях обязательно добавьте в белый список ваши авторизованные резервные решения, такие как Keepit (a7cd46df...), наряду с Outlook Mobile).
(В отличие от правила User Agents, в этом правиле Google действительно удалось корректно сгруппировать по $session_id. Однако в нём по-прежнему отсутствует исключение для Outlook Mobile. Примените ту же логику исключений, что и выше, сохранив условие $source_asn_dc >= 2).
(Та же логика. Убедитесь, что вы добавили авторизованные резервные приложения, такие как Keepit (a7cd46df...), в регулярное выражение исключений в конце блока events).
Правило: Anomalous Auth Attempts Total by Principal Hostname and Target User ID
(Примечание: UEBA означает «User and Entity Behavior Analytics» (аналитика поведения пользователей и сущностей). Эти правила не используют статические сигнатуры, а опираются на математические алгоритмы для построения базовой линии «нормального» поведения и оповещают о статистических отклонениях).
Это правило UEBA пытается обнаруживать аномальные всплески аутентификации, вычисляя историческое среднее и стандартные отклонения за 30 дней.
$num_stddevs_away = max(2) в начале блока outcome. Однако в вычислении $historical_threshold разработчик Google захардкодил значение 2 вместо использования переменной. Эта программная ошибка не позволяет аналитикам легко изменять чувствительность через интерфейс или наследуемые переменные без полного клонирования и переписывания логики YARA-L.Реальное тестирование показывает, что простое изменение статистических порогов (например, повышение $num_stddevs_away до 3 или 4, снижение $coefficient_of_variation_threshold с 0.1 до 0.05 или увеличение $observation_threshold до 15) недостаточно: оно снижает количество недельных алертов с 710 до 111, что по-прежнему остаётся чрезмерно шумным для команды аналитиков.
Broad для «Failed Authentications by Device» и полагайтесь строго на канал алертинга Precise. Это структурное смягчение — единственный эффективный способ остановить поток алертов.2 внутри $historical_threshold, чтобы оно соответствовало вашей пользовательской переменной $num_stddevs_away, и примените более строгие базовые коэффициенты.Отказ от ответственности: Эти настройки основаны на реальном опыте реагирования на инциденты и инженерной работы с SIEM. Всегда тестируйте правила YARA-L в вашем конкретном окружении перед развёртыванием в production.