Présentation du flux de fusion Applied Threat Intelligence
Le flux d'indicateurs Mandiant Fusion est un ensemble d'indicateurs de compromission (IOC), y compris des hachages, des adresses IP, des domaines et des URL, associés à des acteurs de la menace connus, des souches de logiciels malveillants, des campagnes actives et des rapports d'informations finalisés. Pour maximiser la valeur, le flux inclut également des indicateurs de compromission que Mandiant Intelligence a soigneusement vérifiés et validés à partir de flux Open Source, ce qui garantit une grande précision. Le processus de sélection de Mandiant comprend les étapes suivantes.
Réponse aux incidents de première ligne: les analystes Mandiant acquièrent des connaissances directes sur les outils et les techniques des pirates informatiques lorsqu'ils enquêtent sur les violations.
Recherche sur les menaces: des équipes dédiées suivent les acteurs des menaces, analysent les logiciels malveillants et identifient les infrastructures d'attaque émergentes.
Contextualisation: les IoC sont mappés à des menaces et des campagnes spécifiques, ce qui permet de comprendre et de hiérarchiser les incidents.
Le flux Breach Analytics s'appuie sur Fusion et ajoute des indicateurs associés aux nouvelles violations émergentes que Mandiant étudie activement. Il fournit des insights en temps réel sur les dernières tendances en matière d'attaques. Les règles YARA-L peuvent utiliser les informations contextuelles du flux de fusion de l'intelligence des menaces appliquée pour améliorer les règles de correspondance d'indicateurs simples. Il inclut les groupes de menaces associés, la présence d'un indicateur dans un environnement compromis ou le score de confiance automatisé de Mandiant sur la malveillance.
Écrire des règles YARA-L avec le flux Fusion
Le processus d'écriture de règles YARA-L à l'aide du flux Fusion est semblable à celui d'écriture de règles YARA-L avec d'autres sources d'entités de contexte. Pour savoir comment écrire ce type de règle YARA-L, consultez Créer des analyses contextuelles.
Section "Événements et correspondances"
Pour écrire une règle, filtrez le graphique de l'entité de contexte sélectionnée.
Dans ce cas, il s'agit d'un flux Fusion. Filtrez ensuite sur un type d'indicateur spécifique. Par exemple, FILE
. Consultez l'exemple suivant.
events:
$context_graph.graph.metadata.product_name = "MANDIANT_FUSION_IOC"
$context_graph.graph.metadata.vendor_name = "MANDIANT_FUSION_IOC"
$context_graph.graph.metadata.source_type = "GLOBAL_CONTEXT"
$context_graph.graph.metadata.entity_type = "FILE"
Comme pour les règles YARA-L qui n'utilisent pas d'entités de contexte, vous pouvez ajouter d'autres conditions de l'événement ou de l'entité de contexte dans la section events
. Vous pouvez joindre un champ de l'entité de contexte et du champ d'événement UDM. Dans l'exemple suivant, la variable d'espace réservé ioc
est utilisée pour effectuer une jointure transitive entre l'entité de contexte et l'événement. Cette variable d'espace réservé est ensuite utilisée dans la section match
pour assurer une correspondance dans un délai donné.
$ioc = $context_graph.graph.entity.file.md5
$ioc = $e1.principal.process.file.md5
match:
$ioc over 1h
Pour en savoir plus sur les champs d'entité de contexte pouvant être utilisés dans les règles YARA-L, consultez la section Champs d'entité de contexte du flux Fusion.
Section "Résultat"
Poursuivant l'exemple précédent, la règle de correspondance d'indicateur de base est configurée pour les hachages de fichiers dans les entités de contexte au niveau du champ graph.entity.file.md5
et du champ UDM principal.process.file.md5
.
Cette règle de correspondance simple peut correspondre à un grand nombre d'événements. Il est donc recommandé d'affiner la correspondance des règles sur les entités de contexte qui disposent d'une intelligence particulière qui vous intéresse.
Par exemple, cela peut inclure le score de confiance attribué à l'indicateur par Mandiant, s'il a été détecté dans un environnement piraté ou la famille de logiciels malveillants associée à l'indicateur. Vous pouvez effectuer toutes ces opérations dans la section outcome
de la règle.
outcome:
// Extract the Mandiant Automated Intel confidence score of maliciousness
$confidence_score = max(if($context_graph.graph.metadata.threat.verdict_info.source_provider = "Mandiant Automated Intel", $context_graph.graph.metadata.threat.verdict_info.confidence_score, 0))
// Extract the status of the indicator as seen in a breached environment
$breached = max(if($context_graph.graph.metadata.threat.verdict_info.pwn = true, 1, 0))
// Intermediary outcome variable to combine conditions of intelligence extracted in the previous outcome variables.
// Return 1 if conditions are met, otherwise return 0.
$matched_conditions = if($confidence_score >= 80 AND $breached = 1, 1, 0)
Dans la section outcome
de la règle YARA-L, le score de confiance est extrait à l'aide d'un if statement
encapsulé dans une fonction max
. Cette technique est requise pour les règles à événements multiples. La même technique est utilisée pour extraire la variable pwn
de verdict_info
, qui indique si un indicateur a été détecté dans un environnement piraté, comme identifié par Mandiant.
Ces deux variables de résultat sont ensuite combinées dans une autre variable matched_conditions
, ce qui permet d'utiliser une logique en chaîne dans la section condition
.
Section "Condition"
La section condition
garantit que e1
, context_graph
et matched_conditions
existent et/ou correspondent à la condition spécifiée.
condition:
// Ensure $e1, $context_graph and $matched_conditions conditions are met.
$e1 AND $context_graph AND $matched_conditions = 1
Règle YARA-L complète
À ce stade, la règle est prête à l'emploi et doit se présenter comme suit:
rule fusion_feed_example_principal_process_file_md5 {
meta:
rule_name = "File Hash - Applied Threat Intelligence"
description = "Matches file hashes against the Applied Threat Intelligence Fusion Feed."
events:
// Filter graph
$context_graph.graph.metadata.product_name = "MANDIANT_FUSION_IOC"
$context_graph.graph.metadata.vendor_name = "MANDIANT_FUSION_IOC"
$context_graph.graph.metadata.entity_type = "FILE"
$context_graph.graph.metadata.source_type = "GLOBAL_CONTEXT"
// Do join
$ioc = $context_graph.graph.entity.file.md5
$ioc = $e1.principal.process.file.md5
match:
$ioc over 1h
outcome:
// Extract the Mandiant Automated Intel confidence score of maliciousness
$confidence_score = max(if($context_graph.graph.metadata.threat.verdict_info.source_provider = "Mandiant Automated Intel", $context_graph.graph.metadata.threat.verdict_info.confidence_score, 0))
// Extract the status of the indicator as seen in a breached environment
$breached = max(if($context_graph.graph.metadata.threat.verdict_info.pwn = true, 1, 0))
// Intermediary outcome variable to combine conditions of intelligence extracted in the previous outcome variables.
// Return 1 if conditions are met, otherwise return 0.
$matched_conditions = if($confidence_score >= 80 AND $breached = 1, 1, 0)
condition:
// Ensure $e1, $context_graph and $matched_conditions conditions are met.
$e1 AND $context_graph AND $matched_conditions = 1
}
Champs d'entité de contexte du flux Fusion
Vous pouvez utiliser de nombreux champs du flux d'indicateurs Mandiant Fusion dans les règles. Ces champs sont tous définis dans la liste des champs du modèle de données unifié. Les champs suivants sont pertinents pour hiérarchiser les indicateurs:
Champ d'entité | Valeurs possibles |
---|---|
metadata.threat.associations.type |
MALWARE , THREAT_ACTOR |
metadata.threat.associations.name |
Nom de l'association de menace |
metadata.threat.verdict_info.pwn |
TRUE , FALSE |
metadata.threat.verdict_info.pwn_first_tagged_time.seconds |
Code temporel (en secondes) |
Certains champs comportent des paires clé-valeur qui doivent être utilisées en combinaison pour accéder aux valeurs correctes. Voici un exemple.
Champ d'entité 1 | Valeurs | Champ d'entité 2 | Valeurs |
---|---|---|---|
metadata.threat.verdict_info.source_provider |
Mandiant Global Intel | metadata.threat.verdict_info.global_hits_count |
Integer |
metadata.threat.verdict_info.source_provider |
Mandiant Global Intel | metadata.threat.verdict_info.global_customer_count |
Integer |
metadata.threat.verdict_info.source_provider |
Mandiant Analyst Intel | metadata.threat.verdict_info.confidence_score |
Integer |
metadata.threat.verdict_info.source_provider |
Mandiant Automated Intel | metadata.threat.verdict_info.confidence_score |
Integer |
Dans la section outcome
d'une règle YARA-L, vous pouvez accéder à une valeur désignée par une clé spécifique à l'aide de la commande suivante:
$hit_count = max(if($context_graph.graph.metadata.threat.verdict_info.source_provider = "Mandiant Global Intel", $context_graph.graph.metadata.threat.verdict_info.global_hits_count, 0))
Examiner les correspondances d'entités dans Google Security Operations vous permet d'obtenir une vue complète des données, en révélant des champs supplémentaires qui peuvent être utiles pour évaluer la priorité et le contexte d'une alerte d'indicateur.
Voici un exemple d'entité de contexte de flux Fusion en tant que point de référence initial.
{
"metadata": {
"product_entity_id": "md5--147d19e6-cdae-57bb-b9a1-a8676265fa4c",
"collected_timestamp": {
"seconds": "1695165683",
"nanos": 48000000
},
"vendor_name": "MANDIANT_FUSION_IOC",
"product_name": "MANDIANT_FUSION_IOC",
"product_version": "1710194393",
"entity_type": "FILE",
"creation_timestamp": {
"seconds": "1710201600"
},
"interval": {
"start_time": {
"seconds": "1"
},
"end_time": {
"seconds": "253402300799"
}
},
"threat": [
{
"category_details": [
"A phishing email message or the relevant headers from a phishing email."
],
"severity_details": "HIGH",
"confidence_details": "75",
"risk_score": 75,
"first_discovered_time": {
"seconds": "1683294326"
},
"associations": [
{
"id": "threat-actor--3e5e6bdf-5b4e-5166-84fa-83045e637f23",
"type": "THREAT_ACTOR",
"name": "UNC2633"
},
{
"id": "threat-actor--3e5e6bdf-5b4e-5166-84fa-83045e637f23",
"country_code": [
"unknown"
],
"type": "THREAT_ACTOR",
"name": "UNC2633",
"description": "UNC2633 is a distribution threat cluster that delivers emails containing malicious attachments or links that lead to malware payloads, primarily QAKBOT, but also SNOWCONE.GZIPLOADER (which leads to ICEDID) and MATANBUCHUS. Historically, UNC2633 has distributed ZIP files containing malicious Excel files that download malware payloads. In early 2023, UNC2633 started distributing OneNote files (.one) that usually led to QAKBOT. It has also leveraged HTML smuggling to distribute ZIP files containing IMG files that contain LNK files and malware payloads.",
"alias": [
{
"name": "TA570 (Proofpoint)"
}
],
"first_reference_time": {
"seconds": "1459085092"
},
"last_reference_time": {
"seconds": "1687392000"
},
"industries_affected": [
"Aerospace & Defense",
"Agriculture",
"Automotive",
"Chemicals & Materials",
"Civil Society & Non-Profits",
"Construction & Engineering",
"Education",
"Energy & Utilities",
"Financial Services",
"Governments",
"Healthcare",
"Hospitality",
"Insurance",
"Legal & Professional Services",
"Manufacturing",
"Media & Entertainment",
"Oil & Gas",
"Pharmaceuticals",
"Retail",
"Technology",
"Telecommunications",
"Transportation"
]
}
],
"campaigns": [
"CAMP.23.007"
],
"last_updated_time": {
"seconds": "1695165683",
"nanos": 48000000
},
"verdict_info": [
{
"source_provider": "Mandiant Automated Intel",
"confidence_score": 75
},
{
"verdict_type": "ANALYST_VERDICT",
"confidence_score": 75
},
{
"source_count": 91,
"response_count": 1,
"verdict_type": "PROVIDER_ML_VERDICT",
"malicious_count": 1,
"ioc_stats": [
{
"ioc_stats_type": "MANDIANT_SOURCES",
"second_level_source": "Knowledge Graph",
"quality": "HIGH_CONFIDENCE",
"malicious_count": 1,
"response_count": 1,
"source_count": 8
},
{
"ioc_stats_type": "MANDIANT_SOURCES",
"second_level_source": "Malware Analysis",
"source_count": 4
},
{
"ioc_stats_type": "MANDIANT_SOURCES",
"second_level_source": "Spam Monitoring",
"source_count": 1
},
{
"ioc_stats_type": "THIRD_PARTY_SOURCES",
"second_level_source": "Crowdsourced Threat Analysis",
"source_count": 71
},
{
"ioc_stats_type": "THIRD_PARTY_SOURCES",
"first_level_source": "MISP",
"second_level_source": "Trusted Software List",
"source_count": 3
},
{
"ioc_stats_type": "THIRD_PARTY_SOURCES",
"first_level_source": "Threat Intelligence Feeds",
"second_level_source": "Digitalside It Hashes",
"source_count": 1
},
{
"ioc_stats_type": "THIRD_PARTY_SOURCES",
"first_level_source": "Threat Intelligence Feeds",
"second_level_source": "Tds Harvester",
"source_count": 1
},
{
"ioc_stats_type": "THIRD_PARTY_SOURCES",
"first_level_source": "Threat Intelligence Feeds",
"second_level_source": "Urlhaus",
"source_count": 1
}
]
},
{
"source_provider": "Mandiant Analyst Intel",
"confidence_score": 75,
"pwn": true,
"pwn_first_tagged_time": {
"seconds": "1683911695"
}
}
],
"last_discovered_time": {
"seconds": "1683909854"
}
}
],
"source_type": "GLOBAL_CONTEXT",
"source_labels": [
{
"key": "is_scanner",
"value": "false"
},
{
"key": "osint",
"value": "false"
},
{
"key": "misp_akamai",
"value": "false"
},
...
{
"key": "has_pwn",
"value": "2023-05-12T17:14:55.000+0000"
}
],
"event_metadata": {
"id": "\\000\\000\\000\\000\\034Z\\n\\2545\\237\\367\\353\\271\\357\\302\\215t\\330\\275\\237\\000\\000\\000\\000\\007\\000\\000\\000\\206\\000\\000\\000",
"base_labels": {
"log_types": [
"MANDIANT_FUSION_IOC"
],
"allow_scoped_access": true
}
}
},
"entity": {
"file": {
"sha256": "000bc5900dc7a32851e380f418cc178ff0910242ee0561ae37ff424e6d3ec64a",
"md5": "f0095b0a7480c826095d9ffc9d5d2d8f",
"sha1": "8101315b9fbbf6a72bddbfe64837d246f4c8b419"
},
"labels": [
{
"key": "is_scanner",
"value": "false"
},
{
"key": "osint",
"value": "false"
},
{
"key": "misp_akamai",
"value": "false"
},
...
]
}
}
Conditions complexes
Pour utiliser plusieurs champs à la fois dans une entité de contexte, vous pouvez combiner plusieurs variables de résultat afin de créer une logique conditionnelle plus complexe.
Pour combiner plusieurs champs, vous pouvez créer des variables de résultat intermédiaires.
Ces variables sont ensuite combinées pour former une nouvelle variable de résultat pouvant être utilisée dans la section condition
.
Consultez l'exemple suivant.
// Value will be 1 if threat.associations.type = "MALWARE"
// Wrapper max function required for multi-event rules
$is_attributed_malware = max(if($entity_context.graph.metadata.threat.associations.type = "MALWARE", 1, 0))
// Value will be 1 if threat.associations.type = "THREAT_ACTOR"
$is_attributed_actor = max(if($entity_context.graph.metadata.threat.associations.type = "THREAT_ACTOR", 1,0))
// Value will be the sum of the $is_attributed_malware $is_attributed_malware and $is_attributed_actor
$is_attributed = if($is_attributed_malware = 1, 1, 0)
+
if($is_attributed_actor = 1, 1, 0)
// If the value of $is_attributed is greater than 1, this indicates the indicator has been attributed at least once with the type "MALWARE" or "THREAT_ACTOR"
Dans ce cas, deux variables de résultat intermédiaires, is_attributed_malware
et is_attributed_actor
, sont combinées dans une variable de résultat is_attributed
.
Dans cet exemple, les valeurs de résultat intermédiaires renvoient des valeurs numériques, ce qui permet des comparaisons numériques dans la nouvelle variable de résultat.
Dans cet exemple, is_attributed
aura une valeur de 1 ou plus si l'indicateur comporte au moins une association de menace de type MALWARE
ou THREAT_ACTOR
.
Jointures flexibles dans YARA-L
Les jointures flexibles entre les IOC permettent de joindre plusieurs champs UDM à une entité de contexte. Cela réduit le nombre de règles requises si plusieurs champs UDM sont joints à des entités de contexte.
Vous trouverez ci-dessous un exemple de section event
qui utilise des jointures flexibles pour plusieurs champs UDM.
events:
// Filter graph
$mandiant.graph.metadata.product_name = "MANDIANT_FUSION_IOC"
$mandiant.graph.metadata.vendor_name = "MANDIANT_FUSION_IOC"
$mandiant.graph.metadata.entity_type = "FILE"
$mandiant.graph.metadata.source_type = "GLOBAL_CONTEXT"
$mandiant.graph.entity.file.md5 = strings.coalesce($e.target.process.file.md5, $e.target.process.file.md5) OR
$mandiant.graph.entity.file.md5 = strings.coalesce($e.principal.process.file.md5, $e.principal.process.file.md5)