Présentation du flux de fusion Applied Threat Intelligence

Compatible avec :

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 vous offrir une valeur maximale, le flux inclut également des IOC que Mandiant Intelligence a été soigneusement vérifié et validé à 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 sur le terrain: les analystes Mandiant acquièrent directement des connaissances les outils et techniques des attaquants tout en enquêtant sur les compromissions.

  • 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 associés à des menaces et campagnes spécifiques aide à comprendre et à hiérarchiser les incidents.

Le flux Breach Analytics s’appuie sur Fusion, en ajoutant des indicateurs associés aux brèches nouvelles et émergentes sur lesquelles Mandiant travaille 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 contextuelles. 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 le cas présent, il s'agit d'un flux Fusion. Filtrez ensuite les données selon un indicateur spécifique de mots clés. 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 Conditions de l'événement ou de l'entité de contexte dans la section events. vous pouvez joindre un champ à partir 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 garantir 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"

Reprenons l'exemple précédent. La règle de correspondance des indicateurs de base est configurée par rapport aux hachages de fichiers, qui se trouvent dans les entités de contexte au niveau de graph.entity.file.md5. et le champ UDM principal.process.file.md5. Cette simple règle de correspondance peut correspondre à un grand nombre d'événements. Il est donc recommandé d'affiner la mise en 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 tout faire dans la 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 le suivant : extrait à l'aide d'un if statement encapsulé dans une fonction max. Cette technique est obligatoire pour les règles relatives à plusieurs événements. 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 La variable matched_conditions, qui permet d'utiliser une logique enchaînée 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 Feed

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 "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 menaces
metadata.threat.verdict_info.pwn TRUE, FALSE
metadata.threat.verdict_info.pwn_first_tagged_time.seconds Code temporel (en secondes)

Certains champs ont des paires clé-valeur qui doivent être utilisées en combinaison pour accéder les bonnes valeurs. Voici un exemple.

Champ 1 de l'entité Values Champ 2 de l'entité Values
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))

L'examen des correspondances d'entités dans Google Security Operations vous permet d'obtenir une vue complète les données, ce qui permet de mettre en évidence des champs supplémentaires qui peuvent s'avérer utiles pour évaluer la priorité et le contexte d'une alerte d'indicateur.

Voici un exemple d'entité de contexte Fusion Feed qui sert de 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 pour 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, qui permet d'effectuer des comparaisons numériques dans la nouvelle variable de résultat. Dans cet exemple, is_attributed est une valeur égale ou supérieure à 1 si l'indicateur comporte au moins une association de menaces de type MALWARE ou THREAT_ACTOR.

Jointures flexibles dans YARA-L

Les jointures flexibles entre 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)