Sample scan output — one scan, seven frameworks

What a real NSAuditor AI Enterprise scan actually produces — the console transcript, the findings as they are written, and the evidence artifacts — from one read-only run against fictional AWS, Azure, and GCP accounts. One scan → seven framework-mapped evidence packs: SOC 2, HIPAA Security Rule §164.312, NIST CSF 2.0, PCI DSS v4.0.1, ISO/IEC 27001:2022, CIS Controls v8 and GDPR Article 32 — 28 Enterprise plugins, 62 artifacts, SHA-256 chain-of-custody sidecars and a cover-page Scope Attestation. No real customer data was used — every account, resource, and finding on this page is synthetic.

The transcript below was recorded on EE 0.33.0, so it predates exploit-first triage and the verification channel. The current release, EE 0.37.0, joins CISA KEV and FIRST EPSS onto CVE findings at scan time, and it cryptographically checks the suppression signatures a compliance report renders, for approvers whose registry entry carries key material — see what 0.36.0 adds.

Current release: EE 0.37.0 · needs CE ≥ 0.2.42 Transcript recorded on EE 0.33.0 28 enterprise plugins AWS · Azure · GCP SOC 2 · HIPAA · NIST CSF 2.0 · PCI DSS v4.0.1 · ISO 27001:2022 · CIS Controls v8 · GDPR Art. 32 Demo data only
⚠ All hosts, account IDs, ARNs, project IDs, resource names, and findings on this page are synthetic. AWS account 111122223333 is an AWS-canonical example identifier. IAM users alice / bob, KMS key aabbccdd-1111-2222-3333-444455556666, the Azure storage accounts acmeprodsa01 / acmepublicsa01, the Azure NSG acme-app-nsg / subnet acme-app-subnet, the GCP project acme-prod-3f8a1c, its GCS bucket acme-public-assets, and the GCP service accounts ci-deploy-sa / data-export-sa / backup-runner-sa / legacy-batch-sa are documentation placeholders. Org name Acme Corp Inc is fictional. No customer data is disclosed.

One scan, seven frameworks — 11 AWS EE plugins · 76 findings · 69 evidence artifacts

Acme Corp's security engineer points NSAuditor at their AWS production account to get one hepta-framework evidence pack covering SOC 2 Type II readiness, HIPAA Security Rule §164.312 Technical Safeguards, NIST CSF 2.0 Subcategory coverage, PCI DSS v4.0.1 sub-requirements (MVP-67 density), ISO/IEC 27001:2022 Annex A across all 93 controls, CIS Critical Security Controls v8 across all 153 Safeguards (17 covered + 23 partial + 113 OOS across 18 Controls / 3 cumulative Implementation Groups), AND the GDPR Article 32 Security-of-Processing substrate across 11 sub-measure units (4 covered + 5 partial + 2 OOS — an infrastructure substrate for Art. 32 only, not GDPR compliance) — in a single 4-minute scan. Each plugin emits findings once; the compliance engine routes them across all seven framework control spaces.

acme-secops@laptop — nsauditor-ai scan
# Acme audit engineer runs the full hepta-framework scan against AWS
# Transcript recorded on EE 0.33.0 + CE 0.2.37 — the versions below are the ones it was captured with
# Per-account scanning: --env <path> dotenv file, --aws-profile <name> named profile
# and sentinel-host auto-scoping (--host aws + --plugins all → AWS-only plugins). Matrices UNCHANGED.
$ export AWS_PROFILE=acme-prod-audit
$ nsauditor-ai license --status
✓ Enterprise license active
  Org: audit@acmecorp.example
  Seats: 5 · Expires: 2027-05-07
  nsauditor-ai (CE):              0.2.37
  @nsasoft/nsauditor-ai-ee (EE):  0.33.0 (loaded)

$ nsauditor-ai scan --host aws \
    --plugins 1020,1023,1030,1040,1050,1060,1070,1080,1090,1100,1110 \
    --compliance soc2,hipaa,nist-csf,pci-dss,iso-27001,cis-v8,gdpr \
    --out ./acme-audit-evidence

[plugin] AWS S3 Security Auditor (1020) ........... 6 findings
[plugin] Zero Trust Assessment (1023) ............. 3 findings
[plugin] AWS IAM Deep Auditor (1030) .............. 14 findings
[plugin] AWS CloudTrail + CloudWatch (1040) ....... 5 findings
[plugin] AWS API Gateway Assurance (1050) ......... 0 findings
[plugin] AWS DynamoDB Audit Integrity (1060) ...... 12 findings
[plugin] AWS KMS Auditor (1070) ................... 7 findings
[plugin] AWS Lambda Security Auditor (1080) ....... 19 findings
[plugin] AWS Secrets Exposure & Credentials (1090)  8 findings
[plugin] AWS CodePipeline + CodeBuild (1100) ...... 0 findings
[plugin] AWS IAM Effective Decrypt-Path (1110) .... 4 findings
✓ 78 findings emitted across 11 plugins (4m31s wall-clock)

[compliance] routing 78 findings → 7 framework control spaces…
✓ SOC 2 AICPA TSC 2017     · 51 controls (10 covered + 4 partial + 37 OOS)
✓ HIPAA §164.312            · 55 controls (7 covered + 3 partial + 45 OOS)
✓ NIST CSF 2.0              · 106 Subcategories (13 covered + 10 partial + 83 OOS)
✓ PCI DSS v4.0.1 MVP-67     · 67 sub-requirements (19 covered + 9 partial + 39 OOS)
✓ ISO/IEC 27001:2022        · 93 Annex A controls (17 covered + 14 partial + 62 OOS)
✓ CIS Controls v8           · 153 Safeguards (17 covered + 23 partial + 113 OOS · IG1 23/56 · IG2 38/130 · IG3 40/153)
✓ GDPR Article 32           · 11 sub-measure units (4 covered + 5 partial + 2 OOS · Security-of-Processing substrate, Art. 32 only)

[evidence] writing 69 artifacts (7 frameworks × 10 surfaces) + raw conclusions…
✓ ./acme-audit-evidence/aws_20260524_091331/  (69 files + SHA-256 sidecars)
acme-secops@laptop — paired Azure scan (plugins 1220 + 1221)
# The dedicated Azure NSG perimeter auditor (plugin 1221) is the Azure analog of AWS 1170 (CC6.6)
# 1221 includes a public-internet UDP restricted-port lane (SNMP/CLDAP/NTP/rpcbind/IPMI/Memcached — not just TCP)
# alongside the storage auditor (1220); both orthogonal to the multi-purpose Azure scanner (1022) — no double-emission
$ export CLOUD_PROVIDER=azure   # + AZURE_TENANT_ID / AZURE_CLIENT_ID / AZURE_CLIENT_SECRET / AZURE_SUBSCRIPTION_ID
$ nsauditor-ai scan --host azure \
    --plugins 1022,1220,1221 \
    --compliance soc2,hipaa,nist-csf,pci-dss,iso-27001,cis-v8,gdpr \
    --out ./acme-azure-evidence

[plugin] Azure Security Audit (1022) .................. 5 findings
[plugin] Azure Storage Account Data-Protection (1220)  9 findings
[plugin] Azure NSG Perimeter Auditor (1221) .......... 3 findings
✓ plugin 1221 (NEW): inbound rules evaluated in Azure priority order (first-match-wins; DenyAllInbound default) — all-protocol · public→restricted-port · ::/0 IPv6-wildcard · attachment-aware (attached → CRITICAL effective / orphaned → MEDIUM latent); non-overlapping-by-depth with 1022's flat NSG lint
✓ SOC 2 enumerated in full at 10/4/37 = 51; the other six framework matrices UNCHANGED — EE 0.33.0 (2026-08-07), the wiring release: eleven compliance options that nothing shipped could populate now receive values (requires CE >= 0.2.37), Zero Data Exfiltration is stated as a positive register of 17 enumerated outbound paths, RFC 3161 timestamping is opt-in via NSAUDITOR_TSA_URL (not a default), Ed25519 suppression signing was not reachable at 0.33.0, and signature records carry algorithm+backend frozen at signing time. Prior: EE 0.32.11 (2026-08-05) — the dependency-advisory release gate now packs the tarball, installs it the way a customer does, and audits THAT (development tree 25 advisories / 8 HIGH · customer closure 6 / 0 HIGH · 5 of 26 packages shared and zero high-severity ones), and refuses to report clean until an advisory database has answered. SOC 2 enumeration completeness only — CC7.4, CC7.5, A1.1 and A1.3 are now enumerated out of scope with reasons; no control changed status, no routing changed, covered stays 10 and partial stays 4. Type II documentation now states which mechanisms are reachable from a shipped entry point. 28 plugins, 55 overall, seven frameworks — unchanged. Prior: EE 0.32.9 (2026-07-29) — internal-provenance strip (686 unexplained internal-marker occurrences → 0 across 105 files in the rebuilt three-cloud pack; positive control in the same run still detected 3,572 benign matches) + false-clean closure (a cloud that could not be scanned no longer reads as a clean audit — every in-scope control of that cloud now carries a fail-closed evidence gap) — the Vanta + Drata + Secureframe GRC connector trio (shipped 0.32.x) remains available (opt-in outbound push, records model, ZDE-redacted egress, token never serialized)

Findings tour — thirteen representative samples

Below are thirteen findings — nine from the AWS scan above plus four from the paired Azure scan: three from the storage auditor (plugin 1220) and one from the Azure NSG perimeter auditor (plugin 1221). The AWS set includes an object-version S3 finding — a public ACL on a non-current (overwritten) object version with a public WRITE-class grant — picked to span the severity range and showcase the multi-framework routing. The CC / §164.312 / PR.DS / 3.5 control badges show which controls each finding routes to under each framework.

Critical plugin 1020 · object-version ACL dim SOC 2 C1.1 HIPAA §164.312(a)(2)(iv) ISO 27001 A.5.23 / A.8.3 / A.8.12 CIS Safeguard 3.3 Configure Data Access Control Lists
S3 object acme-legacy-assets/customer-export.csv is private on its current version, but a NON-CURRENT (overwritten) version carries a public AllUsers ACL — still downloadable at ?versionId=… — and the grant includes WRITE (world-writable)
Step 2c-v walks the ListObjectVersions path the current-object scan never reaches. The current version of customer-export.csv is private — a current-object-only scanner calls it clean. But someone once published it public-read-write, then "fixed" it with a private overwrite; S3 keeps the old version, and it still serves to the anonymous internet at ?versionId=…. The auditor samples non-current versions on versioning-Enabled AND Suspended buckets (Suspended still retains old versions — the exact silent-overwrite case), skips delete-markers, and reads each with GetObjectAcl({Key, VersionId}); a public AllUsers/AuthenticatedUsers grant emits CRITICAL riding the same "publicly accessible" anchor as the bucket/object-ACL dims — so it routes to the identical controls with zero new framework mappings. The grant here is WRITE-class (WRITE/WRITE_ACP/FULL_CONTROL), so the finding adds "public WRITE-class access … – anyone can overwrite contents" — distinguishing anyone-can-overwrite (defacement / supply-chain / malware-staging) from anyone-can-download. Honoring the conservative-classifier principle, if the scanner role lacks s3:ListBucketVersions or s3:GetBucketVersioning the version surface is NOT a silent PASS — it degrades to a routed LOW evidence-gap (CC7.1 / §164.312(b)). Remediate: delete or re-private the offending version, then enable Object Ownership BucketOwnerEnforced to make ACL-based public access structurally impossible. All seven coverage matrices UNCHANGED.
resource: s3://acme-legacy-assets/customer-export.csv?versionId=8mKzQ…rJ3q (non-current) category: s3-object-version-acl-public source: aws-s3-auditor
High plugin 1220 · Azure Storage auditor SOC 2 CC6.7 HIPAA §164.312(e)(1) NIST CSF PR.DS-02 PCI DSS 4.2.1 ISO 27001 A.8.24 CIS Safeguard 3.10 Encrypt Sensitive Data in Transit
Azure Storage account acmeprodsa01 allows plaintext HTTP (enableHttpsTrafficOnly=false) — data in transit is not encrypted
The dedicated Azure Storage auditor reads the data-protection surface the multi-purpose Azure scanner never touched: this account accepts unencrypted HTTP to its blob/file/queue/table endpoints, exposing credentials, SAS tokens, and payload on the wire. The same scan also flagged minimumTlsVersion=TLS1_0 (downgrade-attackable — MEDIUM, CC6.7), allowSharedKeyAccess=true (bypasses Azure AD identity — MEDIUM, CC6.1), and no infrastructure double-encryption (LOW, C1.1). Azure field-default discipline: an absent allowSharedKeyAccess is treated as ENABLED, never a silent PASS. Remediate with HTTPS-only + a TLS1_2 floor + Azure AD-only authorization. This auditor spans seven dims, including blob recoverability (soft-delete + versioning — A1.2) and per-container anonymous public-access detection (account-toggle-aware — a public container under allowBlobPublicAccess=true is the Azure analog of a public S3 bucket; C1.1) via the secondary blob-service / container API paths.
resource: storageAccounts/acmeprodsa01 category: azure-storage-http-allowed source: azure-storage-hardening-auditor
High plugin 1220 · per-container dim SOC 2 C1.1 HIPAA §164.312(a)(1) NIST CSF PR.DS-01 PCI DSS 7.2.1 ISO 27001 A.8.3 CIS Safeguard 3.3 Configure Data Access Control Lists
Azure Storage account acmepublicsa01 has 1 blob container (public-assets) with anonymous public access AND account-level allowBlobPublicAccess=true — EFFECTIVE exposure
The per-container dim walks the secondary blobContainers.list path the account-level checks never reach. This account is hardened on every encryption / transit / auth dim, so an account-level scan would call it clean — but the public-assets container is set to publicAccess=Blob while the account toggle allowBlobPublicAccess=true is on, making its blobs anonymous-internet-readable (the Azure analog of a public S3 bucket). The dim is account-toggle-aware: had the toggle been false, Azure would override the container to private and the finding would downgrade to MEDIUM (latent). Remediate: set the container to publicAccess=None (or disable allowBlobPublicAccess account-wide).
resource: storageAccounts/acmepublicsa01/blobServices/default/containers/public-assets category: azure-storage-container-public-effective source: azure-storage-hardening-auditor
Medium plugin 1220 · recoverability dim SOC 2 A1.2 HIPAA §164.312(c)(1) NIST CSF PR.DS-11 ISO 27001 A.8.13 CIS Safeguard 11.1 Establish a Data Recovery Process
Azure Storage account acmeprodsa01 has blob soft-delete DISABLED (deleteRetentionPolicy.enabled=false) — deleted blobs are unrecoverable
The recoverability dim reads the secondary blobServices.getServiceProperties surface: this account has no blob soft-delete window, so an accidental, ransomware, or insider Remove-AzStorageBlob is permanent — and blob versioning is off too, so an overwrite has no prior-version recovery. An account fully hardened on the five encryption / transit / auth dims is still one delete from data loss. A denied getServiceProperties read degrades to a LOW evidence-gap, never a silent recoverability PASS. Remediate: enable blob soft-delete (≥7-day retention) + versioning. (No PCI DSS routing — PCI v4.0.1 has no covered backup/recoverability sub-requirement in the engine's scope.)
resource: storageAccounts/acmeprodsa01 category: azure-storage-blob-soft-delete-disabled source: azure-storage-hardening-auditor
Critical plugin 1221 · Azure NSG perimeter auditor SOC 2 CC6.6 HIPAA §164.312(a)(1) NIST CSF PR.IR-01 PCI DSS 1.2.1 / 1.3.1 / 1.4.1 ISO 27001 A.8.20 / A.8.22 CIS Safeguard 4.4 Implement and Manage a Firewall on Servers
Azure NSG acme-app-nsg permits TCP inbound from a public source (Internet) to restricted port(s) 22 (SSH), 3389 (RDP) — EFFECTIVE exposure (attached to 1 subnet)
The NSG perimeter auditor (plugin 1221) is the Azure analog of the AWS Security-Group perimeter auditor (1170). It evaluates each NSG's inbound rules in Azure priority order (first-match-wins; the implicit DenyAllInBound default at priority 65500) per restricted management/data-tier port — so a higher-priority Deny that actually neutralizes a permissive Allow is resolved correctly, not blindly flagged. Here acme-app-nsg allows SSH (22) and RDP (3389) from the Internet service tag with no overriding deny, and the NSG is attached to acme-app-subnet — so this is an EFFECTIVE exposure (CRITICAL). Had the NSG been orphaned (attached to no subnet/NIC), the same rule would downgrade to MEDIUM (latent) — it applies to nothing until associated. The auditor also catches the dimensions a flat per-rule lint misses: ::/0 IPv6-wildcard sources, all-protocol (*) rules, and the 0.0.0.0/1 split-range internet-evasion. It is non-overlapping-by-depth with the multi-purpose scanner's coarse NSG check — distinct source, distinct control (CC6.6), no double-emission. Remediate: scope the source to the operator's bastion / VPN CIDR. This same plugin includes a public-internet UDP restricted-port lane (Dim 2u/3u) — so public-source UDP management/amplification services (SNMP 161, CLDAP 389, NTP 123, rpcbind 111, IPMI 623, IKE 500, Memcached 11211, RADIUS/L2TP/SIP/mDNS/RIP/XDMCP/chargen) are not silently treated as benign, not just TCP, and a restricted-port-exposure lane to the tenant-rentable AzureCloud service tags. (That work landed in EE 0.32.11 (2026-08-03) — the dependency-advisory release gate now packs the tarball, installs it the way a customer does and audits that, and refuses to report clean until an advisory database has answered: the development tree carried 25 advisories / 8 HIGH, the closure a customer installs 6 / 0 HIGH, the two lists sharing 5 of 26 packages and zero high-severity ones. SOC 2 is enumerated in full at 10 covered / 4 partial / 37 out of scope = 51 — enumeration completeness, not a coverage change: no control changed status, no routing changed, and the other six matrices are unchanged. 28 plugins, seven frameworks — unchanged. The prior EE 0.32.9 (2026-07-29) was the internal-provenance strip: 686 unexplained internal-marker occurrences went to 0 across 105 files in a rebuilt three-cloud evidence pack, with a positive control in the same run still detecting 3,572 benign matches; plus the false-clean closure, so every in-scope control of a cloud that could not be scanned carries a fail-closed evidence gap. The Vanta + Drata + Secureframe GRC connector trio shipped in 0.32.x remains available (set COMPLIANCE_GRC_PROVIDER=vanta|drata|secureframe + COMPLIANCE_GRC_TOKEN; opt-in outbound push, records model, Zero-Data-Exfiltration-redacted egress, token never serialized; suppression-aware outcomes, framework-dimensioned idempotency, rate-limit backoff, circuit breaker; single-workspace, operator-configured — not a multi-tenant sync).
resource: networkSecurityGroups/acme-app-nsg (attached: acme-app-subnet) category: azure-nsg-public-restricted-ingress-effective source: azure-nsg-perimeter-auditor
Critical plugin 1060 SOC 2 PI1.5 + C1.1 HIPAA §164.312(c)(1) NIST CSF PR.DS-11 PCI DSS 3.5 ISO 27001 A.8.13 CIS Safeguard 11.2 Perform Automated Backups
DynamoDB table acme-audit-store has neither PITR nor deletion protection enabled
Single DeleteTable API call vaporizes the table AND no continuous backup exists to recover. Worst-case audit-the-auditor failure: the audit record itself is not survivable. Enable both Point-in-Time Recovery (PI1.5 substrate) AND deletion protection (C1.1 recoverability). Same finding routes to HIPAA §164.312(c)(1) Integrity (ePHI must not be improperly altered or destroyed) and PCI DSS 3.5 (stored cardholder data protection from loss).
resource: dynamodb:table:acme-audit-store category: ddb-no-pitr-no-delprot region: us-east-1
High plugin 1030 SOC 2 CC6.1 + C1.1 + CC6.3 HIPAA §164.312(a)(1) NIST CSF PR.AA-01 + PR.AA-05 PCI DSS 7.2.1 ISO 27001 A.5.18 + A.8.2 CIS Safeguard 5.4 Restrict Administrator Privileges
IAM principal bob (user) has effective kms:Decrypt on Resource:* via inline policy
Inline policy statement 0 grants Action:[*] on Resource:[*]. CC6.1 / C1.1 / CC6.3 blast-radius: principal can decrypt EVERY KMS key whose key policy permits the principal — confidentiality blast-radius is account-wide for any wildcard-permissive key policy. Replace Resource:* with specific key ARNs + apply a Permissions Boundary capping the effective key set. Routes to HIPAA §164.312(a)(1) Access Control (ePHI encryption-key access boundary) and PCI DSS 7.2.1 (access control by job function with least privilege).
resource: iam:user:bob policy: inline-user:bob-admin-policy (stmt 0) account: 111122223333
High plugin 1060 SOC 2 C1.1 HIPAA §164.312(a)(2)(iv) NIST CSF PR.DS-01 PCI DSS 3.5.1.2 ISO 27001 A.8.24 CIS Safeguard 3.11 Encrypt Sensitive Data at Rest
DynamoDB table acme-audit-store uses AWS-owned default encryption (no SSE-KMS customer-managed key)
Customer has no key custody; AWS-owned keys cannot be disabled, audited, or rotated by the customer. Auditors require KMS-CMK (customer-managed key) for audit-store tables — the customer must hold the cryptographic boundary. Reroutes identically to HIPAA §164.312(a)(2)(iv) Encryption-and-Decryption (Addressable; treated as Required under 2024 OCR enforcement priorities) and PCI DSS 3.5.1.2 (cryptographic key management for stored CHD).
resource: dynamodb:table:acme-audit-store SSEType: AWS-owned (no SSEDescription) category: ddb-aws-owned-encryption
High plugin 1080 SOC 2 CC6.6 HIPAA §164.312(e)(1) NIST CSF PR.AA-05 PCI DSS 1.4.2 + 8.6.1 ISO 27001 A.5.15 + A.8.20 CIS Safeguard 16.1 Secure Application Development Process
Lambda function acme-export-fn has public function URL with AuthType=NONE and resource-policy Principal:"*"
Anyone on the public internet can invoke this function with no authentication. Combined with DB_PASSWORD and API_KEY in the runtime environment variables, this is an exfiltration channel. CC6.6 (external-perimeter access controls) and HIPAA §164.312(e)(1) (transmission security boundary) both fail. PCI DSS 1.4.2 (NSC between trusted and untrusted networks) + 8.6.1 (interactive use restriction on accounts used by systems) route the same finding. Apply IAM auth or VPC-private function URL.
resource: lambda:function:acme-export-fn function-url: AuthType=NONE env-suggestive: DB_PASSWORD, API_KEY, SECRET_TOKEN
Medium plugin 1110 SOC 2 CC6.1 + C1.1 HIPAA §164.312(a)(2)(iv) NIST CSF PR.AA-05 PCI DSS 7.2.4 ISO 27001 A.5.18 + A.8.24 CIS Safeguard 3.3 Configure Data Access Control Lists
KMS key aabbccdd-1111-2222-3333-444455556666 has a grant authorizing Decrypt to a principal with NO identity-policy grant for kms:Decrypt (Pacu P-16 stealth path)
Grant authorizes decrypt-equivalent operations to assumed-role principal arn:aws:sts::111122223333:assumed-role/acme-fixture-exec-role/acme-export-fn — but that principal has NO identity-policy grant for kms:Decrypt. The grant bypasses identity-policy enforcement entirely. The principal can recover plaintext from data encrypted under this key without any IAM policy mentioning kms:Decrypt. Pacu P-16 stealth path — auditor-detectable. Verify the grant is intentional + revoke if the principal should not have decrypt capability on this key.
resource: kms:key:aabbccdd-1111-2222-3333-444455556666 granteePrincipal: acme-fixture-exec-role/acme-export-fn operations: [Decrypt]
Medium plugin 1090 SOC 2 CC6.1 HIPAA §164.312(d) NIST CSF PR.AA-01 PCI DSS 8.3.10.1 ISO 27001 A.5.17 CIS Safeguard 5.4 Restrict Administrator Privileges
Secrets Manager secret acme-db-creds has rotation DISABLED
Long-lived credentials accumulate compromise risk over time; AWS-recommended baseline is enabled rotation with a Lambda rotation function. CC6.1 access-control boundary risk on the credential layer (the credential IS the access boundary; without rotation it becomes a single point of failure if leaked). HIPAA §164.312(d) Person-or-entity authentication requires periodic re-verification; static credentials cannot evidence that. PCI DSS 8.3.10.1 requires password rotation cadence aligned to risk. Enable rotation via secretsmanager:RotateSecret with a 30-day schedule.
resource: secretsmanager:secret:acme-db-creds rotationEnabled: false age-days: 312
Medium plugin 1070 SOC 2 CC6.3 HIPAA §164.312(a)(2)(iv) NIST CSF PR.DS-01 PCI DSS 3.6.4 ISO 27001 A.8.24 CIS Safeguard 3.11 Encrypt Sensitive Data at Rest
Customer-managed KMS key aabbccdd-1111-2222-3333-444455556666 has automatic key rotation DISABLED
CC6.3 expects cryptographic credential rotation cadence; AWS recommends enabling annual automatic rotation for customer-managed symmetric encryption keys. Enable via kms:EnableKeyRotation, or document the manual rotation procedure for auditor walkthrough. PCI DSS 3.6.4 explicitly requires cryptographic key rotation at the end of defined cryptoperiods + when key integrity is weakened — auditors require evidence of rotation events, not just configuration.
resource: kms:key:aabbccdd-1111-2222-3333-444455556666 keyRotationEnabled: false keyManager: CUSTOMER
Pass plugin 1060 SOC 2 PI1.5 + C1.1 HIPAA §164.312(c)(1) NIST CSF PR.DS-11 PCI DSS 3.5 ISO 27001 A.8.13 CIS Safeguard 11.2 Perform Automated Backups
DynamoDB table acme-compliant-store has Point-in-Time Recovery (PITR) enabled
Positive evidence for PI1.5 Stored items recoverability + C1.1. The same plugin emits pass findings on COMPLIANT resources — these are the auditor's positive evidence that the control IS operating, not just an absence of failures. A SOC 2 Type II audit specifically requires evidence the control WAS in operation across the observation period; pass-findings populate that evidence stream.
resource: dynamodb:table:acme-compliant-store PITR: enabled · ContinuousBackupsStatus=ENABLED deletionProtection: true
↳ KEY INSTITUTIONAL POINT

Each finding above appears in all seven framework reports automatically. The plugin emits the finding once; the compliance engine routes it across SOC 2 + HIPAA + NIST CSF 2.0 + PCI DSS + ISO/IEC 27001:2022 + CIS Controls v8 + GDPR Article 32 control spaces in a single pass. This is the one scan, seven frameworks contract — no double-scanning, no double-billing for AWS API calls, no risk of cross-framework drift.

The framework-routing rules live in data/compliance/{soc2,hipaa,nist-csf,pci-dss,iso-27001,cis-v8,gdpr}.json and inherit from soc2.json's grep-verified plugin-emission pattern set per the institutional inheritance-contract discipline. A finding pattern that doesn't appear in soc2.json cannot leak through to the other six framework JSONs — defended by automated anchor-drift tests at every release (including sharp doesNotMatch cross-framework citation-leak regex defense; the CIS v8 mapping contributes 31 such tests).

GCP false-negative hardening — five fixes · plugins 1021 + 1024 + 1025 · pure ADC

NSAuditor closes five GCP false-negatives — exposures a previous build called clean. Acme's engineer points NSAuditor at the GCP project acme-prod-3f8a1c and the same compliance engine routes every GCP finding across all seven framework control spaces. The headline misses now caught: a GCS bucket public via a legacy ACL while uniform bucket-level access (UBLA) is disabled — the surface the IAM-only check never read (plugin 1024); a project-scope roles/iam.serviceAccountKeyAdmin binding that lets a principal mint long-lived keys for ANY service account (offline impersonation, plugin 1025); a custom role granting iam.serviceAccounts.actAs reached through a serviceAccountTokenCreator edge — a transitive impersonation path (plugin 1025); and the classic 0.0.0.0/0 default-allow-ssh/rdp/icmp firewall rules (plugin 1021).

↳ GCP IAM AUDITING RUNS UNDER PURE ADC

The GCP client/auth handling lets the GCP IAM Project-Level Auditor (plugin 1025) read the project IAM policy and run its service-account / impersonation dimensions (Dim 4-6) under pure Application Default Credentials — no GOOGLE_APPLICATION_CREDENTIALS key file and no GOOGLE_IMPERSONATE_SERVICE_ACCOUNT required. A prior build failed the project-IAM read (getIamPolicy is not a function) and silently skipped the impersonation graph; the GCP client and ADC fixes make that surface real, and an API denial now degrades to an explicit evidence-gap verdict — never a silent clean. All seven coverage matrices are UNCHANGED — this is substrate-depth uplift on perimeter, access-control, and data-protection controls already in scope.

acme-secops@laptop — GCP scan (plugins 1021 + 1024 + 1025, pure ADC)
# Three GCP plugins hardened against false-negatives — pure ADC, no key file
# 1024 _auditLegacyAcls = the GCS legacy-ACL public surface the IAM-only check missed
# 1025 key-admin dim = project-scope serviceAccountKeyAdmin (offline impersonation) · impersonation-path dim = actAs PATH
# 1021 = 0.0.0.0/0 default-allow-ssh/rdp/icmp firewall rules. Matrices UNCHANGED.
$ export CLOUD_PROVIDER=gcp   # + GOOGLE_CLOUD_PROJECT_ID=acme-prod-3f8a1c (ADC: gcloud auth application-default login)
$ nsauditor-ai scan --host gcp \
    --plugins 1021,1024,1025 \
    --compliance soc2,hipaa,nist-csf,pci-dss,iso-27001,cis-v8,gdpr \
    --out ./acme-gcp-evidence

[plugin] GCP Security Audit (1021) ................... 4 findings
[plugin] GCP Cloud Storage Auditor (1024) ........... 1 finding
[plugin] GCP IAM Project-Level Auditor (1025) ....... 2 findings
✓ 1025 ran Dim 4-6 under pure ADC — project-IAM read OK (no getIamPolicy error); impersonation graph built (BFS depth cap 4)
✓ 1024 walked the legacy-ACL surface (UBLA-disabled buckets) the account-level IAM check never reaches
✓ SOC 2 enumerated in full at 10/4/37 = 51; the other six framework matrices UNCHANGED — EE 0.33.0 (2026-08-07), the wiring release: eleven compliance options that nothing shipped could populate now receive values (requires CE >= 0.2.37), Zero Data Exfiltration is stated as a positive register of 17 enumerated outbound paths, RFC 3161 timestamping is opt-in via NSAUDITOR_TSA_URL (not a default), and Ed25519 suppression signing was not reachable at that release. Prior: EE 0.32.11 (2026-08-05) — the dependency-advisory release gate packs the tarball, installs it the way a customer does and audits THAT (development tree 25 advisories / 8 HIGH · customer closure 6 / 0 HIGH · zero high-severity packages in common), and refuses to report clean until an advisory database has answered. SOC 2 enumeration completeness only — CC7.4, CC7.5, A1.1 and A1.3 now enumerated out of scope with reasons; no control changed status, no routing changed. 28 plugins, seven frameworks — unchanged. Prior: EE 0.32.9 (2026-07-29) — internal-provenance strip (686 unexplained internal-marker occurrences → 0 across 105 files; positive control in the same run still detected 3,572 benign matches) + false-clean closure (every in-scope control of a cloud that could not be scanned now carries a fail-closed evidence gap; an archived pre-0.32.9 scan re-processed by this build WARNS instead of failing clean) — the Vanta + Drata + Secureframe GRC connector trio (shipped 0.32.x) remains available (opt-in outbound push, records model, ZDE-redacted egress, token never serialized)

GCP findings tour — four representative samples

The four GCP findings below span the severity range and showcase the GCP false-negative hardening. Each routes across all seven frameworks; the CC / §164.312 / PR / 3.3 control badges show the per-framework destination.

Critical plugin 1024 · _auditLegacyAcls SOC 2 CC6.6 + CC6.1 + C1.1 HIPAA §164.312(a)(1) NIST CSF PR.AA-05 + PR.DS-01 PCI DSS 7.2.1 ISO 27001 A.5.23 / A.8.3 CIS Safeguard 3.3 Configure Data Access Control Lists
GCS bucket acme-public-assets is public via a LEGACY object ACL (allUsers:READER) while uniform bucket-level access (UBLA) is DISABLED — anonymous-internet readable
The _auditLegacyAcls dimension walks the per-object / bucket legacy-ACL surface the IAM-only check never read. With uniform bucket-level access disabled, GCS still honors fine-grained legacy ACLs — and this bucket carries an allUsers (and allAuthenticatedUsers-class) READER grant, making its objects anonymous-internet readable (the GCP analog of a public S3 bucket). A scanner that only reads the bucket's IAM policy (which here grants nothing public) calls it clean — a false negative. The fix is UBLA-state-aware: had UBLA been enabled, legacy ACLs would be ignored by GCS and the finding would not fire. Remediate: remove the allUsers/allAuthenticatedUsers ACL grants, then enable uniform bucket-level access to make ACL-based public access structurally impossible. Routes to CC6.6 (external-perimeter access) + CC6.1 + C1.1 and HIPAA §164.312(a)(1) Access Control. All seven coverage matrices UNCHANGED.
resource: gs://acme-public-assets (UBLA: disabled) category: gcp-storage-bucket-legacy-acl-public source: gcp-cloud-storage-auditor
Critical plugin 1025 · service-account key-admin dim SOC 2 CC6.1 + CC6.3 HIPAA §164.312(a)(1) NIST CSF PR.AA-01 + PR.AA-05 PCI DSS 7.2.1 ISO 27001 A.5.15 + A.5.18 + A.8.2 CIS Safeguard 5.4 Restrict Administrator Privileges
Project-scope binding grants roles/iam.serviceAccountKeyAdmin to ci-deploy-sa — can mint long-lived keys for ANY service account in acme-prod-3f8a1c (offline impersonation)
The service-account key-admin dimension (reachable because project-IAM read runs under pure ADC) flags a project-scope roles/iam.serviceAccountKeyAdmin binding. That role can create user-managed keys for every service account in the project — including the privileged ones — and a downloaded key is a credential that works offline, indefinitely, outside any session or Conditional-access boundary. So this binding is effectively impersonate-anyone: the holder mints a key for a high-privilege SA and acts as it with no further authorization step. The auditor treats project-scope key-admin as a CRITICAL privilege-escalation primitive distinct from a direct sensitive-role grant (Dim 2). Remediate: remove the project-level serviceAccountKeyAdmin binding, scope key administration to specific SAs only if truly required, and prefer short-lived credentials (workload identity / impersonation with conditions) over downloadable keys. Routes to CC6.1 + CC6.3 and HIPAA §164.312(a)(1) Access Control.
resource: project:acme-prod-3f8a1c · member: serviceAccount:ci-deploy-sa category: gcp-iam-sa-key-admin-project-scope source: gcp-iam-project-auditor
High plugin 1025 · impersonation-path dim SOC 2 CC6.1 + CC6.3 HIPAA §164.312(a)(1) NIST CSF PR.AA-01 + PR.AA-05 PCI DSS 7.2.1 ISO 27001 A.5.15 + A.5.18 CIS Safeguard 6.8 Define and Maintain Role-Based Access Control
Custom role acme.batchOperator grants iam.serviceAccounts.actAs, reached by data-export-sa via a serviceAccountTokenCreator edge → impersonation PATH to backup-runner-sa
The impersonation-path dimension builds the project's SA-impersonation graph and runs a bounded BFS (depth cap 4) for reachability from non-admin principals to privileged service accounts. Here a custom role acme.batchOperator includes the bare permission iam.serviceAccounts.actAs (not the named roles/iam.serviceAccountUser, so a role-name-only check misses it), and data-export-sa reaches the privileged backup-runner-sa through a roles/iam.serviceAccountTokenCreator edge — a transitive impersonation path, not a direct grant. The finding emits the resolved path so an auditor can trace the escalation hop-by-hop. The graph is built only because the project-IAM read now succeeds under pure ADC (a prior build skipped it). Remediate: remove iam.serviceAccounts.actAs from the custom role or break the tokenCreator edge; prefer scoped, conditioned impersonation. Routes to CC6.1 + CC6.3 and HIPAA §164.312(a)(1).
resource: data-export-sa → (tokenCreator) → backup-runner-sa category: gcp-iam-sa-impersonation-path source: gcp-iam-project-auditor
Critical plugin 1021 SOC 2 CC6.6 HIPAA §164.312(a)(1) NIST CSF PR.IR-01 PCI DSS 1.2.1 / 1.3.1 / 1.4.1 ISO 27001 A.8.20 / A.8.22 CIS Safeguard 4.4 Implement and Manage a Firewall on Servers
GCP firewall rules default-allow-ssh / default-allow-rdp / default-allow-icmp permit ingress from 0.0.0.0/0 to tcp:22, tcp:3389, and icmp:all
The GCP Security Audit (plugin 1021) flags the auto-created default VPC firewall rules that allow unrestricted inbound from any internet source. default-allow-ssh opens tcp:22 (credential brute-force + lateral-movement pathway), default-allow-rdp opens tcp:3389 (a primary ransomware / credential-attack vector), and default-allow-icmp opens icmp:all (reconnaissance + DoS). Each is rated CRITICAL. These bypass network-segmentation principles and expose management surfaces to the entire internet. Remediate: delete the default-allow rules (or scope their source ranges to the operator's bastion / VPN CIDR) and replace with least-privilege ingress. Routes to CC6.6 (external-perimeter access controls) + HIPAA §164.312(a)(1) + PCI DSS 1.2.1/1.3.1/1.4.1.
resource: default-allow-ssh, default-allow-rdp, default-allow-icmp category: gcp-firewall-public-ingress source: gcp-security-audit
↳ KEY INSTITUTIONAL POINT — A FALSE NEGATIVE IS THE WORST AUDIT OUTCOME

A false positive wastes an analyst's time; a false negative ships a "you're secure" verdict over a live hole. The GCP cycle closes four such holes — the legacy-ACL public bucket (1024), the project-scope key-admin impersonation primitive and the transitive actAs path (1025), and the IAM read that previously failed shut (the GCP client and ADC fixes) — and routes each to the producing source's own native controls, never a mirror. The one scan, seven frameworks contract holds for GCP exactly as it does for AWS and Azure: each plugin emits once; the compliance engine fans the finding across SOC 2 + HIPAA + NIST CSF 2.0 + PCI DSS + ISO/IEC 27001:2022 + CIS Controls v8 + GDPR Article 32. All seven matrix counts are UNCHANGED.

One scan, seven matrices — same 76 findings, seven control spaces

Each framework defines its own control universe + sub-categorization + audit discipline. The matrix counts below show how the same 76 plugin-emitted findings populate each framework's in-scope control set, with the remainder explicitly labeled out-of-scope (architecturally not addressable by infrastructure scanning, paired with the named non-engine evidence streams operators need).

SOC 2 — AICPA TSC 2017
Type II readiness · Common Criteria + Confidentiality + Processing Integrity
10Covered 4Partial 33OOS
Key covered: CC6.1 · CC6.3 · CC6.6 · CC7.1 · CC7.2 · CC8.1 · C1.1 · PI1.5. OOS architectural: physical-datacenter controls, vendor management, change-management process evidence. Pair with operator-side change-management trail.
HIPAA — Security Rule §164.312
Technical Safeguards · Required + Addressable discipline
7Covered 3Partial 45OOS
Key covered: §164.312(a)(1) · §164.312(a)(2)(iv) · §164.312(b) · §164.312(c)(1) · §164.312(d) · §164.312(e)(1). 45 OOS = entire §164.308 Administrative + §164.310 Physical Safeguards (architecturally OOS for any cloud-tenant scanner). Pair with HRIS + facility access logs.
NIST CSF 2.0
Subcategory-level mapping · 6 Functions (GV+ID+PR+DE+RS+RC)
13Covered 10Partial 83OOS
Key covered: PR.AA-01 · PR.AA-05 · PR.DS-01 · PR.DS-11 · PR.IR-01 · DE.CM-01 · DE.CM-09. 83 OOS by-design: entire Govern function (policy/strategy) + entire Respond function (IR runbook execution) + Implementation Tiers 1-4 (organizational maturity). Pair with TPRM + IR platform.
PCI DSS v4.0.1 — MVP-67
Sub-requirement-level · PCI SSC RoC Reporting Template Appendix B
19Covered 9Partial 39OOS
Key covered: 1.2.1 · 3.5.1.2 · 3.6.4 · 7.2.1 · 7.2.4 · 8.3.10.1 · 8.6.1 · 10.2.1. 39 OOS: Req 3 stored-CHD attestation + Req 5 anti-malware + Req 9 physical + Req 11 ASV/pen-test + Req 12 governance. Pair with QSA-aware GRC + ASV.
ISO/IEC 27001:2022 — 93 Annex A controls
Per-Annex-A-code level · 4 themes · the complete Annex A universe · ISO/IEC 17021-1 certification body
17Covered 14Partial 62OOS
Key covered: A.5.15 · A.5.17 · A.5.18 · A.5.23 ⭐NEW · A.8.2 · A.8.5 · A.8.9 ⭐NEW · A.8.13 · A.8.16 ⭐NEW · A.8.20 · A.8.24. 62 OOS by-design: ISMS Clauses 4-10 entirely (7 Major Nonconformity classes — absence of Clause 9.2 internal audit or Clause 9.3 management review = auto-fail Stage 2) + Theme A.6 People (HR system) + Theme A.7 Physical (cloud-provider ISO 27001:2022 Certificate inheritance for cloud-hosted). Pair with ISO-aware GRC (Drata ISO 27001 / Vanta ISO 27001 / AuditBoard / OneTrust ISMS / Secureframe). Statement of Applicability per Clause 6.1.3.d discipline + 5-attribute taxonomy + 2013-to-2022 transition discipline (deadline October 31, 2025 passed).
CIS Critical Security Controls v8 — 153 Safeguards / 18 Controls
Per-Safeguard level · 3 cumulative Implementation Groups · no certification body (CSAT / CIS-CAT Pro self-attestation)
17Covered 23Partial 113OOS
Key covered: 2.2 · 3.3 · 3.10 · 3.11 · 4.4 · 5.1 · 5.4 · 6.3 · 6.5 · 7.5 · 8.2 · 11.2 · 11.3 · 11.4 · 12.2 · 13.1. Implementation Group cumulative discipline — engine substrate evidences IG1 23-of-56 (the cyber-insurance baseline; ~50-70% of mid-market policies require IG1 attestation) / IG2-cumulative 38-of-130 / IG3-cumulative 40-of-153; the remainder are operator-side process/endpoint artifacts. NEVER report IG2 as 74-of-74 in isolation — the IG1 base must be intact before any IG2/IG3 claim. 113 OOS by-design: Control 14 Security Awareness Training (LMS) + Control 17 Incident Response + Control 18 Penetration Testing + Control 10 Malware Defenses (endpoint EDR) entirely. No-certification-body attestation — this is INPUT to your CSAT / CIS-CAT Pro self-attestation or a SOC 2 auditor cross-validating CIS scope, never "CIS certified." Cloud Companion Guide v8 + CIS-Hardened-Image credit (4.1/4.2/4.6) + 5 Security Functions (NOT 6 — no Govern) + MS-ISAC/EI-ISAC/H-ISAC sector baselines.
GDPR Article 32 — 11 sub-measure units
Per-sub-measure level · Art. 32(1)(a)-(d) + 32(2) + 32(4) · EU DPA / EDPB supervisory-authority discipline · Security-of-Processing infrastructure substrate, Art. 32 only — not GDPR compliance
4Covered 5Partial 2OOS
Key covered: Art. 32(1)(a) pseudonymisation/encryption · Art. 32(1)(b) confidentiality/integrity/availability/resilience · Art. 32(1)(d) regular testing/assessment · Art. 32(2) risk-appropriate measures. The engine produces substrate for the operator's four-factor proportionality determination (state of the art / cost of implementation / nature-scope-context-purposes / risk) — nothing is absolute pass/fail, and an unencrypted resource is only an Art. 32 finding if it holds personal data (a scope the scanner cannot know — operator-attested). 2 OOS by-design: Art. 32(1)(c) restore-availability-after-incident (backup/DR-runbook execution) + Art. 32(4) processor-instruction governance (Art. 28 agreement). The rest of GDPR (lawful basis Art. 6 / consent Art. 7 / DSARs Art. 12-23 / records Art. 30 / breach-notification Art. 33-34) is OOS-by-design — Art. 32 is the ONLY article an infrastructure scanner can substrate-evidence. Art. 83(4) lower-tier exposure (2% / €10M), NOT the 4% / €20M headline tier. Cloud-provider ISO 27001 / SOC 2 / EU Cloud CoC adherence (Art. 32(3) / Art. 42) is annual-currency demonstrable-compliance evidence. This is an infrastructure substrate for Art. 32 only — never "GDPR certified."

PCI DSS v4.0.1 — sub-requirement discipline — 4 load-bearing schema enrichments per control

The fourth framework, joined by ISO/IEC 27001:2022 as the fifth, ships sub-requirement-level mapping per the PCI SSC RoC Reporting Template Appendix B (NOT Requirement-level, which would hide gap structure). Every covered + partial control carries four institutional schema enrichments designed to defend against the QSA-detectable overclaim patterns surfaced by an adversarial audit of the mapping from a Qualified Security Assessor's perspective.

3.5.1.2 Render PAN unreadable anywhere it is stored — cryptographic keys managed using a documented key-management process.
requirement / subRequirement
"3" / "3.5.1.2"
controlType
preventive
approachEligibility
customized-eligible
customizedApproachObjective
"Cleartext PAN cannot be read from storage." // populated per Appendix D
cloudProviderAttestation
{ aws: "AWS PCI DSS SP AOC v4.0", azure: "...", gcp: "..." }
cdeScope
cde-only // operator must tag CDE per Req 1.2.4 + 12.5.1

The 15 Defined-only sub-requirements (Appendix E)

Per Appendix E of PCI DSS v4.0.1, fifteen sub-requirements explicitly disallow the Customized Approach. The engine carries approachEligibility: 'defined-only' + customizedApproachObjective: null on each, with positive-defense tests asserting every Appendix-E ID appears in the framework JSON. Misclassifying a Defined-only sub-req as Customized-eligible is the PCI analog of HIPAA's "Addressable as Required" overclaim — block.

appendix-e defined-only enumeration
# 15 Defined-only sub-requirements — Customized Approach not permitted
3.2.1      PAN retention limited
3.3.1      SAD not retained after authorization (full track data)
3.3.2      SAD not retained — CAV2/CVC2/CVV2/CID
3.3.3      SAD not retained — PIN/PIN block
4.2.1.1    Trusted keys/certificates inventory
4.2.2      PAN secured via end-user messaging technologies
4.2.2.1    PAN-via-end-user-messaging policy
8.2.1      Unique user IDs
8.2.5      Terminated user access immediately revoked
11.3.2     External vulnerability scans by ASV
11.5.2     Payment-page tamper detection (Magecart)
11.6.1     Payment-page script integrity / change-detection
12.3.1     Targeted Risk Analysis methodology
12.3.2     Customized Approach Documentation
12.8.5     TPSP Responsibility Matrix
12.10.4    Incident-response personnel training
↳ CARDHOLDER DATA ENVIRONMENT (CDE) SCOPE — OPERATOR ATTESTATION

The engine cannot determine Cardholder Data Environment scope from infrastructure scanning alone. Requirements 3 + 4 + 5 + 9 + 12 all gate on operator's CDE Data Flow Diagram per Req 1.2.4 + Req 12.5.1. The rendered PCI DSS report surfaces this as a cover-page disclaimer; per-control findings carry cdeScopeCaveat when the operator has not tagged the in-scope resources.

Pair the engine with a QSA-aware GRC (Drata PCI / Vanta PCI / AuditBoard PCI / OneTrust GRC / ServiceNow IRM) that handles the CDE Data Flow Diagram, vendor TPSP Responsibility Matrices (Req 12.8.5), and the PCI DSS RoC Reporting Template assembly. The engine produces the substrate-evidence package; the GRC + QSA produce the RoC.

62 artifacts per scan — SHA-256 chain-of-custody

Every hepta-framework scan emits 69 evidence files plus the raw scan-conclusion artifacts. Each framework gets the same six surfaces — three report formats (Markdown + HTML + JSON) plus three integrity surfaces (scope attestation + chain-of-custody manifest + SHA-256 sidecar). All cryptographically bound so an auditor can verify the artifact set hasn't drifted from the scan event that produced it.

What's in the box — hepta-framework + 28 EE plugins + auditor-grade evidence

28
Enterprise plugins — 27 cloud auditors covering AWS / Azure / GCP control planes (S3, IAM, KMS, CloudTrail, DynamoDB, Lambda, Secrets, Code{Pipeline,Build}, IAM Effective Decrypt-Path + 18 more), plus 1023 Zero Trust Assessment, which scores zero-trust posture from a network-host scan rather than calling a cloud API — 55 plugins overall with the network/host set
7
Compliance frameworks — SOC 2 AICPA TSC 2017 + HIPAA Security Rule §164.312 + NIST CSF 2.0 (Subcategory-level) + PCI DSS v4.0.1 (sub-requirement-level) + ISO/IEC 27001:2022 (per-Annex-A-code level) + CIS Critical Security Controls v8 (per-Safeguard level) + GDPR Article 32 (Security of Processing — sub-measure level)
536
Total framework controls mapped (51 SOC 2 — enumerated in full at 10/4/37 as of EE 0.32.11 — + 55 HIPAA + 106 NIST CSF + 67 PCI DSS + 93 ISO 27001 + 153 CIS v8 + 11 GDPR Art. 32 sub-measure units) with explicit OOS framing per architectural class
69
Evidence artifacts per scan (21 reports + 7 attestations + 7 chain-of-custody + 34 SHA-256 sidecars) + raw scan conclusions
6741
Test suite — green at every release. 100% green streak maintained across the full release history
88
Consecutive trio publishes (EE + CE + agent-skill) institutionalized with paired-pointer deprecation discipline

Run it yourself

install + run
# Install the trio (CE is the free runtime; EE adds the 28 plugins + 7 frameworks)
$ npm install -g nsauditor-ai@latest nsauditor-ai-agent-skill@latest \
                  @nsasoft/nsauditor-ai-ee@latest

# Activate Enterprise license (purchase at https://www.nsauditor.com/ai/pricing/)
$ nsauditor-ai license install enterprise_eyJhbGciOiJFUzI1NiIs...
✓ Enterprise license active — 5 seats — expires 2027-05-07

# Run the same hepta-framework scan against your own AWS account
$ nsauditor-ai scan --host aws \
    --plugins 1020,1023,1030,1040,1050,1060,1070,1080,1090,1100,1110 \
    --compliance soc2,hipaa,nist-csf,pci-dss,iso-27001,cis-v8,gdpr \
    --out ./my-audit-evidence

# Or just the newest framework, if you only care about CIS Controls v8
$ nsauditor-ai scan --host aws --plugins all --compliance cis-v8

Per-account scanning — --env and --aws-profile

Two CLI flags handle per-scan account selection — no shell re-export or wrapper script needed. Pass a dotenv credentials file with --env <path>, or select a named AWS profile with --aws-profile <name>. License is resolved independently of --env. A missing --env file is a hard error (fail-fast, never a silent skip). Passing an INI-format file (e.g., ~/.aws/credentials) to --env is detected and redirected to --aws-profile with a clear diagnostic. When --host aws|gcp|azure is combined with --plugins all, only that cloud's plugins run — other clouds are skipped and logged (sentinel-host auto-scoping; explicit --plugins lists are unaffected).

per-account scan recipes
# ── Option A: dotenv credentials file (KEY=VALUE) ──────────────────────────────
# --env loads the file for this scan only; credentials are NOT written to shell env
# A missing file is a hard error. INI/~/.aws/credentials format → redirected to --aws-profile
$ nsauditor-ai scan --host aws \
    --env ~/envs/prod.env \
    --compliance soc2

# ── Option B: named AWS profile from ~/.aws/credentials ────────────────────────
# --aws-profile clears any stale explicit keys; AWS_SDK_LOAD_CONFIG=1; implies CLOUD_PROVIDER=aws
$ nsauditor-ai scan --host aws \
    --aws-profile prod \
    --compliance soc2

# ── GCP example: ADC via dotenv (GOOGLE_APPLICATION_CREDENTIALS path) ──────────
$ nsauditor-ai scan --host gcp \
    --env ~/envs/gcp-prod.env \
    --compliance soc2,hipaa,nist-csf,pci-dss,iso-27001,cis-v8,gdpr

# ── All three clouds in one run: comma-separated sentinels (CE 0.2.17+) ────────
$ nsauditor-ai scan --host aws,gcp,azure \
    --env ~/envs/clouds.env \
    --plugins all \
    --compliance all \
    --out ./prod-evidence
Cloud host 'aws,gcp,azure' → scanning 3 clouds in turn; one out/ subfolder per cloud (aws_…/ azure_…/ gcp_…).

# ── Sentinel-host auto-scoping: --host aws + --plugins all → AWS-only plugins ──
# GCP / Azure plugins are skipped + logged; explicit --plugins lists are unaffected
$ nsauditor-ai scan --host aws \
    --aws-profile prod \
    --plugins all \
    --compliance soc2,hipaa,nist-csf,pci-dss,iso-27001,cis-v8,gdpr \
    --out ./prod-evidence
Cloud host 'aws' → running 20 AWS plugin(s); skipping 35 non-aws plugin(s) (other clouds + non-cloud).
✓ 20 plugins · 76 findings (4m12s) — GCP/Azure + non-cloud plugins not loaded (sentinel-host auto-scope)

# ── Scope by AWS region: --aws-region <one|csv|all> ───────────────────────────
# Regional auditors fan out across every in-scope region; S3 resolves each bucket's own region.
$ nsauditor-ai scan --host aws --plugins all \
    --aws-region us-east-1,eu-west-1,ap-southeast-2 \
    --compliance soc2
# --aws-region all = every account-enabled region. No flag = one region (unscanned regions disclosed).
# Precedence: --aws-region › AWS_REGION › single-region default. Unknown region code fails fast.

The institutional case for one-scan, seven-framework — cross-framework routing for the network-scan agents

↳ EE 0.37.0 — the verification release: a signed approval is now checked against the key it names

1 · A compliance report now cryptographically checks the suppression signatures it renders, for approvers whose registry entry carries key material, and the verdict names the exact signature bytes it checked, pairing positionally with the record it came from so it cannot be aliased onto a different record that happens to share an id.

2 · Two axes, not one. verified answers whether the suppression should stand; cryptoValid answers whether those bytes came from the named key. They diverge on exactly the revoked case — a revoked key's bytes still get checked — which is what makes signing after revocation a cryptographic finding rather than a statement about an operator-editable string. A tampered record renders "signature FAILED verification".

3 · The condition is not decoration. Every identity registry in the field today is fingerprint-only, so a missing verdict means NOT CHECKED and never FAILED: the report says "signed — not checked by this report", and a report advisory names how many registered approvers are still awaiting material and what to paste. Separately, an engine fault in the identity phase now fails that framework's report loudly instead of rendering a degraded section that told the auditor to restore a registry that was fine; the scan, the other frameworks and the findings artifacts are untouched.

This release is matrix-neutral: all seven coverage matrices are UNCHANGED and the plugin count is UNCHANGED at 28 Enterprise plugins, 55 overall. It needs CE ≥ 0.2.42, raised this cycle, because the new hand-carry entry points live in Community Edition — they move the NVD feeds you downloaded, and are distributed restricted. Paired CE 0.2.42 + agent-skill 0.2.40.

↳ EE 0.33.0 — the wiring release: options that existed, were read, and could never be fed

1 · Eleven compliance options that nothing shipped could populate now receive values. Each one was reachable only in theory — the option was declared, the engine read it, and no shipped entry point ever wrote to it, so a documented knob did nothing no matter how it was set. They are now fed from a real entry point. Those entry points live in Community Edition, so EE 0.33.0 requires CE ≥ 0.2.37; pair it with an older CE and the options stay unfed.

2 · Zero Data Exfiltration, rebuilt as a positive register. The claim used to be a denial, and a denial is unfalsifiable by inspection. It is now an enumeration of 17 outbound paths, each named with what triggers it and how to switch it off — the form a reviewer can check rather than accept. RFC 3161 trusted timestamping is now opt-in via NSAUDITOR_TSA_URL and was verified against a real timestamp authority on 2026-08-07; it is opt-in, not a default, and it is itself one of those 17 paths, so enabling it is a deliberate decision. Ed25519 suppression signing was NOT reachable from any shipped entry point at that release — no shipped path signed a suppression record. It shipped in EE 0.35.0, and EE 0.36.0 checks the signatures a compliance report renders, for approvers whose registry entry carries key material. Signature records now carry algorithm and backend frozen at the moment of signing, rather than re-derived later from whatever configuration happens to be current.

That release was matrix-neutral: all seven coverage matrices are UNCHANGED and the plugin count is UNCHANGED at 28 Enterprise plugins (27 cloud auditors plus 1023 Zero Trust Assessment, which scores a network-host scan), 55 overall. Paired CE 0.2.37 + agent-skill 0.2.35.

↳ EE 0.32.11 — the gate that was measuring the wrong subject, and a coverage universe counted in full

1 · The dependency-advisory gate had been auditing the maintainer's development tree and calling it the production closure. It now builds its subject: pack the tarball, install it into an empty directory the way a customer does, and audit that. The working-tree reading survives as an explicitly-labelled secondary that never decides the verdict. Taken with both controls in place, the development tree carried 25 advisories, 8 of them HIGH; the closure a customer installs carried 6, none HIGH. The two lists share 5 of 26 advisory packages and zero high-severity ones — every one of the eight highs was development-only. Both subjects had previously been read as "8 HIGH" over lists that overlap in a single package: a matching total is exactly what makes a wrong list read as right, which is why the two are now reconciled as sets, with a package-for-package divergence block printed on every run.

2 · Nothing was checking that an advisory database had answered. With the audit taken offline the gate produced a well-formed zero — dependency counts non-zero, the summary reconciling against its own list, no divergence because both subjects read zero — and printed a pass over a closure that really carried six. A registry mirror with no security endpoint reproduces it identically. The gate now installs a pinned canary carrying a permanently published advisory and requires that advisory back; silence is an untrustworthy run, not a pass. It also prints which registry answered, because a canary proves liveness, not freshness — a stale mirror answers it and still misses everything published since.

3 · SOC 2, enumerated in full: 10 covered / 4 partial / 37 out of scope = 51. Four AICPA criteria — CC7.4, CC7.5, A1.1 and A1.3 — appeared nowhere in the mapping data. Not out of scope with a reason; simply absent, which is assessor-visible: the covered row lists CC7.1–CC7.3, so a reader who knows the criteria asks where 7.4 and 7.5 went. Each is now enumerated with an architectural reason and the operator-side evidence that closes it, and each renders into the report as a documented gap. This is enumeration completeness, not a coverage change — no control changed status, no routing changed, covered stays 10, partial stays 4, every existing control-id membership is identical, and the other six matrices are unchanged. SOC 2 was the one framework with no universe pin, and that is exactly where the omission lived; all seven are now pinned against a universe constant held independently of the data. Separately, the Type II tables now state which mechanisms are reachable from a shipped entry point rather than presenting all of them as supported. 28 Enterprise plugins — 27 of them cloud auditors — 55 overall, seven frameworks — unchanged. Live-verified on the published bytes: 28 of 28 Enterprise plugins active, and a three-cloud scan wrote a 76-file evidence pack per cloud.

↳ EE 0.32.9 — the internal-provenance strip, and a false-clean that had to be closed

1 · A compliance report is a document a customer hands their auditor. Ours carried internal engineering identifiers — roadmap ids, internal release stamps, the name of an internal audit review — in finding titles, on the attestation cover page and inside the chain-of-custody record. None of that belongs in front of an assessor. Measured on a rebuilt three-cloud evidence pack, 686 unexplained internal-marker occurrences went to 0 across 105 files. The number that makes that zero mean something is the other one: a positive control in the same run still detected 3,572 benign matches, so the zero is a measurement rather than an absence of looking. The instrument itself is new and fails closed when its own positive control comes back empty — an empty detector can no longer report a clean sweep.

2 · A false clean, closed. When a cloud plugin could not start — its optional SDK absent, its credentials unusable — it correctly refused to report. That refusal then evaporated one layer up: the compliance report came out byte-identical to one where the scanner ran and found nothing. Ten controls read PASS. No violation, no warning. The dangerous shape is entirely ordinary — AWS and GCP scan for real, Azure's SDK is absent, and the combined pack reads as a clean three-cloud audit that nobody has any reason to question. Now every in-scope control of a cloud that could not be scanned carries a fail-closed evidence gap, and an archived scan re-processed by the new build warns instead of failing clean. Two consequences for operators: the evidence-gap finding title changed, so suppression rules matching the old text stop matching — the safe direction, findings resurface rather than hide, but silent; and you should re-scan rather than re-process any scan captured before 0.32.9.

Also in this release: four report surfaces that contradicted each other on trusted timestamping — which was still on the roadmap at that release, and became opt-in via NSAUDITOR_TSA_URL as of EE 0.33.0 — now say the same verifiable thing. On the Community Edition side, --out <dir> no longer writes into the parent directory when the directory name contains a dot; the MCP scan_cloud summary handles both spellings of the evidence-gap prefix; and validate no longer misreports where plugins came from. This release is matrix-neutral: 28 Enterprise plugins (not 27, not 29 — 27 of them cloud auditors, plus 1023 Zero Trust Assessment, which scores a network-host scan) and all seven coverage matrices unchanged — identical counts and identical control-id membership to 0.32.8.

↳ EE 0.32.8 — capability-claim honesty pass, part 2: the air-gapped-delivery class

A compliance report is only as trustworthy as the frameworks a real exposure reaches. Last cycle the analysis-agent (network-scan) path stopped waving through three real exposures — but those findings routed to SOC 2 only, so a host serving cleartext transport or exposing SMB alone failed the SOC 2 report and read perfectly clean in HIPAA / CIS / NIST CSF / PCI / ISO 27001 / GDPR off the very same scan. This release closes that split. The network-scan findings — cleartext transport (SOC 2 CC6.7 and the transport-encryption controls across the set), SMB-alone (SOC 2 CC6.6 and its cross-framework counterparts), and the new exposure signals WinRM 5985/5986, Elasticsearch transport 9300, MSRPC 135, and an aggregate open-port-count rule — now route across all seven compliance frameworks. 48 mapping rules carry each finding to the frameworks that map it, adjudicated per framework (with 24 cells justified-unrouted where no control subject matches), behind a mutation-proven guard. This release also lands a capability-claim honesty pass. Regression 9,280 pass / 0 fail. The Vanta + Drata + Secureframe GRC connector trio shipped in 0.32.x remains fully available — set COMPLIANCE_GRC_PROVIDER=vanta (or drata / secureframe) and COMPLIANCE_GRC_TOKEN and the compliance phase maps each finding to your GRC platform's evidence/test records and pushes them at scan time: opt-in, Zero-Data-Exfiltration-redacted egress, the token is never serialized into any evidence artifact, with suppression-aware outcomes, deterministic framework-dimensioned idempotency, rate-limit backoff, and a circuit breaker (records model; single-workspace, operator-configured — not a multi-tenant sync). Each finding routes to the frameworks whose control subject actually matches it — no mirror, no overclaim. This release is matrix-neutral: it routes existing network-scan findings across the frameworks that already map them, not a new framework or plugin — the plugin count is UNCHANGED at 28 and all seven coverage matrices were UNCHANGED at the count level (SOC 2 10/4/37 as re-enumerated in 0.32.10 · 7/3/45 HIPAA · 13/10/83 NIST CSF · 19/9/39 PCI DSS · 17/14/62 ISO 27001 · 17/23/113 CIS v8 · 4/5/2 GDPR Art. 32 — Security-of-Processing infrastructure substrate, Art. 32 only). It builds on the retained GCP false-negative hardening depth pass, whose fixes are still live: plugin 1024 _auditLegacyAcls reads the GCS legacy-ACL public surface a UBLA-disabled bucket still honors; plugin 1025's service-account key-admin and impersonation-path dimensions flag the project-scope roles/iam.serviceAccountKeyAdmin offline-impersonation primitive and transitive iam.serviceAccounts.actAs paths via serviceAccountTokenCreator edges; and the GCP client/ADC handling keeps GCP IAM auditing running under pure ADC with a denial degrading to an explicit evidence-gap verdict, never a silent clean.