渗漏:AI 代理将 CloudSQL 数据渗漏到公共存储分区

本文档介绍了 Security Command Center 中的一种威胁发现结果类型。当威胁检测器在您的云资源中检测到潜在威胁时,会生成威胁发现结果。如需查看可用威胁发现结果的完整列表,请参阅威胁发现结果索引

概览

通过检查审核日志,了解导出到组织拥有且可公开访问的 Cloud Storage 存储桶的活动实例数据,检测 AI 智能体发起的 Cloud SQL 数据渗漏。

支持所有 Cloud SQL 实例类型。

对于 Security Command Center 高级方案的项目级激活,此发现结果仅在父级组织中启用了标准旧版层级时才可用。

Event Threat Detection 是此发现结果的来源。

如何应答

如需响应此发现结果,请执行以下操作:

第 1 步:查看发现结果详情

  1. 按照查看发现结果中所述,打开 Exfiltration: AI Agent Initiated CloudSQL Exfiltration to Public Bucket 发现结果。系统会打开发现结果详细信息面板,以显示摘要标签页。
  2. 摘要标签页上,查看以下部分中的信息:

    • 检测到的内容,尤其是以下字段:
      • 主账号电子邮件地址:用于渗漏数据的账号。
      • 渗漏来源:有关渗漏其数据的 Cloud SQL 实例的详细信息。
      • 渗漏目标:有关数据导出到的 Cloud Storage 存储桶的详细信息。
    • 受影响的资源,尤其是以下字段:
      • 资源全名:渗漏其数据的 Cloud SQL 资源的名称。
      • 项目全名:包含来源 Cloud SQL 数据的 Google Cloud 项目。
    • 相关链接,其中包括:
      • Cloud Logging URI:指向 Logging 条目的链接。
      • MITRE ATT&CK 方法:指向 MITRE ATT&CK 文档的链接。
      • 相关发现结果:指向任何相关发现结果的链接。
  3. 点击 JSON 标签页。

  4. 在发现结果的 JSON 中,注意以下字段:

    • sourceProperties
      • evidence
      • sourceLogId
        • projectId:包含来源 Cloud SQL 实例的 Google Cloud 项目。
      • properties
      • exportScope:导出的数据量,例如整个实例、一个或多个数据库、一个或多个表,或由查询指定的子集

第 2 步:查看权限和设置

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM

  2. 如有必要,请选择发现结果 JSON 中 projectId 字段中列出的实例的项目(来自第 1 步)。

  3. 在显示的页面上的过滤条件框中,输入发现结果详情摘要标签页中主账号电子邮件地址行上列出的电子邮件地址(来自第 1 步)。检查为该账号分配了哪些权限。

第 3 步:检查日志

  1. 在 Google Cloud 控制台中,点击 Cloud Logging URI 中的链接,以前往 Logs Explorer(来自第 1 步)。 Logs Explorer 页面包含与相关 Cloud SQL 实例有关的所有日志。

第 4 步:研究攻击和响应方法

  1. 查看此发现结果类型的 MITRE ATT&CK 框架条目:渗漏到 Cloud Storage
  2. 点击第 1 步中所述的相关发现结果行上的链接,以查看相关发现结果。相关发现结果在同一 Cloud SQL 实例上具有相同的发现结果类型。
  3. 如需制定响应方案,请将您的调查结果与 MITRE 研究相结合。

第 5 步:实现响应

以下响应方案可能适合此发现结果,但也可能会影响运营。 请仔细评估您在研究中收集的信息,以确定解析发现结果的最佳方法。

  • 与数据被渗漏的项目的所有者联系。
  • 在调查完成之前,请考虑撤消权限(针对 access.principalEmail)。
  • 如需防止进一步渗漏,请向受影响的 Cloud SQL 实例添加严格的 IAM 政策。
  • 要限制针对 Cloud SQL Admin API 的访问和导出,请使用 VPC Service Controls
  • 如需识别并修正过于宽松的角色,请使用 IAM Recommender

发现结果 JSON 示例

以下是发现结果 JSON 的示例,其中省略了默认值。

{
  "finding": {
    "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/locations/global/findings/FINDING_ID",
    "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/locations/global",
    "resourceName": "//cloudsql.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_NAME",
    "state": "ACTIVE",
    "category": "Exfiltration: AI Agent Initiated CloudSQL Exfiltration to Public Bucket",
    "securityMarks": {
      "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/locations/global/findings/FINDING_ID/securityMarks"
    },
    "eventTime": "TIMESTAMP",
    "createTime": "TIMESTAMP",
    "severity": "HIGH",
    "canonicalName": "projects/PROJECT_NUMBER/sources/SOURCE_ID/locations/global/findings/FINDING_ID",
    "findingClass": "THREAT",
    "access": {
      "callerIp": "IP_ADDRESS",
      "callerIpGeo": {
        "regionCode": "COUNTRY_CODE"
      },
      "serviceName": "cloudsql.googleapis.com",
      "methodName": "cloudsql.instances.export",
      "principalSubject": "principal://agents.global.org-ORGANIZATION_ID.system.id.goog/resources/aiplatform/projects/PROJECT_NUMBER/locations/LOCATION/reasoningEngines/REASONING_ENGINE_ID"
    },
    "mitreAttack": {
      "primaryTactic": "EXFILTRATION",
      "primaryTechniques": [
        "EXFILTRATION_OVER_WEB_SERVICE",
        "EXFILTRATION_TO_CLOUD_STORAGE"
      ]
    },
    "exfiltration": {
      "sources": [
        {
          "name": "//cloudsql.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_NAME",
          "components": [
            "Databases: DATABASE_NAME"
          ]
        }
      ],
      "targets": [
        {
          "name": "//storage.googleapis.com/TARGET_STORAGE_BUCKET_NAME",
          "components": [
            "TARGET_FILE_NAME"
          ]
        }
      ]
    },
    "parentDisplayName": "Event Threat Detection",
    "domains": [
      {
        "category": "AI"
      },
      {
        "category": "IDENTITY_AND_ACCESS"
      }
    ],
    "logEntries": [
      {
        "cloudLoggingEntry": {
          "insertId": "INSERT_ID",
          "logId": "cloudaudit.googleapis.com/data_access",
          "resourceContainer": "projects/PROJECT_ID",
          "timestamp": "TIMESTAMP"
        }
      }
    ]
  },
  "resource": {
    "name": "//cloudsql.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_NAME",
    "displayName": "INSTANCE_NAME",
    "type": "google.cloud.sql.Instance",
    "cloudProvider": "GOOGLE_CLOUD_PLATFORM",
    "service": "sqladmin.googleapis.com",
    "location": "LOCATION",
    "gcpMetadata": {
      "project": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
      "projectDisplayName": "PROJECT_ID",
      "parent": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
      "parentDisplayName": "PROJECT_ID",
      "organization": "organizations/ORGANIZATION_ID"
    },
    "resourcePath": {
      "nodes": [
        {
          "nodeType": "GCP_PROJECT",
          "id": "projects/PROJECT_NUMBER",
          "displayName": "PROJECT_ID"
        },
        {
          "nodeType": "GCP_ORGANIZATION",
          "id": "organizations/ORGANIZATION_ID"
        }
      ]
    },
    "resourcePathString": "organizations/ORGANIZATION_ID/projects/PROJECT_NUMBER"
  },
  "sourceProperties": {
    "sourceId": {
      "projectNumber": "PROJECT_NUMBER",
      "customerOrganizationNumber": "ORGANIZATION_ID"
    },
    "detectionCategory": {
      "ruleName": "agent_engine_cloudsql_exfil",
      "subRuleName": "agent_engine_export_to_public_gcs"
    },
    "detectionPriority": "HIGH",
    "affectedResources": [
      {
        "gcpResourceName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER"
      },
      {
        "gcpResourceName": "//storage.googleapis.com/TARGET_STORAGE_BUCKET_NAME"
      },
      {
        "gcpResourceName": "//cloudsql.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_NAME"
      }
    ],
    "evidence": [
      {
        "sourceLogId": {
          "projectId": "PROJECT_ID",
          "resourceContainer": "projects/PROJECT_ID",
          "timestamp": {
            "seconds": "TIMESTAMP_SECONDS",
            "nanos": TIMESTAMP_NANOS
          },
          "insertId": "INSERT_ID",
          "logId": "cloudaudit.googleapis.com/data_access"
        }
      }
    ],
    "properties": {
      "exportToGcs": {
        "cloudsqlInstanceResource": "//cloudsql.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_NAME",
        "gcsUri": "gs://TARGET_STORAGE_BUCKET_NAME/TARGET_FILE_NAME",
        "bucketAccess": "PUBLICLY_ACCESSIBLE",
        "bucketResource": "//storage.googleapis.com/TARGET_STORAGE_BUCKET_NAME",
        "exportScope": "ONE_OR_MORE_DATABASES"
      }
    },
    "findingId": "FINDING_ID",
    "contextUris": {
      "mitreUri": {
        "displayName": "MITRE Link",
        "url": "https://attack.mitre.org/techniques/T1567/002/"
      },
      "cloudLoggingQueryUri": [
        {
          "displayName": "Cloud Logging Query Link",
          "url": "https://console.cloud.google.com/logs/query;query=timestamp%3D%22TIMESTAMP%22%0AinsertId%3D%22INSERT_ID%22?project=PROJECT_ID"
        }
      ]
    },
    "domains": [
      {
        "category": "AI"
      },
      {
        "category": "IDENTITY_AND_ACCESS"
      }
    ]
  }
}

后续步骤