Detection rules › Kusto

XbowNewAssetDiscovered

Status
available
Severity
medium
Time window
1h
Group by
AssetId
Source
github.com/Azure/Azure-Sentinel

Alerts when a new asset is registered in XBOW for the first time. This is detected by matching assets whose CreatedAt timestamp falls within the current query window, indicating the asset was newly added rather than updated. This helps track shadow IT, new deployments, and any unexpected expansion of the external attack surface.

MITRE ATT&CK coverage

TacticTechniques
ReconnaissanceT1595 Active Scanning

Rule body kusto

id: e4c6a8b2-9d7f-4285-a1e3-6b9c2e4f1a85
name: XbowNewAssetDiscovered
description: |
  Alerts when a new asset is registered in XBOW for the first time. This is detected by
  matching assets whose CreatedAt timestamp falls within the current query window,
  indicating the asset was newly added rather than updated. This helps track shadow IT,
  new deployments, and any unexpected expansion of the external attack surface.
severity: Medium
status: Available
requiredDataConnectors:
  - connectorId: XbowSecurityConnector
    dataTypes:
      - XbowAssets_CL
queryFrequency: 30m
queryPeriod: 1h
triggerOperator: gt
triggerThreshold: 0
tactics:
  - Reconnaissance
  - Discovery
relevantTechniques:
  - T1595
query: |
  XbowAssets_CL
  | where TimeGenerated > ago(1h)
  // Only match assets created within the query window (new, not updated)
  | where todatetime(CreatedAt) > ago(1h)
  | summarize arg_max(TimeGenerated, *) by AssetId
  | project
      TimeGenerated,
      AssetId,
      AssetName,
      StartUrl,
      Lifecycle,
      Sku,
      OrganizationId,
      CreatedAt,
      UpdatedAt,
      AssetReachableState,
      AssetReachableMessage
eventGroupingSettings:
  aggregationKind: AlertPerResult
alertDetailsOverride:
  alertDisplayNameFormat: 'XBOW New Asset: {{AssetName}}'
  alertDescriptionFormat: 'New asset registered in XBOW: {{AssetName}} ({{StartUrl}}). Reachability: {{AssetReachableState}}'
customDetails:
  AssetID: AssetId
  AssetName: AssetName
  StartUrl: StartUrl
  Lifecycle: Lifecycle
  Sku: Sku
  OrganizationID: OrganizationId
  CreatedAt: CreatedAt
  AssetReachableState: AssetReachableState
incidentConfiguration:
  createIncident: true
  groupingConfiguration:
    enabled: true
    reopenClosedIncident: false
    lookbackDuration: 6h
    matchingMethod: Selected
    groupByCustomDetails:
      - AssetID
entityMappings:
  - entityType: URL
    fieldMappings:
      - identifier: Url
        columnName: StartUrl
version: 1.0.1
kind: Scheduled

Stages and Predicates

Stage 1: source

XbowAssets_CL

Stage 2: where

| where TimeGenerated > ago(1h)

Stage 3: where

| where todatetime(CreatedAt) > ago(1h)

Stage 4: summarize

| summarize arg_max(TimeGenerated, *) by AssetId

Stage 5: project

| project
    TimeGenerated,
    AssetId,
    AssetName,
    StartUrl,
    Lifecycle,
    Sku,
    OrganizationId,
    CreatedAt,
    UpdatedAt,
    AssetReachableState,
    AssetReachableMessage

Output fields

Fields the rule emits when it matches. Chronicle authors list these in the outcome block; they appear on the detection and $risk_score drives alerting. Sentinel / Defender XDR rules build them up through project / summarize / extend stages. Sentinel maps these into alert fields via entityMappings and customDetails; Defender XDR custom detections surface them as alert fields directly.

FieldSource
AssetIdproject
AssetNameproject
AssetReachableMessageproject
AssetReachableStateproject
CreatedAtproject
Lifecycleproject
OrganizationIdproject
Skuproject
StartUrlproject
TimeGeneratedproject
UpdatedAtproject