Descripción general del feed de fusión de Threat Intelligence aplicada

El feed indicador de Mandiant Fusion es una colección de indicadores de compromiso (IOC), incluidos hashes, IP, dominios y URL, que están asociados con perpetradores conocidos, cepas de malware, campañas activas e informes de inteligencia terminada. Para garantizar el valor máximo, el feed también incluye los IOC que Mandiant Intelligence verificó y validó cuidadosamente a partir de feeds de código abierto, lo que garantiza una precisión alta. El proceso de selección de Mandiant consta de los siguientes pasos.

  • Respuesta ante incidentes de primera línea: los analistas de Mandiant adquieren conocimiento de primera mano sobre las herramientas y técnicas de los atacantes mientras investigan vulneraciones.

  • Investigación de amenazas: Los equipos dedicados realizan un seguimiento de los agentes de amenazas, analizan el software malicioso y descubren la infraestructura de ataque emergente.

  • Contextualización: los IOC se asignan a amenazas y campañas específicas, lo que ayuda a comprender y priorizar los incidentes.

El feed de Breach Analytics se basa en Fusion, y agrega indicadores asociados con vulneraciones nuevas y emergentes que Mandiant investiga activamente. Proporciona estadísticas en tiempo real sobre las tendencias de ataques más recientes. Las reglas YARA-L pueden usar información contextual del feed Applied Threat Intelligence Fusion para mejorar las reglas simples de coincidencia de indicadores. Incluye grupos de amenazas asociados, la presencia de un indicador en un entorno comprometido o la puntuación de confianza automatizada de Mandiant en cuanto a la maliciosidad.

Cómo escribir reglas YARA-L con el feed de fusión

El proceso de escribir reglas de YARA-L con el feed de fusión es similar al de escribir reglas de YARA-L con otras fuentes de entidades de contexto. Si quieres obtener más información para escribir este tipo de regla de YARA-L, consulta Cómo crear estadísticas adaptadas al contexto.

Sección de eventos y coincidencias

Para escribir una regla, filtra el gráfico de entidades del contexto seleccionado. En este caso, es el feed de fusión. Luego, filtra por un tipo de indicador específico. Por ejemplo, FILE. A continuación, se muestra un ejemplo.

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"

Al igual que con las reglas de YARA-L que no usan entidades de contexto, puedes agregar cualquier otra condición del evento o la entidad de contexto en la sección events. Puedes unir un campo desde la entidad de contexto y el campo de evento de UDM. En el siguiente ejemplo, la variable de marcador de posición ioc se usa para realizar una unión transitiva entre la entidad de contexto y el evento. Luego, esta variable de marcador de posición se usa en la sección match para garantizar una coincidencia en un período en particular.

   $ioc = $context_graph.graph.entity.file.md5
   $ioc = $e1.principal.process.file.md5

match:
   $ioc over 1h

Para obtener más información sobre los campos de entidad de contexto que se pueden aprovechar en las reglas de YARA-L, consulta la sección Campos de entidad del contexto del feed de fusión.

Sección de resultados

Siguiendo con el ejemplo anterior, la regla de coincidencia de indicadores básicos se configura en lugares de hashes de archivos en las entidades de contexto en el campo graph.entity.file.md5 y el campo de UDM principal.process.file.md5. Esta regla de coincidencia simple puede coincidir con una gran cantidad de eventos. Por lo tanto, se recomienda definir mejor la coincidencia de la regla en las entidades de contexto que tienen una inteligencia específica de interés. Por ejemplo, esto puede incluir la puntuación de confianza asignada al indicador por parte de Mandiant, si se vio en un entorno vulnerado o la familia de malware asociada con el indicador. Puedes hacerlo en la sección outcome de la regla.

 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)

En la sección outcome de la regla YARA-L, la puntuación de confianza se extrae con un if statement unido a una función max. Esta técnica es obligatoria para las reglas de varios eventos. Se usa la misma técnica para extraer la variable pwn de verdict_info, que indica si se detectó un indicador en un entorno vulnerado identificado por Mandiant.

Estas dos variables de resultado se combinan en otra variable matched_conditions, lo que permite el uso de lógica encadenada en la sección condition.

Sección de condición

La sección condition garantiza que e1, context_graph y matched_conditions existan y coincidan con la condición especificada.

 condition:
   // Ensure $e1, $context_graph and $matched_conditions conditions are met.
   $e1 AND $context_graph AND $matched_conditions = 1

Completa la regla de YARA-L

En este punto, la regla está lista para usarse y debería verse de la siguiente manera:

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
}

Campos de entidad del contexto del feed de fusión

Puede utilizar muchos campos del feed indicador de Mandiant Fusion en las reglas. Todos estos campos se definen en la lista de campos del modelo de datos unificado. Los siguientes campos son relevantes para priorizar los indicadores:

Campo de entidad Valores posibles
metadata.threat.associations.type MALWARE, THREAT_ACTOR
metadata.threat.associations.name Nombre de la asociación de amenazas
metadata.threat.verdict_info.pwn TRUE, FALSE
metadata.threat.verdict_info.pwn_first_tagged_time.seconds Marca de tiempo (segundos)

Algunos campos tienen pares clave-valor que se deben usar en combinación para acceder a los valores correctos. A continuación, se muestra un ejemplo.

Campo de entidad 1 Valores Campo de entidad 2 Valores
metadata.threat.verdict_info.source_provider Inteligencia global de Mandiant metadata.threat.verdict_info.global_hits_count Integer
metadata.threat.verdict_info.source_provider Inteligencia global de Mandiant metadata.threat.verdict_info.global_customer_count Integer
metadata.threat.verdict_info.source_provider Analista de Mandiant: Intel metadata.threat.verdict_info.confidence_score Integer
metadata.threat.verdict_info.source_provider Inteligencia automatizada de Mandiant metadata.threat.verdict_info.confidence_score Integer

En la sección outcome de una regla de YARA-L, puedes usar el siguiente comando para acceder a un valor designado por una clave específica:

$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))

Examinar las coincidencias de entidades en Google Security Operations te permite obtener una vista integral de los datos y revelar campos adicionales que pueden ser valiosos para evaluar la prioridad y el contexto de una alerta de indicador.

El siguiente es un ejemplo de una entidad de contexto de feed de fusión como punto de referencia inicial.

{
  "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"
      },
...
    ]
  }
}

Condiciones complejas

Para usar varios campos a la vez en una entidad de contexto, puedes combinar varias variables de resultado para crear una lógica condicional más compleja. Para combinar varios campos, puedes crear variables de resultado intermediarias. Luego, estas variables se combinan para formar una nueva variable de resultado que se puede usar en la sección condition.

A continuación, se muestra un ejemplo.

// 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"

En este caso, dos variables de resultado intermediarias, is_attributed_malware y is_attributed_actor, se combinan en una variable de resultado is_attributed.

En este ejemplo, los valores de resultado intermedios muestran valores numéricos, lo que permite realizar comparaciones numéricas en la nueva variable de resultado. En este ejemplo, is_attributed será un valor de 1 o mayor si el indicador tiene al menos una asociación de amenaza de tipo MALWARE o THREAT_ACTOR.

Combinaciones flexibles en YARA-L

Las uniones flexibles entre los IOC permiten que se unan varios campos UDM a una entidad de contexto. Esto reduce la cantidad de reglas requeridas si varios campos de UDM se unen con entidades de contexto.

A continuación, se muestra una sección event de ejemplo que usa uniones flexibles para varios campos 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)