Query Details
// Use here: https://portal.azure.com/#view/HubsExtension/ArgQueryBlade
SecurityResources
| where type =~ "microsoft.security/assessments/subassessments" and id has "providers/Microsoft.ContainerRegistry/registries/"
//| where subscriptionId == ""
| extend
registryHost = tostring(properties["additionalData"]["registryHost"]),
repositoryName = tostring(properties["additionalData"]["repositoryName"]),
imageDigest = tostring(properties["additionalData"]["imageDigest"]),
imageOs = tostring(properties["additionalData"]["imageDetails"]["os"]),
imageOsDetails = tostring(properties["additionalData"]["imageDetails"]["osDetails"]),
assessedResourceType = tostring(properties["additionalData"]["assessedResourceType"]),
scanner = tostring(properties["additionalData"]["scanner"]),
timeGenerated = todatetime(properties["timeGenerated"]),
status = tostring(properties["status"]["code"]),
patchable = toboolean(properties["additionalData"]["patchable"]),
assessmentType = tostring(properties["additionalData"]["type"]),
severity = tostring(properties["status"]["severity"]),
category = tostring(properties["category"]),
displayName = tostring(properties["displayName"]),
description = tostring(properties["description"]),
impact = tostring(properties["impact"]),
remediation = tostring(properties["remediation"]),
cvssv2 = tostring(properties["additionalData"]["cvss"]["2.0"]["base"]),
cvssv3 = tostring(properties["additionalData"]["cvss"]["3.0"]["base"]),
resourceId = tostring(properties["resourceDetails"]["id"]),
assessmentId = toint(properties["id"]),
cve = properties["additionalData"]["cve"]
| mv-expand cve = iff(array_length(cve) == 0, dynamic([""]), cve)
| extend cve = tostring(cve["title"])
// Some "cve" dynamic objects in "properties" contain repeated CVEs, we need to deduplicate
| summarize arg_max(timeGenerated, location, resourceGroup, repositoryName, imageDigest, imageOs, imageOsDetails, assessedResourceType, displayName, description, impact, remediation)
by scanner, status, patchable, assessmentType, severity, category, tenantId, subscriptionId, registryHost, resourceId, assessmentId, cvssv2, cvssv3, cve
| summarize
Scanners = make_set(scanner),
Vulnerabilities = make_list(pack(
"CVE", cve,
"Category", category,
"DisplayName", displayName,
//"Description", description,
//"Impact", impact,
//"Remediation", remediation,
"Severity", severity,
"CVSSv2", cvssv2,
"CVSSv3", cvssv3,
"Patchable", patchable,
"AssessmentId", assessmentId
)),
arg_max(timeGenerated, location, resourceGroup, repositoryName, imageDigest, imageOs, imageOsDetails, assessedResourceType)
by status, assessmentType, tenantId, subscriptionId, registryHost, resourceId
| join kind=leftouter (
ResourceContainers
| where type == "microsoft.resources/subscriptions"
| project subscriptionId, subscriptionName = name
) on subscriptionId
| sort by tenantId asc, subscriptionName asc, status asc, resourceId asc
| project
resourceId,
tenantId,
subscriptionId,
subscriptionName,
location,
registryHost,
resourceGroup,
repositoryName,
imageDigest,
imageOs,
imageOsDetails,
assessedResourceType,
Scanners,
status,
assessmentType,
Vulnerabilities
This query retrieves security assessment data for Microsoft Container Registry resources. It extracts various properties such as registry host, repository name, image digest, image OS, assessed resource type, scanner, time generated, status, patchable, assessment type, severity, category, display name, description, impact, remediation, CVSSv2 score, CVSSv3 score, resource ID, assessment ID, and CVEs. It then deduplicates the data based on certain properties and summarizes the results. Finally, it joins the data with the subscription information and sorts the results. The final output includes resource ID, tenant ID, subscription ID, subscription name, location, registry host, resource group, repository name, image digest, image OS, image OS details, assessed resource type, scanners, status, assessment type, and vulnerabilities.

Jose Sebastián Canós
Released: September 5, 2023
Tables
Keywords
Operators