Acceso inicial: El superusuario de la base de datos escribe en las tablas de usuarios

En este documento, se describe un tipo de hallazgo de amenazas de Security Command Center. Los detectores de amenazas generan hallazgos de amenazas cuando identifican una posible amenaza en tus recursos de Cloud. Para obtener una lista completa de los hallazgos de amenazas disponibles, consulta el Índice de hallazgos de amenazas.

Descripción general

La cuenta de superusuario de la base de datos de Cloud SQL (postgres para PostgreSQL y root para MySQL) escribió en las tablas de usuarios. En general, no se debe usar el superusuario (un rol con acceso muy amplio) para escribir en las tablas de usuarios. Para las actividades diarias comunes, se debe usar una cuenta de usuario con acceso más limitado. Cuando un superusuario escribe en una tabla de usuarios, esto podría indicar que un atacante elevó sus privilegios o comprometió al usuario predeterminado de la base de datos y está modificando datos. También podría indicar prácticas normales, pero inseguras.

Event Threat Detection es la fuente de este hallazgo.

Cómo se debe responder

Para responder a este hallazgo, sigue los pasos que se indican a continuación:

Paso 1: Revisa los detalles del hallazgo

  1. Abre un hallazgo de Initial Access: Database Superuser Writes to User Tables, como se indica en Revisa los hallazgos.
  2. En la pestaña Resumen del panel de detalles del hallazgo, revisa la información de las secciones siguientes:

    • Qué se detectó, en especial, los campos siguientes:
      • Nombre visible de la base de datos: Es el nombre de la base de datos en la instancia de Cloud SQL PostgreSQL o MySQL que se vio afectada.
      • Nombre de usuario de la base de datos: Es el superusuario.
      • Consulta de base de datos: Es la consulta en SQL que se ejecuta mientras se escriben datos en las tablas de usuarios.
    • Recurso afectado, en especial, los campos siguientes:
      • Nombre completo del recurso: Es el nombre del recurso de la instancia de Cloud SQL que se vio afectada.
      • Nombre completo principal: Es el nombre del recurso de la instancia de Cloud SQL.
      • Nombre completo del proyecto: Es el proyecto de Google Cloud que contiene la instancia de Cloud SQL.
    • Vínculos relacionados, en especial los siguientes campos:
      • URI de Cloud Logging: Es el vínculo a las entradas de Logging.
      • Método MITRE ATT&CK: Es el vínculo a la documentación de MITRE ATT&CK.
      • Hallazgos relacionados: Son los vínculos a los hallazgos relacionados.
  3. Para ver el archivo JSON completo del hallazgo, haz clic en la pestaña JSON.

Paso 2: Revisa los registros

  1. En la consola de Google Cloud , accede al Explorador de registros. Para ello, haz clic en el vínculo en cloudLoggingQueryURI (del paso 1). En la página Explorador de registros, se incluyen todos los registros relacionados con la instancia de Cloud SQL pertinente.
  2. Revisa los registros de pgaudit de PostgreSQL o los registros de auditoría de Cloud SQL para MySQL, que contienen las consultas que ejecutó el superusuario, con los siguientes filtros:
    • protoPayload.request.user="SUPERUSER"

Paso 3: Investiga los métodos de ataque y respuesta

  1. Revisa la entrada del framework MITRE ATT&CK para este tipo de hallazgo: Robo de datos en el servicio web.
  2. Para determinar si se necesitan pasos de solución adicionales, combina los resultados del análisis con la investigación de MITRE.

Paso 4: Implementa la respuesta

El siguiente plan de respuesta podría ser adecuado para este hallazgo, pero también podría afectar las operaciones. Evalúa con cuidado la información que recopilas durante la investigación para determinar la mejor manera de resolver los hallazgos.

Ejemplo de JSON de hallazgo

A continuación, se muestra un ejemplo del JSON del hallazgo.

{
    "finding": {
      "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
      "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
      "resource_name": "//cloudsql.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_NAME",
      "state": "ACTIVE",
      "category": "Initial Access: Database Superuser Writes to User Tables",
      "sourceProperties": {
        "sourceId": {
          "projectNumber": "PROJECT_NUMBER",
          "customerOrganizationNumber": "ORGANIZATION_ID"
        },
        "detectionCategory": {
          "ruleName": "cloudsql_superuser_writes_to_user_tables",
        },
        "detectionPriority": "LOW",
        "affectedResources": [
          {
            "gcpResourceName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER"
          },
          {
            "gcpResourceName": "//cloudsql.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_NAME"
          }
        ],
        "evidence": [{
          "sourceLogId": {
            "projectId": "PROJECT_ID",
            "resourceContainer": "projects/PROJECT_ID",
            "timestamp": {
              "seconds": "0",
              "nanos": 0.0
            },
            "insertId": "INSERT_ID"
          }
        }],
        "findingId": "FINDING_ID",
        "contextUris": {
          "mitreUri": {
            "displayName": "MITRE Link",
            "url": "https://attack.mitre.org/techniques/T1567/002/"
          },
          "cloudLoggingQueryUri": [{
            "displayName": "Cloud Logging Query Link",
            "url": "LOGGING_LINK"
          }],
          "relatedFindingUri": {
            "displayName": "Related CloudSQL Exfiltration findings",
            "url": "RELATED_FINDINGS_LINK"
          }
        }
      },
      "eventTime": "2022-01-19T21:36:07.901Z",
      "createTime": "2022-01-19T21:36:08.695Z",
      "severity": "LOW",
      "workflowState": "NEW",
      "canonicalName": "projects/PROJECT_NUMBER/sources/SOURCE_ID/findings/FINDING_ID"
      "mute": "UNDEFINED",
      "findingClass": "THREAT",
      "mitreAttack": {
        "primaryTactic": "INITIAL_ACCESS",
        "primaryTechniques": ["DEFAULT_ACCOUNTS"]
      },
      "database": {
        "displayName": "DATABASE_NAME",
        "userName": "USER_NAME",
        "query": "QUERY",
      },
      "access": {
        "serviceName": "cloudsql.googleapis.com",
        "methodName": "cloudsql.instances.query"
      }
    },
    "resource": {
      "name": "//cloudsql.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_NAME",
      "projectName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
      "projectDisplayName": "PROJECT_ID",
      "parentName": "//cloudsql.googleapis.com/projects/PROJECT_NUMBER",
      "parentDisplayName": "PROJECT_ID",
      "type": "google.cloud.sql.Instance",
      "folders": [{
        "resourceFolder": "//cloudresourcemanager.googleapis.com/folders/FOLDER_NUMBER",
        "resourceFolderDisplayName": "FOLDER_ID"
      }],
      "displayName": "INSTANCE_NAME"
    }
}

¿Qué sigue?