Présentation du flux de fusion Applied Threat Intelligence

Compatible avec:

Le flux d'indicateurs de Mandiant Fusion est un ensemble d'indicateurs de compromission (y compris les hachages, les adresses IP, les domaines et les URL) associés à des les attaquants, les souches de logiciels malveillants, les campagnes actives et les rapports de CTI 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 curation de Mandiant comprend les étapes suivantes.

  • Réponse aux incidents sur le terrain: les analystes Mandiant acquièrent des connaissances de terrain les outils et techniques des attaquants tout en enquêtant sur les compromissions.

  • Étude sur les menaces: des équipes dédiées suivent les acteurs malveillants, analysent les logiciels malveillants découvrir l’émergence de l’infrastructure d’attaque.

  • 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 exploiter des informations contextuelles provenant du module Applied Threat Intelligence Fusion Feed afin d'améliorer les règles simples de mise en correspondance des indicateurs. Elle inclut les ressources les groupes cyber, la présence d’un indicateur dans un environnement compromis, le score de confiance automatisé du niveau de malveillance.

Écrire des règles YARA-L avec le flux Fusion

Le processus d'écriture de règles YARA-L à l'aide de Fusion Feed est semblable à celui d'écriture les règles YARA-L avec d'autres sources d'entités de contexte. Pour savoir comment pour é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 d'entité de contexte sélectionné. 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 les Par exemple, la variable d'espace réservé ioc est utilisée pour effectuer une opération 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 exploités Dans les règles YARA-L, consultez la section Champs d'entité de contexte du flux de fusion.

Section "Résultats"

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. Par conséquent, il est est recommandé d'affiner la correspondance avec les règles sur les entités de contexte présentant des qui présente un intérêt. Par exemple, cela peut inclure le score de confiance attribué à l'indicateur par Mandiant, qu'il s'agisse d'un environnement compromis ou d'une famille de malware associées à 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 une a été détectée dans un environnement compromis tel qu’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

Terminer la règle YARA-L

À 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

De nombreux champs du flux d'indicateurs Mandiant Fusion sont utilisés 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 utiles 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 à la menace
metadata.threat.verdict_info.pwn TRUE, FALSE
metadata.threat.verdict_info.pwn_first_tagged_time.seconds Code temporel (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é Valeurs Champ 2 de l'entité 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 à la valeur désignée à l'aide d'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 ensemble 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 qui peut ê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és 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 UDM sont associés à 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)