SOC 2 evidence the auditor actually accepts.

NSAuditor AI EE produces a Type-I-friendly pre-audit gap report mapped to the AICPA Trust Services Criteria 2017 (with 2022 points of focus). Signed artifacts, RFC 3161 trusted timestamps, SHA-256 chain-of-custody, suppression workflow, and native Vanta push — out of the box.

✓ 10 controls fully covered ⚠ 4 partial ↑ Type I & Type II ⇄ Vanta push Latest: EE 0.9.4 · 24 plugins · HIPAA OCR evidence-defensibility patch

PATCH · 0.9.4 · 2026-05-22 EE-only patch EE 0.9.4 · CE 0.1.70 · agent-skill 0.1.37

HIPAA evidence-defensibility depth uplift — 4 closures + cross-framework citation expansion

The audit-hipaa-risk-analysis-ocr skill cycle (Phase-4 pair to EE 0.9.3's SOC 2 cycle) audited EE 0.9.3 against HIPAA §164.312 + HHS-OCR 2024 enforcement priorities and produced 4 closures: HIPAA PARTIAL controls (§164.312(c)(1), §164.312(c)(2), §164.312(e)(2)(i)) now carry manualProcedure fields with HHS-OCR-defensible sampling direction — parallel to SOC 2 0.9.3 fold. §164.308(a)(1)(ii)(A) Risk Analysis citation slot added — OCR's #1-cited finding under the 2024 Risk Analysis Enforcement Initiative, now named explicitly with OOS framing for §164.312 reports and GRC platform direction. SOC 2 slot names CC3.x Risk Assessment equivalently. 3 new citation slots (retention / integrity-substrate / breach-signal) covering §164.530(j) 6-year retention + §164.312(c)(1) ransomware-substrate + §164.400-414 Breach Notification — with cross-framework citation-leak defense test assertions. 2024 HHS-OCR Priority view added to HIPAA renderer — buckets findings by remote-access credential vulnerabilities and unpatched infrastructure (the two attack vectors driving the OCR-cited 264% increase in large ransomware breaches). SOC 2 coverage matrix UNCHANGED at 10/4/33.

npm install -g nsauditor-ai@0.1.70 @nsasoft/nsauditor-ai-ee@0.9.4

PATCH · 0.9.3 · 2026-05-22 EE-only patch EE 0.9.3 · CE 0.1.70 · agent-skill 0.1.37

SOC 2 evidence-sufficiency depth uplift — 4 closures

The audit-soc2-evidence-sufficiency skill cycle audited EE 0.9.2 against AICPA TSC 2017 + AT-C Section 320 sampling discipline and produced 4 closures: PARTIAL controls (CC6.3, CC8.1, A1.2, PI1.5) now carry manualProcedure fields with AT-C 320 sample-ready evidence direction — auditors can incorporate the manual side into Type II testing without ambiguity. WORM claim validation added at artifact write boundary: requireTypeIIWormClaim gate refuses to write unless COMPLIANCE-mode Object Lock with sufficient retention is asserted, surfacing EWORM_RENDERER_CLAIM_INVALID on failure. Type II shape disclosure added to the SLA Compliance Summary — surfaces the operator-supplemental evidence stream (CloudTrail + change-management tickets) needed for AT-C 320 Pattern A/B sampling. Points-of-Focus marketing claim removed from frameworkLabel — engine does not model PoF granularity; claim was misleading for Type II auditors. SOC 2 CC7.1 + HIPAA §164.308(a)(8) coverage matrix UNCHANGED at 10/4/33 + 7/3/45.

npm install -g nsauditor-ai@0.1.70 @nsasoft/nsauditor-ai-ee@0.9.3

NEW in EE 0.9.2 (2026-05-22): Intelligence engine observability uplift — 4 silent-zero CVE coverage gap classes closed. Pre-0.9.2, gaps in the CVE-lookup pipeline returned [] silently, making "0 CVE findings" indistinguishable from "scanner could not produce evidence." Post-0.9.2 every gap surfaces as a [COVERAGE GAP] INFO finding with evidence.raw.gapClass carrying the actionable diagnosis: no_version_detected (service banner without version — known CPE wildcard limitation), cpe_map_miss (vendor/product alias drift in NVD), nvd_lookup_failure (rate-limit or network error, now surfaced with error class for triage), nvd_response_not_array (malformed NVD response). Sort-by-severity-before-cap: CRITICAL/HIGH CVEs now always emit regardless of per-service volume caps (previously a service with 80+ CVEs could silently truncate a CVSS 9.8 RCE if NVD returned it at position 26+). peerDependencies floor bumped to CE 0.1.70. SOC 2 CC7.1 (Monitoring) + HIPAA §164.308(a)(8) (Evaluation) evidence-integrity uplift — coverage matrix UNCHANGED: 10/4/33 SOC 2 · 7/3/45 HIPAA.

NEW in EE 0.9.1 (2026-05-22): External adversarial-audit-skill cycle closed 10 ship-blockers in <24h. Key fixes: real NVD JSON 2.0 offline feed importer replacing a stub that returned zero CVEs in air-gapped mode (NSAUDITOR_OFFLINE_ONLY=1); Plugin 1030 gains 4 canonical Pacu privilege-escalation paths (iam:CreateRole, permissions-boundary tampering, KMS-layer privesc, sts:GetFederationToken); Plugin 1110 closes the KMS false-positive class — identity-policy HIGH findings now downgrade to INFO when no key trusts the principal, with new kms-grant-decrypt-no-identity-grant MEDIUM for Pacu P-16 stealth path; CE license-verifier hardened against seat-clone replay, adds ES256-signed revocation blocklist and clock-rollback anchor. Coverage matrix UNCHANGED at 10/4/33 SOC 2 + 7/3/45 HIPAA — depth uplift, not breadth-creep. +80 EE tests (5970/5970) + +33 CE tests (968).

NEW in EE 0.9.0 (2026-05-21): HIPAA Security Rule §164.312 Technical Safeguards is now a co-equal compliance framework alongside SOC 2. The engine reads both data/compliance/soc2.json and data/compliance/hipaa.json; a single scan with --compliance soc2,hipaa produces both evidence packs from the same finding set. SOC 2 reports remain byte-identical apart from a single-line citation-prefix cosmetic diff (per-framework citation map landed in 0.9.0). See the HIPAA §164.312 coverage matrix.

TL;DR — what this does for SOC 2

NSAuditor AI EE generates a Type-I-friendly pre-audit gap report with institutional-level evidence controls. It maps cloud and network scan findings to specific Trust Services Criteria, produces signed evidence artifacts (cover-page Scope Attestation, SHA-256 chain-of-custody sidecars, RFC 3161 trusted-timestamps, cryptographic suppression signing), and ships in machine-readable form suitable for GRC platform ingestion (native Vanta push connector shipped; Drata / Secureframe on roadmap).

It is not a SOC 2 Type II evidence pack on its own (Type II requires recurring-scan attestation across 6–12 months — supported via recurring-scan attestation + SLA/MTTR tracking, both shipped). It is not a replacement for governance, risk-assessment, or business-continuity evidence (those control families are explicitly out of scope). It is not a substitute for a CPA-firm audit — this is the pre-audit report you give your auditor so they don't bill you for finding what you already knew.

The market split: GRC platforms (Vanta, Drata, Secureframe) automate workflow but lack native vulnerability scanning; legacy scanners (Tenable, Qualys, Rapid7) produce voluminous CVE reports but don't map findings to TSC controls. NSAuditor's wedge is the bridge — deep scanning + auditor-mapped output + GRC API push.

Coverage matrix — AICPA TSC 2017

Source of truth is data/compliance/soc2.json; this matrix mirrors it. A test asserts the two stay in sync.

StatusCountTrust Services Criteria
✓ Covered10CC6.1, CC6.2, CC6.6, CC6.7, CC6.8, CC7.1, CC7.2, CC7.3, C1.1, C1.2
⚠ Partial4CC6.3, CC8.1, A1.2, PI1.5
⚪ Out of scope33CC1.*, CC2.*, CC3.*, CC4.*, CC5.*, CC9.*, PI1.1–PI1.4, P1.0–P8.0, CC6.4, CC6.5

Supported compliance frameworks (EE 0.9.0):

FrameworkStatusCoverage ShapeCLI flag
SOC 2 — AICPA TSC 2017SHIPPING since EE 0.3.010 covered + 4 partial + 33 OOS--compliance soc2
HIPAA Security Rule — §164.312 Technical SafeguardsNEW in EE 0.9.07 covered + 3 partial + 45 OOS--compliance hipaa
Both — dual-framework one scanEE 0.9.0single scan → two evidence packs--compliance soc2,hipaa
NIST CSF 2.0 · PCI DSS v4.0 · ISO27001:2022 · CIS v8PLANNED — EE 0.10.xper-framework citation map (0.9.0) makes additional frameworks cheaper to author

Read this: "Covered" means the engine produces direct evidence the auditor can attach to the control. "Partial" means we evidence one dimension of the control (e.g., a point-in-time snapshot) but not the cadence / multi-period dimension. "Out of scope" means the control is fundamentally not addressable by network scanning — a different evidence source is required.

How to run a SOC 2 scan

Once the EE package is installed and your license is activated, every scan can emit SOC 2 evidence by passing --compliance soc2. There are four common configurations — pick the one that matches the audit-readiness you need.

  1. Install & activate (3 lines, no shell-rc edits)

    CE 0.1.30+ ships license install <KEY> which verifies the JWT signature before persisting and stores the key in the platform-appropriate location (macOS Keychain, or ~/.nsauditor/.env mode 0600 on Linux/Windows). No env var setup required.

    # Install CE platform + EE package (EE needs npm read-token from your purchase email) $ npm install -g nsauditor-ai @nsasoft/nsauditor-ai-ee # Activate — verifies JWT signature, stores in Keychain / ~/.nsauditor/.env $ nsauditor-ai license install enterprise_eyJhbGciOiJFUzI1NiIs... ✓ Enterprise license installed Stored at: macOS Keychain (service=nsauditor-ai) Org: you@example.com Seats: 5 Expires: 2027-04-04 # Verify $ nsauditor-ai license --status ✓ Enterprise license active

    Backward-compatible: existing setups using NSAUDITOR_LICENSE_KEY env var or ~/.nsauditor/.env continue to work — the multi-source license loader (CE 0.1.30+) resolves keys in this order: env var (CI/CD wins) → macOS Keychain → file.

  2. Run a basic SOC 2 scan

    Single-scan, point-in-time. Produces the 10-file evidence bundle (gap report + scope attestation + chain-of-custody + integrity sidecars). Suitable for internal review and Type I gap analysis. Pick the recipe that matches your scope — on-prem network, AWS, Azure, or GCP (multi-cloud all map to the same soc2.json evidence ledger).

    # On-prem network — full SOC 2 audit $ nsauditor-ai scan --host 10.0.0.0/24 --plugins all --compliance soc2 # AWS — S3 + IAM SOC 2 audit (plugins 020 + 030) $ CLOUD_PROVIDER=aws AWS_REGION=us-east-1 \ nsauditor-ai scan --host aws --plugins 020,030 --compliance soc2 --out tasks/aws-scan-out # Baseline: findingCount=31, byStatus pass=4 fail=5 # Optional: AWS_S3_AUDIT_CONFIDENTIAL_BUCKETS=payroll,hr,backups (raises LOW→MEDIUM) # Azure — RBAC + NSG + Storage SOC 2 audit (plugin 022, service-principal auth) $ CLOUD_PROVIDER=azure \ AZURE_TENANT_ID=<your-tenant-id> \ AZURE_CLIENT_ID=<sp-app-id> \ AZURE_CLIENT_SECRET=<sp-secret> \ AZURE_SUBSCRIPTION_ID=<subscription-id> \ nsauditor-ai scan --host azure --plugins 022 --compliance soc2 --out tasks/azure-scan-out # Baseline: findingCount=2, byStatus pass=6 fail=2 # GCP — firewall + IAM enumeration (canonical-shape ready; SOC 2 mapping rules pending v0.4.0) $ CLOUD_PROVIDER=gcp GCP_PROJECT_ID=my-project \ nsauditor-ai scan --host gcp --plugins 021 --out tasks/gcp-scan-out
  3. Add trusted timestamps + SLA tracking

    Adds RFC 3161 trusted-timestamp sidecars (third-party non-repudiation) and per-severity SLA / MTTR tracking. This is the configuration most enterprise customers run for ongoing audit-readiness.

    $ COMPLIANCE_TSA_URL=https://freetsa.org/tsr \ COMPLIANCE_TRACK_SLA=true \ COMPLIANCE_IDENTITY_REGISTRY=data/compliance/identity_registry.json \ nsauditor-ai scan --host 10.0.0.0/24 --plugins all --compliance soc2
  4. Push results to your GRC platform

    Ships the gap report straight into Vanta as TestResult objects with TSC outcome mapping. Drata / Secureframe on roadmap.

    $ COMPLIANCE_GRC_PROVIDER=vanta \ COMPLIANCE_GRC_TOKEN=vanta_api_xxxx \ COMPLIANCE_TSA_URL=https://freetsa.org/tsr \ COMPLIANCE_TRACK_SLA=true \ nsauditor-ai scan --host 10.0.0.0/24 --plugins all --compliance soc2
  5. Run on a recurring schedule (Type II)

    For Type II operating-effectiveness, run the same compliance scan on a fixed cadence (typically weekly or monthly). The recurring-attestation module automatically discovers prior scans, builds a chronological matrix across your assessment window, detects cadence gaps and scope drift, and emits the Type II evidence pack.

    # Example: weekly SOC 2 scan via cron, 6-month assessment window $ crontab -e # 0 3 * * 0 cd /opt/nsauditor && nsauditor-ai scan --host 10.0.0.0/24 \ # --plugins all --compliance soc2 \ # --output-dir ./scans/$(date +\%Y-\%m-\%d) >> scan.log 2>&1 # Generate Type II recurring attestation across the last 6 months $ nsauditor-ai compliance recurring-attestation \ --root ./scans \ --framework soc2 \ --window 6m

Environment variables reference

All SOC 2-related environment variables (Enterprise license required):

VariableDefaultPurpose
COMPLIANCE_FRAMEWORKSSet to soc2 to enable SOC 2 mapping (auto-set when --compliance soc2 passed).
COMPLIANCE_TSA_URLRFC 3161 TSA endpoint for trusted-timestamp sidecars (e.g., https://freetsa.org/tsr).
COMPLIANCE_TRACK_SLAfalseEnable per-severity SLA / MTTR tracking with compensating-control flow.
COMPLIANCE_IDENTITY_REGISTRYPath to identity-registry JSON for suppression approver verification.
COMPLIANCE_WORM_BUCKETS3 bucket name for WORM evidence storage (Object Lock COMPLIANCE mode required).
COMPLIANCE_WORM_REDACTIONoffResource redaction mode for WORM archive: off · hash · remove.
COMPLIANCE_GRC_PROVIDERGRC platform: vanta (Drata / Secureframe planned).
COMPLIANCE_GRC_TOKENAPI token for GRC platform push.
COMPLIANCE_TABLETOPfalseEnable tabletop simulation with SIEM correlation (CC4.1 / CC7.3 evidence).
COMPLIANCE_NTP_STRICTfalseIf true, abort the compliance run when NTP drift is CRITICAL.

What you get — output artifacts

Each --compliance soc2 run writes the evidence bundle to out/<scan-id>/. The base bundle is 10 files (14+ when recurring-attestation is configured), and every artifact ships with a .sha256 integrity sidecar.

FilePurpose
scan_compliance_soc2.mdMarkdown gap report — engineering / GRC consumption.
scan_compliance_soc2.htmlStandalone HTML report (inline CSS, dark theme, "Print to PDF" button) — give this to the auditor.
scan_compliance_soc2.jsonFull report data (machine-readable) — for GRC API push or custom downstream tooling.
scan_attestation_soc2.jsonCover-page Scope Attestation envelope — CIDR list, exclusions, scanner version, NTP status.
scan_chain_of_custody_soc2.jsonChain-of-custody envelope linking scan → findings → artifact hashes.
*.sha256Per-artifact SHA-256 sidecars — verify with shasum -a 256 -c <file>.sha256.
*.tsr / *.tsr.bundle.jsonRFC 3161 Time-Stamp Response + TSA cert chain bundle (when COMPLIANCE_TSA_URL is set).
compliance_recurring_attestation_soc2.{md,json}Type II recurring-attestation report (when configured) — chronological scan matrix, cadence-gap table, scope-drift events.

The cover-page Scope Attestation

Every artifact opens with the same attestation block — this is the auditor's single source of truth for what was assessed:

Report appendices

How to view & verify the results

1. Open the HTML report (the auditor-friendly view)

The HTML report is fully self-contained — inline CSS, dark theme, no external assets, "Print to PDF" button at the top. Open it in any browser and you have the same view your auditor will see.

# macOS $ open out/<scan-id>/scan_compliance_soc2.html # Linux $ xdg-open out/<scan-id>/scan_compliance_soc2.html # Windows > start out\<scan-id>\scan_compliance_soc2.html

2. Verify the chain-of-custody hashes

Every artifact ships with a .sha256 sidecar. All four MUST return OK. If any FAIL, the artifact has been tampered with since generation — reject the report and rerun the scan.

$ cd out/<scan-id>/ $ shasum -a 256 -c scan_compliance_soc2.md.sha256 scan_compliance_soc2.md: OK $ shasum -a 256 -c scan_compliance_soc2.html.sha256 scan_compliance_soc2.html: OK $ shasum -a 256 -c scan_compliance_soc2.json.sha256 scan_compliance_soc2.json: OK $ shasum -a 256 -c scan_attestation_soc2.json.sha256 scan_attestation_soc2.json: OK

3. Verify the RFC 3161 trusted timestamp (when configured)

The TSA's signature attests "this hash existed at <TSA timestamp>" — a third-party time floor that an internal actor cannot backdate.

$ openssl ts -verify \ -in out/<scan-id>/scan_compliance_soc2.json.tsr \ -queryfile out/<scan-id>/scan_compliance_soc2.json.tsq \ -CAfile /path/to/tsa-ca-bundle.pem Verification: OK

4. Push to your GRC platform (optional)

If COMPLIANCE_GRC_PROVIDER=vanta was set on the scan, the connector already pushed; you'll find the TestResult objects in your Vanta workspace under the matching control IDs. If not, you can push retroactively:

$ COMPLIANCE_GRC_PROVIDER=vanta COMPLIANCE_GRC_TOKEN=vanta_api_xxxx \ nsauditor-ai compliance push --scan out/<scan-id> --framework soc2

5. Inspect the JSON for custom tooling

The JSON envelope is the canonical machine-readable form — use it for GRC ingestion, dashboards, custom reports, etc.

$ jq '.controls[] | select(.status == "fail") | {id, title, evidence}' \ out/<scan-id>/scan_compliance_soc2.json

Tip — what to send your auditor. Most CPA firms accept the HTML report + the .sha256 sidecars + (if configured) the .tsr sidecar bundle. Zip the entire out/<scan-id>/ directory and share via your usual evidence-collection workflow. The HTML is self-contained so it can be opened from a USB stick in an air-gapped audit room.

✓ Covered controls — direct evidence

For each control below, the engine produces a finding the auditor can attach to the control with stable rationale text.

CC6.1 — Logical access security software, infrastructure, and architectures

"The entity implements logical access security software, infrastructure, and architectures over protected information assets to protect them from security events to meet the entity's objectives."

SourceExample findingWhy it violates CC6.1
auth_agentSSH password authentication enabledPassword-only SSH violates least-privilege.
auth_agentExposed admin panel detected: phpmyadminExposed admin panels violate boundary control.
auth_agentTelnet service enabled (cleartext protocol)Cleartext Telnet exposes credentials in transit.
aws-iam-deep-auditorConsole access enabled WITHOUT MFACC6.1 requires MFA on privileged accounts (2017 point of focus).
aws-iam-deep-auditorSHADOW ADMIN: User has full wildcard (*) permissionsShadow admins bypass intended access restrictions.
aws-iam-deep-auditorPrivilege escalation paths detectedPrivesc paths violate access boundaries via self-elevation.
azure-cloud-scannerRBAC: Owner role assigned at subscription scope to principal …Azure Owner at subscription scope grants full management + role-assignment privileges (the broadest possible). Auditors expect just-in-time PIM elevation or a small fixed group of break-glass accounts.
azure-cloud-scannerRBAC: Contributor role assigned at subscription scope to principal …Contributor at subscription scope grants full management of all resources (read+write+delete on every resource type). Long-lived assignments at sub-scope flagged as least-privilege violations.
azure-cloud-scannerRBAC: User Access Administrator role assigned at subscription scope to principal …UAA at subscription scope can grant ANY role to ANY principal — equivalent to a privesc primitive. Auditors expect this assigned only to audited break-glass identities.
aws-apigateway-auditor new in EE 0.3.9 (1050)API Gateway REST/HTTP API has methods/routes with NONE authorization — endpoint exposed without authenticationFor Serverless-Framework deployments fronted by API Gateway, the per-method/route authorization type is the canonical CC6.1 entry-point evidence. NONE = CRITICAL; AWS_IAM / COGNITO_USER_POOLS / JWT = PASS; JWT with wildcard audience = INFO with explicit IdP issuer/audience evidence (precedent: Thread CT.5 OIDC heuristic); Lambda authorizer = INFO with manual-verification prompt for the authorizer Lambda function.
aws-lambda-auditor new in EE 0.4.0 (1080)Lambda function exposes a public function URL with AuthType: NONE + permissive resource-policy principalLambda function URLs that bypass IAM authorization are CC6.1 entry-point exposures. Combined with permissive resource-policy principals (e.g., Principal: "*"), this is the Serverless equivalent of an open-to-the-internet admin panel. Maps to CC6.1 + CC6.6.
aws-secrets-ssm-auditor new in EE 0.4.0 (1090)SSM Parameter classified String (not SecureString) but has a secret-suggestive name (e.g., db_password, api_token)Plain String SSM parameters are not KMS-encrypted at rest and are readable by any principal with ssm:GetParameter. Secret-suggestive name detection (NFC-normalized at boundary against Unicode-confusable bypass) flags principals storing secrets in the wrong parameter type. ZDE-critical: scanner NEVER calls GetSecretValue / GetParameter — only metadata APIs; verb-prefix denylist regex enforces this at the SDK boundary.
aws-iam-effective-decrypt-path-auditor new in EE 0.4.0 (1110)IAM principal has effective kms:Decrypt path via NotAction grant — implicit decryptCross-plugin reconciler walks IAM policies for explicit and implicit decrypt grants (Allow + NotAction:[…] + Resource:* over-grants decrypt by exclusion), then cross-references against destination KMS key policies (plugin 1070) to compute the effective decrypt path. Closes the institutional NotAction-implicit-decrypt false-PASS class.
aws-codepipeline-codebuild-auditor new in EE 0.4.0 (1100)CodePipeline IAM role has wildcard Action: "*" on Resource: "*" — overprivileged service roleThe CodePipeline service role typically runs end-to-end build/deploy. A wildcard Action turns the build path into an effective admin grant. Maps to CC6.1.

CC6.2 — User identification and authentication

SourceExample findingWhy it violates CC6.2
auth_agentSNMP default community string 'public'Default communities violate authentication uniqueness.
auth_agentAnonymous FTP access enabledAnonymous access bypasses identification entirely.
auth_agentTelnet service enabled (cleartext protocol)Cleartext credentials cannot satisfy identification integrity.

CC6.6 — Logical access boundaries and network segmentation

SourceExample findingWhy it violates CC6.6
exposure_agentDatabase port 3306 (mysql) openDatabases reachable from outside the trust boundary violate segmentation.
exposure_agentManagement port 22 (ssh) openAdmin interfaces should be segmented from production network.
exposure_agentLateral movement risk: SMB + RDP both openCo-located admin services fail lateral-movement-prevention requirement.
config_agentRPC portmapper open on Linux hostRPC widens attack surface across segmentation lines.
azure-cloud-scannerNSG rule "…" allows inbound from * on port …Azure NSG inbound rules permitting * / 0.0.0.0/0 / Internet source on management or service ports break network-boundary protection. One issue per permissive rule with source prefix and port range. Anchored regex ~/^NSG rule .* allows inbound/ excludes future SDK-error strings.
aws-apigateway-auditor new in EE 0.3.9 (1050)API Gateway REST stage has no WAFv2 WebACL associatedThe Stage-level WAF association on a REST API is the canonical CC6.6 network-boundary control at the edge. MEDIUM when missing on REST. HTTP API stages emit a stage-waf-not-applicable INFO with the CloudFront-front architectural caveat (HTTP APIs don't support direct WAF — the boundary lives at the CloudFront distribution).
aws-dynamodb-auditor new in EE 0.3.9 (1060)DynamoDB table has no resource policy denying DeleteItem / UpdateItem for non-audit-writer principalsFor audit-store / payroll / financial-batch tables, the table-level resource policy encodes the access boundary INDEPENDENTLY of IAM-policy drift. Surfaced via the 2024 GetResourcePolicy API with soft-degrade for older SDKs (INFO disclosure when SDK is too old). Fine-grained boundary evidence per CC6.6.
aws-backup-auditor new in EE 0.4.0 (1130 — headline thread)Air-gapped backup vault: destination KMS key policy grants Decrypt/ReEncrypt*/GenerateDataKey to a source-account principal — air-gap brokenFor LogicallyAirGappedBackupVault resources (AWS's cryptographically-isolated WORM vault primitive — the canonical institutional ransomware-defense control), the cryptographic-isolation guarantee depends on the destination KMS key policy denying source-account decrypt. The 12-dimension attestation arc verifies across 6 primary mechanisms (vault TYPE air-gapped + ARN account-segment-separation + KMS key-policy clean + KMS Grants clean + MRK-replica topology clean + source-account VPC-endpoint policy clean) plus 6 substrate dimensions. NotPrincipal/NotAction Allow conservatively treated as universal-allow (false-PASS closure). One finding per broken isolation mechanism; CC6.6 mapping is 18 of the 74 new soc2.json titlePatterns added in 0.4.0.
aws-backup-auditor new in EE 0.4.0 (1130)Source-account VPC endpoint policy for com.amazonaws.<region>.kms grants decrypt-class actions to source-account or wildcard principal — VPC-endpoint bypass of air-gapEE-RT.12.22 6th-dimension verifier. VPC endpoint policies can grant decrypt path INDEPENDENTLY of IAM and KMS key policies — the institutional class equivalent to the IAM Effective Decrypt-Path plugin's NotAction-implicit-decrypt class, applied to the VPC-endpoint substrate. Filters DescribeVpcEndpoints to KMS service endpoints, walks policy statements, surfaces any source-account-Principal or wildcard-Principal grant of decrypt-class actions. Per-region enumeration memoized within run(); pagination via NextToken with truncated: true gating PASS verdicts.
aws-ec2-sg-perimeter-auditor new in EE 0.6.6 (1170 v3)Security Group sg-… is transitively reachable from the internet — shortest chain = 2 hops (public-ALB-SG → sg-…)EE-RT.16 v3 SG→SG transitive chain reachability: a BFS graph-walk over UserIdGroupPairs references finds SGs that look "private" in isolation (no direct public-CIDR ingress rule) but are reachable through a chain of SG-references from a publicly-exposed SG. The operator-blindness principle rates this HIGH at 2-hop depth (one indirection from a public root). Pre-v3, plugin 1170 audited each SG in isolation — a common multi-tier topology (public-ALB-SG → app-SG → db-SG) would pass all per-SG checks while silently re-opening the perimeter through the SG-reference chain. walkthroughRequired: true surfaces per-hop port records for manual alignment verification (v4 candidate: intersect per-hop port sets). Cross-VPC edges deferred.
aws-ec2-sg-perimeter-auditor new in EE 0.6.6 (1170 v3)Security Group sg-… is transitively reachable from the internet — shortest chain = 3+ hops (deep chain)EE-RT.16 v3: same BFS walk as the 2-hop case, rated CRITICAL at depth ≥ 3. The operator-blindness principle applies in reverse: the deeper the chain, the less likely an operator notices the exposure — a finding that wouldn't be caught by any per-SG audit dim surfaces only when the full graph is walked. An attacker who pivots through the ALB into the app tier then has SG-policy clearance to talk to the db tier on its declared port, 3+ hops from any public CIDR. Depth cap (default 5, max 20) operator-tunable via transitiveChainDepthCap. Opt out via skipTransitiveReachability: true.
aws-ec2-sg-perimeter-auditor new in EE 0.6.6 (1170 v3)[plugin 1170] SG→SG transitive reachability walk truncated — raise transitiveChainsPerTargetCap or transitiveChainDepthCapEE-RT.16 v3 INFO evidence-gap trailer: emitted when the BFS walk hits the per-target chain cap (default 10) or the depth cap (default 5). Distinguishes "raise chainsPerTargetCap" from "raise depthCap" with separate reason strings — so auditors know whether the truncation was breadth-bounded or depth-bounded. False-CLEAN class: a deeply-buried CRITICAL exposure beyond the depth cap would not surface without raising the cap. Per-region per-SG truncation count surfaced in details.truncatedTargetCount.

CC6.7 — Data in transit protection

SourceExample findingWhy it violates CC6.7
crypto_agentTLSv1 enabled on port 443TLS 1.0 / 1.1 / SSLv2 / SSLv3 deprecated. (Mapping correctly excludes TLS 1.2 / 1.3.)
crypto_agentWeak cipher suites on port 443RC4, DES, NULL break in-transit confidentiality guarantee.
crypto_agentWeak key exchange algorithmsWeak KEX compromises confidentiality retroactively.
crypto_agentExpired TLS certificateExpired certs invalidate the in-transit trust chain.
crypto_agentSelf-signed TLS certificateCertificates from trusted CAs required in production.
crypto_agentMissing HSTS header on HTTPSHSTS is the baseline defense against TLS-stripping.
aws-apigateway-auditor new in EE 0.3.9 (1050)API Gateway custom domain configured with TLS_1_0 security policyFor Serverless deployments with custom domains, the API Gateway TLS policy is the canonical CC6.7 in-transit protection control at the edge. TLS_1_0 = HIGH; TLS_1_2 / TLS_1_3 = PASS; unknown/missing = MEDIUM. Includes worst-policy tracking across mixed-config v2 domains (R1-CRITICAL-1 fold) — pre-fold the picker was INVERTED, upgrading TLS_1_0TLS_1_2 across mixed configs and masking deprecated listeners as PASS.

CC6.8 — Prevention and detection of unauthorized or malicious software

SourceExample findingWhy it violates CC6.8
service_agentEnd-of-life Apache 2.2.x on port 80EOL software no longer receives security updates.
intelligence_engineCVE-2023-38408 — OpenSSH 8.2p1Matched CVEs evidence unpatched components.
config_agentServer version disclosed: nginx/1.18Banner disclosure enables reconnaissance of vulnerable versions.

CC7.1 — Detection of changes to system configurations / vulnerabilities

This is the vulnerability-management control. Major audit firms typically interpret CC7.1 as requiring automated scanning, even though SOC 2 itself never uses the phrase "vulnerability scanning."

SourceExample findingWhy it violates CC7.1
intelligence_engineCVE-2023-38408 (CVSS 9.8) — OpenSSH 8.2p1CVE matching is the canonical CC7.1 evidence per major audit-firm guidance.
service_agentEnd-of-life Apache 2.2.xEOL detection is a positive CC7.1 signal.
config_agentDebug endpoint(s) exposed on port 8080CC7.1 expects detection of misconfigurations introducing vulnerability.
config_agentHTTP directory listing enabled on port 80Misconfiguration introducing vulnerability.
aws-s3-auditorAccess logging not enabled — audit trail gapS3 server-access logs are the canonical AWS evidence stream for object-level access detection. Without them, post-incident forensics has no log to walk.
aws-cloudtrail-auditorTrail X has log file validation disabled (LogFileValidationEnabled=false)Without log-file validation, CloudTrail cannot detect post-hoc log tampering — the auditor's primary forensic record can be silently modified. New in EE 0.3.7 (plugin 1040, was 040 pre-0.3.9 plugin-ID rename).
aws-apigateway-auditor new in EE 0.3.9 (1050)API Gateway stage has no AccessLogSettings.DestinationArn — endpoint-level request log missingFor Serverless-Framework deployments, the API Gateway access log is the canonical CC7.1 detection-of-changes evidence at the entry point. Without it, post-incident forensics has no per-request log to walk. MEDIUM.
aws-dynamodb-auditor new in EE 0.3.9 (1060)CloudTrail does not log AWS::DynamoDB::Table data events while DynamoDB tables exist — the audit-the-auditor gapThe canonical "audit-the-auditor" failure: a malicious insider with dynamodb:PutItem on an audit-store table can write false records (or delete real ones) and no log records the action. Cross-references caller-supplied opts.trailDataEvents from plugin 1040 — orthogonal plugin composition. HIGH when coverage absent + tables exist.
aws-codepipeline-codebuild-auditor new in EE 0.4.0 (1100)CodePipeline latest execution is older than the configured cadence — stale build pipelineEE-RT.9.1 runtime-state audit: if the pipeline's latest execution is older than the configured cadence, it isn't actively defending the build path. CC7.1 detection-of-change evidence on the build-pipeline substrate itself.
aws-backup-auditor new in EE 0.4.0 (1130)Backup vault has no Restore Testing Plan — recoverability never exercisedThe institutional ransomware-defense pattern requires periodic restore-testing to verify recoverability. A vault with no associated Restore Testing Plan has no evidence that the backups CAN be restored — the canonical "backups exist but are dead" failure mode. Maps to CC7.1 detection of recoverability change.
aws-s3-lifecycle-replication-auditor new in EE 0.4.0 (1120)S3 cross-region replication source has no destination-bucket reachability — silent replication failureEE-RT.4.1 closes the silent-PASS class where replication source FAILED but emitted clean: cross-region destination-bucket reachability is verified (destination IAM denial or bucket missing surfaces explicitly rather than the source-side "configured" status masking the actual failure).
aws-inspector2-guardduty-auditor new in EE 0.6.5 (1200)EventBridge rule has a dead target — Lambda function deleted, SNS topic detached, or SQS queue non-existent (companion LOW alongside PASS)EE 0.6.5 dead-target companion-LOW: even when an EventBridge rule exists and has targets (events:ListTargetsByRule returns non-empty), per-target liveness probes verify that each target actually exists. A rule whose target ARN points to a deleted Lambda, detached SNS topic, or missing SQS queue silently drops every finding it routes — the detection substrate is present on paper but non-functional. EE 0.6.5 surfaces this as a companion LOW alongside the PASS verdict with the dead ARNs listed. Routes to CC7.1 (substrate-with-dead-targets). Three target types covered: Lambda (lambda:GetFunction full qualified ARN — alias/version correctness verified server-side), SNS (sns:GetTopicAttributes), SQS (sqs:GetQueueUrl + sqs:GetQueueAttributes partition-aware for GovCloud / aws-cn / ISO). Opt out: skipTargetLivenessProbe: true.

CC7.2 — Monitoring of system components and operation for anomalies Covered in EE 0.3.7 · hardened in 0.3.8

"The entity monitors system components and the operation of those components for anomalies that are indicative of malicious acts, natural disasters, and errors affecting the entity's ability to meet its objectives."

EE 0.3.7's new aws-cloudtrail-auditor (plugin 040) closes the previously-partial CC7.2 coverage by auditing the AWS-native monitoring substrate end-to-end: CloudTrail trail health, CIS AWS Foundations Benchmark v1.5 §3.1–3.14 alarm coverage, and AWS Config recorder state. EE 0.3.8's v2 metric-filter audit replaces the v1 alarm-name-substring heuristic with the auditor-canonical logs:DescribeMetricFilters evidence stream, and the multi-region trail enumeration is now ON by default (36 canonical AWS regions; region-list version stamp 2026-05).

SourceExample findingWhy it violates CC7.2
aws-cloudtrail-auditorCloudTrail: no trails configured for this account — zero audit log coverageZero trails = zero management-plane event capture. Issue text includes an AWS Organizations sub-account OrgTrail caveat (details.possibleOrgTrailMember: true) so reviewers know when to verify centrally aggregated coverage. CRITICAL.
aws-cloudtrail-auditorTrail X is not multi-region (IsMultiRegionTrail=false)A single-region trail blinds the auditor to out-of-region API activity — attacker-pivoted regions go unmonitored. CIS AWS Foundations 1.5 §3.0 + SOC 2 institutional guidance both require IsMultiRegionTrail=true. HIGH.
aws-cloudtrail-auditorTrail X does not log data events (S3 object-level / Lambda invocation)Without data events, the auditor sees no object-level access evidence — exfiltration via GetObject is invisible. Handles both classic EventSelectors.DataResources and modern AdvancedEventSelectors. MEDIUM.
aws-cloudtrail-auditorTrail X is configured but logging is stopped (IsLogging=false)The monitoring substrate must be ACTIVE. A trail configured but with IsLogging=false captures no events. HIGH.
aws-cloudtrail-auditorCloudWatch alarm missing: Root account usage (CIS cis-3.3)CIS Foundations Benchmark 1.5 §3.1–3.14 enumerates the canonical 14 alarm classes; the plugin emits ONE finding per missing class. Severity per institutional audit-firm practice: cis-3.3 = CRITICAL; cis-3.2 / 3.5 / 3.7 / 3.8 / 3.9 = HIGH; remaining 9 classes = MEDIUM. EE 0.3.8 v2 evidence: filterPresent: true, covered: false distinguishes "filter exists but no alarm correlated" from "no filter at all" (different remediation templates).
aws-cloudtrail-auditorCross-account LogGroup AccessDenied during v2 metric-filter auditAggregate HIGH evidence-gap finding (details.evidenceGap: true, cisId: "cis-coverage-partial-v2") when a trail in App-Account ships to a Security-Account LogGroup that the scanner cannot read. Closes the institutional false-negative class where pre-fold v2 would have emitted bogus "filterPresentNoAlarm" findings instead. EE 0.3.8.
aws-cloudtrail-auditorAWS Config has no configuration recordersAWS Config provides resource-state change history; without it, the auditor has no configuration-drift evidence stream. EE 0.3.8 routes by AWS Organizations ConfigurationAggregator presence + STS GetCallerIdentity account-coverage cross-reference: org/account-list aggregator with the current account in source list → no finding (deterministic PASS); not in any list → HIGH (real CC7.2 evidence gap); no aggregator visible → HIGH (preserves pre-0.3.8 behavior). HIGH.
aws-cloudtrail-auditorTrail bucket has no Object Lock (SEC 17a-4 / FINRA 4511 WORM evidence)Per-trail S3 destination audit (EE 0.3.8 EE-RT.1.4): Object Lock GOVERNANCE mode emits CRITICAL (bypass-able via s3:BypassGovernanceRetention); no Object Lock emits CRITICAL; retention below applied baseline (default 7y SEC 17a-4) emits MEDIUM. Maps to BOTH CC7.2 (monitoring substrate storage layer) and C1.2 (disposal of confidential info).

CC7.3 — Evaluation of security events to determine response Covered in EE 0.3.7

"The entity evaluates security events to determine whether they could or have resulted in a failure of the entity to meet its objectives (security incidents) and, if so, takes actions to prevent or address such failures."

EE 0.3.7 closes the previously-partial CC7.3 coverage by evidencing the AWS-canonical event-evaluation primitive: CloudWatch alarm coverage tied to the CIS §3.1–3.14 baseline. CloudWatch alarms convert raw CloudTrail events into actionable signals routed to SNS topics, PagerDuty, etc. — an alarm class with no alarm = no automated evaluation path = security events accumulate without triggering response.

SourceExample findingWhy it violates CC7.3
aws-cloudtrail-auditorCloudWatch alarm missing: Root account usage (CIS cis-3.3)CloudWatch alarms are the AWS-canonical evaluation-and-routing primitive. Missing alarms means no automated evaluation path for this event class.
aws-cloudtrail-auditorTrail X has log file validation disabledCC7.3 evaluation requires trustworthy evidence. Without LogFileValidationEnabled, the auditor cannot verify post-incident that the events used in the evaluation were unmodified.
aws-cloudtrail-auditorFilter pattern matches CIS hint but no alarm correlates (cis-alarm-coverage-filter-no-alarm)EE 0.3.8 v2 metric-filter audit category — distinct from "no filter at all" because the gap is in the routing not the capture. Routes to a different remediation template. Issue text mentions Lambda subscription filters / Kinesis Firehose / non-CloudWatch routing alternatives + auditor cross-check via aws logs describe-subscription-filters (avoids false-positives for shops routing via SIEM bypass).

Auditor evidence pack: the per-scan summary.cisAlarmCoverage shape carries evidenceMethod: "metric-filter-correlation-v2" (default; v2 auditor-canonical evidence stream) or "alarm-name-substring-heuristic-v1" + v2FallbackReason (transparency layer when v2 unavailable). summary.scanScope carries {regionsScanned[], regionsWithAccessDenied[], regionsWithCredentialFailure[], regionListVersion: "2026-05", callerIdentity, configAggregators, s3DestinationAudit, throttleRetriesByApi, throttleBudgetExhaustedByApi} — every multi-region / cross-account / split-IAM evidence gap surfaces honestly.

C1.1 — Identification and disposition of confidential information

(Only assessed if Confidentiality is in your audit scope — this is one of the optional categories.)

SourceExample findingWhy it violates C1.1
aws-s3-auditorNo public access block configuredPublic-readable S3 buckets violate confidentiality boundary.
aws-s3-auditorPartial public access block — missing one or more settingsAuditors expect all four settings (BlockPublicAcls / IgnorePublicAcls / BlockPublicPolicy / RestrictPublicBuckets). A partial PAB still leaves at least one bypass route.
aws-s3-auditorBucket policy grants public accessPermissive bucket policy violates confidentiality boundary at storage layer.
aws-s3-auditorNo default encryption configuredC1.1 requires encryption-at-rest for confidential data.
aws-s3-auditorServer-side encryption uses AES256 (not KMS-CMK)KMS customer-managed keys give you rotation, audit, and crypto-shredding control that AES256 (AWS-managed) does not. Severity LOW by default; MEDIUM when bucket name matches AWS_S3_AUDIT_CONFIDENTIAL_BUCKETS.
azure-cloud-scannerStorage account default network access is set to AllowAzure Storage accounts with defaultAction: Allow on networkRuleSet accept connections from any IP unless an explicit deny rule fires (equivalent to AWS BlockPublicAcls=false). For confidential workloads, auditors expect defaultAction: Deny + an explicit allow-list of approved networks / private endpoints.
azure-cloud-scannerStorage account allows public blob accessallowBlobPublicAccess=true permits anonymous read access to any container marked public. Direct confidentiality-boundary violation. Auditors require allowBlobPublicAccess=false + container-level public access (AccessLevel.Blob / AccessLevel.Container) also disabled.
aws-dynamodb-auditor new in EE 0.3.9 (1060)DynamoDB table encrypted with AWS-managed KMS key (:alias/aws/dynamodb) — not customer-rotatableCustomer-managed KMS aliases (:alias/<customer-alias>) → PASS; AWS-managed alias (:alias/aws/dynamodb) → MEDIUM (not customer-rotatable); :key/UUID ARN form → LOW unverifiable with explicit aws kms describe-key verification prompt. In EE 0.4.0 the LOW-unverifiable case becomes a deterministic PASS/MEDIUM when plugin 1070 is in the same scan (the _describeKeyManager() helper exported by 1070 is consumed by 1060 via opts.keyManagerByArn — closes the deferred EE-RT.2.1.1 cross-reference).
aws-kms-auditor new in EE 0.4.0 (1070)KMS key policy grants kms:* to wildcard principal — unconditional cryptographic-boundary takeoverWildcard-principal classifier across 5 severity tiers: CRITICAL unconditional kms:* takeover; HIGH for sensitive actions (kms:Decrypt, kms:ScheduleKeyDeletion); INFO read-only-only; PASS no-wildcard. Coverage spans Principal.AWS / Federated / Service / CanonicalUser shapes + case-insensitive AWS/action matching + NotPrincipal-Allow + NotAction-Allow + glob-action coverage (kms:Encrypt* / kms:Sign*). Maps to CC6.3 + C1.1. 77 new tests.
aws-lambda-auditor new in EE 0.4.0 (1080)Lambda function uses EOL runtime (e.g., nodejs16.x, python3.7) — institutional-CRITICALRuntime EOL detection is case-normalized at the SDK boundary per aws_string_case_normalization (institutional-CRITICAL fold from the 0.4.0 review cycle: pre-fold a runtime string returned by Lambda with different casing would silently bypass the EOL set check). Closes the runtime-EOL false-PASS class.

C1.2 — Disposal of confidential information New in EE 0.3.2 · Substantially deepened in EE 0.4.0 (plugin 1130)

"The entity disposes of confidential information to meet the entity's objectives related to confidentiality."

(Only assessed if Confidentiality is in your audit scope — same as C1.1.)

NSAuditor evidences the disposal control by detecting buckets that lack the institutional WORM and tamper-resistance primitives. SEC Rule 17a-4 and FINRA 4511 require S3 Object Lock in COMPLIANCE mode — auditors specifically reject GOVERNANCE-mode buckets as evidence stores because the override permission (s3:BypassGovernanceRetention) is by design, not an emergency break.

SourceExample findingWhy it violates C1.2
aws-s3-auditorObject Lock not configuredS3 Object Lock is the institutional WORM control. Without it, retention windows cannot be cryptographically enforced — an insider with bucket-write IAM can delete confidential records before retention expires. Maps to SEC Rule 17a-4 / FINRA 4511.
aws-s3-auditorObject Lock GOVERNANCE mode (use COMPLIANCE for WORM)Object Lock has two modes: COMPLIANCE (immutable — not even root can delete before retention expires) and GOVERNANCE (any principal with s3:BypassGovernanceRetention can delete). Auditors reject GOVERNANCE-mode buckets as evidence stores. The Object-Lock-enabled bit alone is not sufficient evidence of WORM.
aws-s3-auditorMFA Delete not enabledVersioning alone is not tamper-resistant — a single insider with bucket-write IAM can permanently delete a version. MFA Delete requires a second factor at delete-version time. Only emitted when versioning is enabled (otherwise the finding is meaningless).
aws-backup-auditor new in EE 0.4.0 (1130 — headline thread)Backup vault is NOT a LogicallyAirGappedBackupVault — no cryptographic-isolation guarantee on the disposal substratePer SEC Rule 17a-4 and FINRA 4511, the disposal substrate for confidential records must guarantee tamper-resistance under insider compromise. AWS's LogicallyAirGappedBackupVault is the canonical institutional control. Vault TYPE attestation is the 1st of 6 cryptographic-isolation mechanisms verified by EE-RT.12.8. 25 of the 74 new soc2.json titlePatterns added in 0.4.0 map to C1.2 — making this the most-evidenced control in the 0.4.0 release.
aws-backup-auditor new in EE 0.4.0 (1130)Air-gapped vault has KMS Grants on the destination key with source-account GranteePrincipal + decrypt-class Operations — Grants bypassEE-RT.12.11 4th-dimension verifier. KMS Grants bypass the key-policy entirely; an insider compromise of the source account can use a previously-issued Grant to decrypt vault contents even when the key policy is clean. Closes the institutional class where the KMS key-policy clean attestation alone produces false-clean evidence.
aws-backup-auditor new in EE 0.4.0 (1130)Air-gapped vault destination KMS key has an MRK replica in the source account — multi-Region Key topology breaks the air-gapEE-RT.12.12 5th-dimension verifier. KMS multi-Region Keys (MRKs) share key material across replicas; an MRK replica in the source account decrypts the vault contents independently of the destination key. The verifier checks: no MRK replica in source account, primary not in source account, primary key region matches vault region.
aws-iam-effective-decrypt-path-auditor new in EE 0.4.0 (1110)IAM principal has effective decrypt path to a confidential-data KMS key via cross-policy reconciliationDisposal-substrate integrity depends on the effective set of principals that can decrypt — not just the explicitly-named ones in any single policy. The cross-plugin reconciler walks IAM + KMS key-policies together, surfacing the effective decrypt-capable principals. Maps to C1.2 + C1.1.

Severity classifier: AWS_S3_AUDIT_CONFIDENTIAL_BUCKETS=name1,name2 (comma-separated, case-insensitive substring match) escalates the C1.2 + KMS-CMK findings from LOW to MEDIUM for matched buckets. Tag-based classification is planned for v0.4.0.

⚠ Partial controls — single-dimension evidence

NSAuditor evidences one dimension of these controls (typically the configuration-state-at-this-moment dimension). The CADENCE / multi-period / process dimension requires additional evidence sources. The renderer surfaces a ⚠ Coverage caveat: line on every partial control.

ControlTSC titleWhat we evidenceWhat's missing (and from where)
CC6.3 System access removal and modification Stale IAM access keys, multiple active keys (aws-iam-deep-auditor) Removal cadence — recurring-scan attestation provides the multi-period evidence dimension.
CC8.1 Change management and authorization Snapshot of current configuration + scanner version delta detection Multi-scan delta detection (CTEM) and change-authorization linkage (ITSM / Git PR webhook).
A1.2 substantially deepened in EE 0.4.0 Environmental protections, software, data backup processes, recovery infrastructure Exposed-availability-target inventory + S3 versioning posture + GRC connector duration cap + S3 cross-region replication topology (aws-s3-lifecycle-replication-auditor, plugin 1120) + AWS Backup substrate end-to-end via aws-backup-auditor (plugin 1130 — Plans, Vaults, Recovery Points, Selections, Frameworks, Restore Testing Plans, ReportPlans, Legal Holds, VaultType, Vault Tags, Vault Access Policy). The 12-dimension air-gapped vault attestation arc for LogicallyAirGappedBackupVault resources substantially closes the previously-documented "Backup/recovery posture itself" gap. 14 of the 74 new soc2.json titlePatterns added in 0.4.0 map to A1.2. Cadence dimension (recurring-scan attestation of recovery-test outcomes) — moves A1.2 to covered via EE-SOC2.9 recurring-scan attestation. AWS RTO/RPO infrastructure attestations remain the canonical pair on the cloud-provider side.
PI1.5 new in EE 0.3.9 Stored items — processing integrity DynamoDB storage substrate audit (aws-dynamodb-auditor, plugin 1060): per-table PITR + deletion protection, KMS-CMK classifier with conservative LOW-unverifiable posture on :key/UUID ARN shapes, resource-policy presence audit, CloudTrail DynamoDB data-event coverage cross-reference (audit-the-auditor evidence) Application-tier processing integrity (write-through validation, idempotency, exactly-once semantics) — requires EE-RT.7 Lambda Runtime Assurance (planned v0.4.1+). The partialReason in soc2.json is explicit: substrate-only scope; auditor must accept the LOW-PARTIAL confidence.

⚪ Out of scope — what network scanning fundamentally cannot evidence

A SOC 2 audit covers technical, administrative, and physical controls. NSAuditor evidences the technical-network-and-cloud slice. Everything else is genuinely not our job — pretending otherwise would create what auditors call "scope illusion": the false belief that buying a scanner replaces governance work.

TSC familyWhy scanning can't evidence itWhat you need instead
CC1.1–CC1.5Governance / ethics / board oversight (COSO Principles 1–5)HR systems, signed Code of Conduct, board minutes, org charts
CC2.1–CC2.3Internal/external policy communicationCorporate communication policies, awareness-training logs, whistleblower hotline
CC3.1–CC3.4Enterprise risk identification (technical vuln ≠ enterprise risk)Risk register, vendor questionnaires, executive risk meetings
CC4.1, CC4.2Governance-layer monitoring of internal controlsSOC management reviews, control-effectiveness audits. Partial via tabletop simulation.
CC5.1–CC5.3Policy and procedural controls at governance layerDocumented policies and procedures
CC9.1, CC9.2Business continuity, vendor management, cyber insuranceBCP, DR tabletop logs, vendor SLA reviews, cyber-insurance policy
CC6.4 / CC6.5Physical access (keycards, cameras, data center)Keycard logs, security cameras, data-center SOC 2 attestations (AWS / GCP / Azure)
PI1.1–PI1.4Application-logic correctness (input quality, processing accuracy, completeness, traceability)App unit / integration tests, code-review records. PI1.5 (Stored items) now PARTIAL via plugin 1060 DynamoDB Audit Integrity — EE 0.3.9.
P1.0–P8.0Application-level data handling and disclosurePrivacy policy, DSAR workflows, consent management

The renderer emits all of these as out_of_scope controls in every gap report — auditors immediately see the engine's known boundaries and don't have to guess what wasn't evaluated.

Type I vs Type II support

Audit typeNSAuditor supportEvidence produced
Type I — point-in-time control design Full Single scan + cover-page attestation + integrity hashes + TSA timestamps.
Type II — operating effectiveness over 6–12 months Supported Recurring-scan attestation + SLA / MTTR tracking with per-severity thresholds + suppression renewal cadence + version-delta detection across scans + quarterly trend analysis.

Recurring-scan attestation

The recurring-attestation module discovers prior scans, filters by your assessment window, detects cadence gaps and scope drift, and emits a chronological matrix. Compliance status taxonomy:

SLA & MTTR tracking

Per-severity SLA thresholds from sla.json. Three statuses per finding: compliant, approaching (default 75% of threshold), breached. The renderer separates breachedTotal (raw count of all overdue findings) from breachedEffective (post-compensating-control). Auditors read both — breachedEffective > 0 is a hard CC7.1 finding.

Suppressions with status: accepted_risk + non-empty compensating_control flip a finding's effective SLA status from breachedbreached_with_compensating_control. The renderer surfaces an inline disclaimer requiring auditor verification of each compensating-control text.

Suppression workflow — the "what about false positives?" answer

Every real scan produces findings the security team has triaged out — false positives, accepted risks with compensating controls, etc. SOC 2 auditors reject silent deletion of findings (looks like under-reporting) but accept documented exclusions when each one carries a specific match, a non-empty rationale, and an approver.

The compliance engine reads out/<scan-id>/suppressions.json if present and enforces all three fields. Suppressions missing any of them are rejected and the underlying finding stays in fail status — the engine refuses to silently absorb undocumented suppressions.

CLI

# Create a new suppression (auto-generates id, approvedAt, expiresAt) $ nsauditor-ai compliance suppress --finding-id <id> --status accepted_risk # Walk scan history, classify each suppression as active / approaching / expired / no_expiry $ nsauditor-ai compliance review # Refresh expiry; appends renewal entry (audit trail) capturing previous + new expiresAt + approver + rationale $ nsauditor-ai compliance renew --finding-id <id>

Per-status default expiry

Cryptographic signing & identity verification

Each suppression can be Ed25519-signed with signSuppression(). The signature payload is NFC-normalized per RFC 5198 and capped at 64KiB. Verification via verifySuppression() or verifyAgainstRegistry() cross-references identity-registry public keys.

Approvers are validated against a corporate identity registry binding names to Ed25519 public keys and authorization scopes (which frameworks an approver may authorize suppressions for). The suppression-audit module detects governance gaps — late renewals, per-approver patterns, quarterly cadence trends — surfaced as governance bands (HEALTHY / ACCEPTABLE / DEFICIENT / CRITICAL).

Where suppressions show up in the report

Every suppression appears in Appendix B — Accepted Risks & False Positives with control ID, finding text, status (accepted_risk vs false_positive), approver, rationale, and renewal chain. Expired suppressions surface as report.expiredSuppressions[] with a "REVIEW REQUIRED" callout when non-empty.

GRC platform integration — Vanta

The Vanta connector maps NSAuditor findings to Vanta TestResult objects and pushes them via API. Drata and Secureframe are on the roadmap.

Outcome mapping

NSAuditor statusVanta outcome
passpassed
fail (all violations compensated)passed_with_compensating_control
fail (any uncompensated)failed
partialfailed (Vanta has no partial; partialReason in description)
accepted_riskpassed_with_compensating_control
false_positivepassed

Reliability features

WORM evidence storage — S3 Object Lock

Write-Once-Read-Many archival for SEC Rule 17a-4 / FINRA 4511 audit compliance. The module ships with strict fail-CLOSED Object Lock validation:

Tabletop simulation — CC4.1 / CC7.3 monitoring evidence

Structured probe-event manifest + SIEM detection correlation proving the organization tests its monitoring controls. You define probe events (what you tested), import SIEM detection events (what was detected), and the correlator produces auditor-grade evidence: detection coverage percentage, per-category breakdown, undetected-probe list, unmatched-SIEM-event list.

Coverage bands (configurable)

Correlation guarantees

Comparison vs the market

Caveat: competitor capability lists evolve quickly; this table reflects publicly-available 2026-Q1 product documentation. Verify against your actual contract before relying on these comparisons.

Capability GRC platforms
(Vanta / Drata / Secureframe)
Legacy scanners
(Tenable / Qualys / Rapid7)
NSAuditor AI EE
Workflow automation + auditor portalintegrates with GRC platforms (push)
Native vulnerability scanning— (relies on 3rd-party)✓ deep enterprise scanning
TSC control mapping per findingpolicy/config only — not vuln findingspartial — policy-pack mapping, not per-finding✓ direct per-finding mapping with rationale
Cover-page Scope Attestationvaries (workflow-style)
SHA-256 chain-of-custody on report bytesvaries
RFC 3161 trusted-timestamp signing✓ opt-in via complianceTsaUrl
TSA cert chain bundling + validation✓ EKU / expiry / role validation
Documented suppression workflowworkflow only✓ engine enforces rationale + approver
Cryptographic suppression signing (Ed25519)✓ + identity-registry verification
SLA/MTTR tracking per severityvaries✓ enterprise tiers✓ configurable thresholds + approaching/breached status
Suppression renewal cadence auditing✓ per-approver, quarterly trend, governance bands
Tabletop simulation SIEM correlation✓ probe manifest + SIEM correlation + coverage
WORM evidence storage (S3 Object Lock)varies✓ COMPLIANCE-mode only; SEC 17a-4 / FINRA 4511
GRC platform API pushN/A (they are the platform)partial (plugins)✓ Vanta native; Drata / Secureframe planned
Air-gapped operation— SaaS-only✓ on-prem✓ ZDE on-prem
Multi-operator concurrency safetyN/A✓ atomic file locking with stale-PID detection

Auditor FAQ — questions your CPA firm asks, answered up front

How do I verify the scope of this report wasn't manipulated post-scan?

Three layered guarantees:

What if the security team marked a real finding as "false positive" to make the report look clean?

Multiple controls prevent this:

  1. Suppressions are visible — every one is logged in Appendix B with rationale + approver.
  2. Cryptographic signing (optional) — suppressions carry Ed25519 signatures the auditor can independently verify.
  3. Identity verification — approvers are cross-referenced against a corporate identity registry with authorization-scope checks.
  4. Late-renewal flagging — suppressions renewed after expiration are flagged LATE or VERY_LATE with governance-band classification.
  5. Quarterly trend analysis — rising late-renewal rates across quarters surface as governance degradation.

How does the scanner handle clock drift?

The NTP probe measures local-clock drift against configurable NTP servers. Drift above threshold triggers a WARN or CRITICAL clock advisory on the cover page. In strict mode (complianceNtpStrict: true), critical drift aborts the compliance run entirely. Probe staleness detection classifies the gap between probedAt and generatedAt to catch backdated or stale reports.

This is a single-point-in-time scan. How does Type-II operating-effectiveness apply?

NSAuditor supports Type II evidence through several mechanisms:

Why is CC1 (control environment) marked out of scope?

CC1 is about board oversight and organizational ethics — these are inherently human / process artifacts, not network state. We could pretend, but pretending creates more audit risk than admitting the boundary. Pair NSAuditor with a GRC platform (Vanta / Drata / Secureframe) for the governance layer.

What about tabletop exercises for CC4.1 / CC7.3?

The tabletop simulation framework (EE-SOC2.14) provides probe-event manifests + SIEM detection correlation. You define what you tested, import what was detected, and the correlator produces auditor-grade evidence: detection coverage percentage, per-category breakdown, undetected-probe list, unmatched-SIEM-event list. Configurable coverage bands (50/80 liberal, 75/90 Type II, 85/95 high-assurance) classify the result as critical / acceptable / healthy.

Where can I see the canonical mapping?

The source of truth is data/compliance/soc2.json in the EE package. The full SOC 2 coverage matrix in the EE repo mirrors that file, and a test asserts the two stay in sync.

Ready to ship a SOC 2 audit?

Talk to us about an Enterprise license, or grab the EE package via npm if you've already purchased. Audit-ready evidence in under five minutes from your first scan.

→ See pricing → enterprise@nsasoft.us ★ Star on GitHub