A real walk-through of NSAuditor AI Enterprise Edition 0.6.7 running against a fictional
cloud account and a home-office router. Two scans, three plugin highlights, one auditor-grade
evidence pack. No real data was used.
EE 0.6.7 LIVE on npm22 enterprise pluginsSOC 2 AICPA TSC 2017Demo data only
⚠ All hosts, account IDs, ARNs, and findings on this page are synthetic.
AWS account 123456789012 is the AWS-canonical example account.
IPs use the 192.0.2.0/24 RFC 5737 documentation range.
Org name Acme Corp Inc is fictional. No customer data is disclosed.
Acme Corp's security engineer points NSAuditor at their AWS production account to get
a Type I-friendly pre-audit gap report. The scan enumerates opted-in regions, walks
SG ingress graphs from public-CIDR roots, and probes EventBridge target liveness with
eventual-consistency defense. Results map to AICPA TSC 2017 controls and ship signed
via RFC 3161 trusted timestamps.
acme-secops@laptop — nsauditor-ai scan
# Acme audit engineer runs the full enterprise catalog against AWS$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 scan --host aws --compliance soc2 --out ./acme-audit-evidence
[plugin] AWS EC2 SG Perimeter Auditor (1170 v3.1) ......... 9 findings [plugin] AWS Inspector / GuardDuty Auditor (1200 v6.1) ... 51 findings [plugin] AWS S3 Security Auditor (1020) .................. 3 findings [plugin] AWS IAM Deep Auditor (1010) ..................... 4 findings [plugin] AWS KMS Auditor (1070) .......................... 2 findings ...17 more plugins, 22 total, all ran clean✓ Scan complete · 132 findings across 22 plugins · 17 AWS regions✓ SOC 2 evidence written to ./acme-audit-evidence/scan_compliance_soc2.{json,html,md}✓ Chain-of-custody signed · SHA-256 sidecars · RFC 3161 timestamp affixed
Plugin 1170 v3.1 — Security Group transitive chain reachability
The headline feature in EE 0.6.7. Pre-v3 the plugin audited each SG in isolation — a SG with
no direct public-CIDR ingress passed even if it was transitively reachable from the internet
through a chain of UserIdGroupPairs references.
Operators routinely miss these paths: each intermediary SG looks "private" in isolation. v3
closes the false-CLEAN class with deterministic BFS. v3.1 (this release) dedupes graph edges
by (source, target)
so multi-port references emit one chain per distinct exposure path, not N×.
FROM THE ACME SCAN
A publicly-facing ALB security group (sg-alb-acme-edge) was found to
transitively reach the Acme production database SG (sg-db-acme-prod)
through a 3-hop chain via the API tier. Each intermediary SG was clean in isolation;
the chain was invisible to single-SG audit logic.
Pre-fold the plugin would have reported 3 chains here (one per port on the API tier's
ALB-source rule); the v3.1 dedup collapses to 1 chain with port array
[tcp:443-443, tcp:8080-8080, tcp:8443-8443] — accurate path count.
HIGH 2-hopsg-alb-acme-edge(public-ALB)→sg-cache-acme-redis(elasticache)[tcp:6379-6379]
HIGH 2-hopsg-alb-acme-edge(public-ALB)→sg-mq-acme-rabbit(message-queue)[tcp:5671-5672]
CriticalCC6.6plugin 1170 v3.1
Security Group sg-db-acme-prod is transitively reachable from a publicly-exposed Security Group via 1 chain (shortest = 3 hops)
Each chain traces a path from a public-CIDR ingress through UserIdGroupPairs SG references to this SG.
Per-hop port-flow shown but NOT intersected (operator walkthrough verifies per-hop port sets actually align).
Sample chain: sg-alb-acme-edge(public-ALB) → sg-api-acme-tier(api) [tcp:443-443, tcp:8080-8080, tcp:8443-8443] → sg-app-acme-tier(app) [tcp:8080-8080] → sg-db-acme-prod(db) [tcp:5432-5432].
Security Group sg-cache-acme-redis is transitively reachable from a publicly-exposed Security Group via 1 chain (shortest = 2 hops)
Direct exposure path from the public-ALB SG to the ElastiCache Redis SG on port 6379. ALB→Redis paths
are common after a "let everything inside the VPC talk" mis-configuration; the chain is invisible to
per-SG audits.
Cross-VPC peering and Transit Gateway connectivity surface as a separate audit dimension
(plugin 1160 VPC Endpoints / PrivateLink Auditor + future VPC peering inventory). 3 cross-VPC
UserIdGroupPair references were observed and skipped from the BFS walk; operator walkthrough
should verify these paths separately if cross-VPC connectivity is in scope.
Auditors need detection-substrate evidence per CC7.1. Plugin 1200 enumerates opted-in AWS
regions and checks GuardDuty Detector enablement, protection-feature coverage, Inspector2
activation, and scan-target coverage. v6.1 (this release) closes the CloudWatch Logs probe
retry-on-empty parity — freshly-created log groups now retry once before classifying DEAD,
matching the eventual-consistency defense for IAM / Lambda / SNS / SQS branches.
Region
GuardDuty
Inspector2
Alerting destination
Verdict
us-east-1
ENABLED, 4/6 features
ENABLED, EC2+ECR+Lambda
EventBridge → SNS
PASS
us-west-2
ENABLED, 5/6 features
ENABLED, EC2+ECR
SecurityHub aggregation
LOW
eu-west-1
SUSPENDED
DISABLED
—
HIGH
eu-central-1
DISABLED
DISABLED
—
HIGH
ap-southeast-2
ENABLED, 6/6 features
ENABLED, all targets
EventBridge → SNS
PASS
us-gov-east-1
ENABLED, 4/6 features
ENABLED, EC2+ECR
EventBridge → Lambda
PASS
…and 11 more regions
various
various
various
mixed
HighCC7.1plugin 1200 v6.1
GuardDuty Detector is DISABLED in region eu-central-1
Zero AWS-native threat-detection in this region. Compromised workloads here would emit
no GuardDuty findings to your SIEM. Type II auditors will request evidence of equivalent
coverage (CloudTrail-based detection rules, third-party EDR) or treat this region as out-of-scope.
category: gd-not-enabledregion: eu-central-1
HighCC7.2plugin 1200 v6.1
Inspector2 is SUSPENDED in region eu-west-1 — silent CVE-detection blindness
Inspector2 status SUSPENDED still appears in BatchGetAccountStatus but emits zero CVE
findings against this region's EC2 / ECR / Lambda fleet. This is operator-blindness: the
substrate looks present in metadata but is not actually scanning.
GuardDuty in us-west-2: alerting via SecurityHub only — no proactive paging path verified
SecurityHub aggregates findings but doesn't guarantee an EventBridge rule routes them to a
pager. Companion-LOW: auditor walkthrough must confirm the aws.securityhub
EventBridge rule downstream of SecurityHub exists and has a non-empty targets list.
EventBridge rule acme-gd-routing targets a CloudWatch log group that probed empty on first attempt — retried once → LIVE
New in 0.6.1: the CWL Logs dead-target probe now passes a retry-on-result predicate to
_retryOnNotFound. First-call DescribeLogGroups returned
logGroups: [] (eventual-consistency lag on a freshly-created
/aws/lambda/acme-billing-api log group). Probe retried once after 750ms,
confirmed exact-name match, classified LIVE. Logged as an INFO substrate detail for
evidence completeness — pre-0.6.1 this would have false-DEAD.
Different mode, same engine. The same EE CLI scans an arbitrary IP host on the local network.
Acme's IT lead points the scanner at a home-office router (192.0.2.1) for a CVE
sweep + service inventory. The OUI database identifies the device vendor from the ARP MAC,
every relevant service plugin probes its port, and the AI conclusion synthesizes a
prioritized remediation plan.
DNS service banner identifies dnsmasq-2.78 — outdated; multiple CVEs apply
Banner grabbed via version.bind CHAOS-class query. Confirmed-affected:
CVE-2020-25681 (heap-based buffer overflow, CVSS 8.1),
CVE-2020-25682 (cache poisoning), CVE-2020-25687,
CVE-2017-15107 (heap overflow in EDNS0 parsing),
CVE-2022-0934, CVE-2023-28450,
CVE-2023-50387 (KeyTrap DNS exhaustion). Network appliance compromise via
DNS service would affect all DHCP/DNS resolution for connected devices.
HTTPS administrative interface on 192.0.2.1:443 — TLS 1.2 only, no server identification
TLS 1.2 negotiated with strong cipher suite, but the underlying web server emits no
identifying banner. If this hosts the device management interface, version visibility is
required for vulnerability tracking. Recommend network-level access control around the
management interface.
Network appliance vendor identified as ACME-NETWORKS via OUI (MAC 00:1F:7A:**:**:**)
OUI lookup matched 39,227-entry IEEE database. Vendor + likely device class (router
appliance, TTL=65 embedded OS) recorded for asset inventory. No vulnerability per se;
evidence captured for the host inventory section of the SOC 2 report.
AI conclusion (excerpt — auto-synthesized by the Concluder plugin)
scan_response_ai.txt
## Executive Summary
OS (from scan): Custom/Proprietary (TTL=65)
This host presents a moderate security posture with limited internet exposure. Only two
services are confirmed open to external access: DNS (port 53/UDP) and HTTPS (port 443/TCP).
The DNS service runs a significantly outdated version of dnsmasq (2.78) with multiple known
vulnerabilities, representing the primary security concern.
## Prioritized Remediation Plan
1. Update dnsmasq immediately (Priority: Critical, Timeline: 24 hours)
- Action: Update dnsmasq to version 2.89 or later via vendor firmware update
- Rationale: Addresses multiple CVEs with public exploits
2. Identify and secure HTTPS service (Priority: High, Timeline: 7 days)
- Action: Determine web server software/version behind port 443; enforce network-level ACL
3. Establish firmware management process (Priority: Low, Timeline: 60 days)
- Action: Create inventory and update schedule for network appliances
CAPABILITY SUMMARY
What's in the box — EE 0.6.7 today
Coverage is measured against AICPA Trust Services Criteria 2017. Plugin count is what auditors
actually care about — the plugins are the evidence-acquisition surface, not just a feature count.
Numbers below are current as of EE 0.6.7 / 2026-05-19.
Every scan that emits compliance findings also emits an auditor-grade evidence pack. This is
what makes the difference between "we ran a scan" and "here is the contemporaneous artifact
chain proving we ran the scan and it has not been altered since."
✓
scan_compliance_soc2.json + .html + .md Three rendering formats of the same authoritative SOC 2 mapping. JSON for GRC platform ingestion (Vanta connector ships native), HTML for auditor review, Markdown for pull-request workflows.
✓
scan_attestation_soc2.json + RFC 3161 timestamp Cryptographic attestation — Ed25519-signed envelope wrapping the SOC 2 report, with a trusted-timestamp authority counter-signature (FreeTSA or operator-supplied TSA) proving the report existed in this exact form at this exact moment.
✓
scan_chain_of_custody_soc2.json + per-artifact .sha256 sidecars Each artifact produced has a separate SHA-256 sidecar; the chain-of-custody manifest cross-links every sidecar with the producing scan ID. Tamper-evident from artifact through report through attestation.
✓
Vanta / Drata / Secureframe push connectors Native push to the GRC platform with response-body cap + per-attempt audit log + token-format pre-flight. Multi-tenant safe; per-tenant token rotation supported.
EE 0.6.7 is a patch-level cleanup cycle that closes the two reviewer-deferred items from 0.6.6.
Small change-set; big trust signal. Both folds eliminate classes of false-CLEAN findings
(where the scanner emits PASS on a substrate that's actually compromised) — the worst possible
outcome for SOC 2 evidence.
✓
Plugin 1170 v3.1 — SG-reference-graph edge dedup
Pre-fold a SG with 3 ingress perms each referencing the same source SG on different ports
emitted 3 distinct edges. The BFS treated each as a separate chain, inflating
chainCount
2-5× and exhausting per-target chain caps on noise. Hub-and-spoke topologies (common in
shared-services VPCs) silently truncated, masking deep CRITICAL exposures. Post-fold edges
dedupe by (source, target)
with ports aggregated as array. isCrossVpc
AND-aggregates conservatively (walk possibly-same-VPC chains rather than silently skip).
✓
Plugin 1200 v6.1 — CloudWatch Logs probe retry-on-empty parity
Pre-fold the CWL dead-target probe was asymmetric with the IAM / Lambda / SNS / SQS branches.
DescribeLogGroups
returns logGroups: []
(not a thrown exception) for missing groups, so the shared retry helper's thrown-NotFound
retry never fired. Freshly-created log groups probed within seconds of creation could
false-DEAD. Post-fold the helper accepts a result-based predicate; phases are mutually
exclusive (single retry total per invocation — compound paths cap at 2 network calls).
✓
4 same-session reviewer folds applied · clean review pass
0 R-CRITICAL + 0 R-HIGH + 1 R-MEDIUM + 3 R-LOW — all folded before staging. Independent
reviewer pass via two parallel agents (one per fold site) flagged 4 items; all closed
same-session. Plus 1 unanticipated structural improvement caught by a compound-path test
interaction (not by either reviewer): the two-phase restructure of the retry helper that
prevents triple-retry on compound paths.
✓
soc2.json + coverage matrix UNCHANGED
Both folds are internal — graph structure and retry policy. No new emission categories,
no new SOC 2 control coverage claimed. Institutional honesty: scope depth grows
without scope-shifting.