### Azure Resource Graph Query for Extracting Detailed Security Assessment Data
This Azure Resource Graph query helps extract detailed information about security assessments and sub-assessments. The query is designed to handle nested JSON properties and convert them into separate columns for easier analysis and export.
**Query:**
```kusto
securityresources
| where type == "microsoft.security/assessments"
| summarize by assessmentKey = name
| join kind=inner (
securityresources
| where type == "microsoft.security/assessments/subassessments"
| extend assessmentKey = extract(".*assessments/(.+?)/.*", 1, id)
) on assessmentKey
| project assessmentKey, subassessmentKey = name, id, parse_json(properties), resourceGroup, subscriptionId, tenantId
| extend
description = tostring(properties.description),
resourceProvider = tostring(properties.resourceDetails.ResourceProvider),
resourceName = tostring(properties.resourceDetails.ResourceName),
resourceType = tostring(properties.resourceDetails.ResourceType),
nativeResourceId = tostring(properties.resourceDetails.NativeResourceId),
vulnerabilityId = tostring(properties.id),
source = tostring(properties.resourceDetails.source),
displayName = tostring(properties.displayName),
cveDescriptionAdditionalInformation = tostring(properties.additionalData.cveDescriptionAdditionalInformation),
assessedResourceType = tostring(properties.additionalData.assessedResourceType),
severity = tostring(properties.additionalData.vulnerabilityDetails.severity),
lastModifiedDate = tostring(properties.additionalData.vulnerabilityDetails.lastModifiedDate),
exploitabilityAssessment = parse_json(properties.additionalData.vulnerabilityDetails.exploitabilityAssessment),
exploitStepsPublished = parse_json(properties.additionalData.vulnerabilityDetails.exploitabilityAssessment.exploitStepsPublished),
exploitStepsVerified = parse_json(properties.additionalData.vulnerabilityDetails.exploitabilityAssessment.exploitStepsVerified),
exploitUris = parse_json(properties.additionalData.vulnerabilityDetails.exploitabilityAssessment.exploitUris),
isInExploitKit = parse_json(properties.additionalData.vulnerabilityDetails.exploitabilityAssessment.isInExploitKit),
exploitTypes = parse_json(properties.additionalData.vulnerabilityDetails.exploitabilityAssessment.types),
publishedDate = tostring(properties.additionalData.vulnerabilityDetails.publishedDate),
workarounds = tostring(properties.additionalData.vulnerabilityDetails.workarounds),
references = tostring(properties.additionalData.vulnerabilityDetails.references),
weaknesses = tostring(properties.additionalData.vulnerabilityDetails.weaknesses),
cveId = tostring(properties.additionalData.vulnerabilityDetails.cveId),
cvssVectorString = tostring(properties.additionalData.vulnerabilityDetails.cvss.['3.0'].cvssVectorString),
baseScore = todouble(properties.additionalData.vulnerabilityDetails.cvss.['3.0'].base),
cpe = parse_json(properties.additionalData.vulnerabilityDetails.cpe),
cpeUri = parse_json(properties.additionalData.vulnerabilityDetails.cpe.uri),
lastPushedToRegistryUTC = tostring(properties.additionalData.artifactDetails.lastPushedToRegistryUTC),
repositoryName = tostring(properties.additionalData.artifactDetails.repositoryName),
artifactType = tostring(properties.additionalData.artifactDetails.artifactType),
registryHost = tostring(properties.additionalData.artifactDetails.registryHost),
mediaType = tostring(properties.additionalData.artifactDetails.mediaType),
digest = tostring(properties.additionalData.artifactDetails.digest),
tags = tostring(properties.additionalData.artifactDetails.tags),
language = tostring(properties.additionalData.softwareDetails.language),
version = tostring(properties.additionalData.softwareDetails.version),
vendor = tostring(properties.additionalData.softwareDetails.vendor),
fixedVersion = tostring(properties.additionalData.softwareDetails.fixedVersion),
packageName = tostring(properties.additionalData.softwareDetails.packageName),
category = tostring(properties.additionalData.softwareDetails.category),
fixStatus = tostring(properties.additionalData.softwareDetails.fixStatus),
osPlatform = tostring(properties.additionalData.softwareDetails.osDetails.osPlatform),
osVersion = tostring(properties.additionalData.softwareDetails.osDetails.osVersion),
fixReferenceDescription = tostring(properties.additionalData.softwareDetails.fixReference.description),
fixReferenceId = tostring(properties.additionalData.softwareDetails.fixReference.id),
fixReferenceReleaseDate = tostring(properties.additionalData.softwareDetails.fixReference.releaseDate),
fixReferenceUrl = tostring(properties.additionalData.softwareDetails.fixReference.url),
evidence = tostring(properties.additionalData.softwareDetails.evidence),
cvssV30Score = todouble(properties.additionalData.cvssV30Score),
timeGenerated = tostring(properties.timeGenerated),
remediation = tostring(properties.remediation),
statusSeverity = tostring(properties.status.severity),
statusCode = tostring(properties.status.code),
impact = tostring(properties.impact)