nsauditor-ai 0.2.15 → 0.2.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,7 +17,11 @@ NSAuditor AI is the open-source core of a privacy-first security intelligence pl
17
17
 
18
18
  ## What's New
19
19
 
20
- **Latest: CE 0.2.15 + Enterprise 0.31.3** (June 2026) — paired content bump for the Enterprise **"Enumeration-failure fleet sweep (no-silent-false-clean) + Aurora DB-cluster snapshot dimension"** cycle. The Enterprise engine closes a fleet-wide class of **enumeration-failure** false-cleans across **12 AWS plugins** a scanner that cannot enumerate a resource population now fails **CLOSED** with a routed evidence-gap instead of reading CLEAN and adds the Aurora **DB-cluster snapshot** dimension to plugin 1140 (a public `restore=all` cluster snapshot is CRITICAL, an unencrypted one HIGH; the cluster surface instance-level scans never see), with a Multi-AZ DB cluster fail-close. **No new framework, no new plugins (still 28), no coverage-matrix changes** a false-negative-hardening release. **No CE engine behavior change** (the detection + routing live in the Enterprise engine). Paired **EE 0.31.3** + agent-skill 0.2.15. **EE 0.31.3 requires CE 0.2.8+.** See [CHANGELOG.md](./CHANGELOG.md).
20
+ **Latest: CE 0.2.17 + Enterprise 0.31.4** (June 2026) — **CLI usability patch:** `--host aws,gcp,azure` now scans **one or more clouds in a single run** (comma-separated; `--host aws` for one cloud). Previously a comma list hit the SSRF guard (`getaddrinfo ENOTFOUND aws,gcp,azure`)there was no way to audit multiple clouds in one command. The `--host` `--help` now documents the comma form + warns that the `aws|gcp|azure` (pipe) form is notation (a shell treats `|` as a pipe). **CLI-only change (CE)**; Enterprise 0.31.4 unaffected (peer `nsauditor-ai >=0.2.8` unchanged). See [CHANGELOG.md](./CHANGELOG.md).
21
+
22
+ **Prior: CE 0.2.16 + Enterprise 0.31.4** (June 2026) — paired content bump for the Enterprise **"Cloud-scan presentation false-clean fix + `--compliance all` / fail-fast validation"** cycle. A cloud scan (`--host aws|azure|gcp`) with real findings no longer surfaces the network concluder's *"Host is UP — No open services detected"* headline — the conclusion shows a cloud-appropriate summary (N findings by severity + top risks), and a plugin that **times out or errors** routes to **coverage UNVERIFIED** rather than an affirmative clean verdict. **`--compliance all`** expands to all seven frameworks and an unknown `--compliance` token now **fails fast** (no *"Framework load failed"* stub) — the CE `--help` now documents both (the only CE-side change). Detection is unchanged (oracle-validated). **No new framework, no new plugins (still 28), no coverage-matrix changes.** Paired **EE 0.31.4** + agent-skill 0.2.16. **EE 0.31.4 requires CE 0.2.8+.** See [CHANGELOG.md](./CHANGELOG.md).
23
+
24
+ **Prior: CE 0.2.15 + Enterprise 0.31.3** (June 2026) — paired content bump for the Enterprise **"Enumeration-failure fleet sweep (no-silent-false-clean) + Aurora DB-cluster snapshot dimension"** cycle. The Enterprise engine closes a fleet-wide class of **enumeration-failure** false-cleans across **12 AWS plugins** — a scanner that cannot enumerate a resource population now fails **CLOSED** with a routed evidence-gap instead of reading CLEAN — and adds the Aurora **DB-cluster snapshot** dimension to plugin 1140 (a public `restore=all` cluster snapshot is CRITICAL, an unencrypted one HIGH; the cluster surface instance-level scans never see), with a Multi-AZ DB cluster fail-close. **No new framework, no new plugins (still 28), no coverage-matrix changes** — a false-negative-hardening release. **No CE engine behavior change** (the detection + routing live in the Enterprise engine). Paired **EE 0.31.3** + agent-skill 0.2.15. **EE 0.31.3 requires CE 0.2.8+.** See [CHANGELOG.md](./CHANGELOG.md).
21
25
 
22
26
  **Prior: CE 0.2.14 + Enterprise 0.31.2** (June 2026) — paired content bump for the Enterprise "At-rest encryption → ISO A.8.24 fleet sweep + cross-cloud KEY-CUSTODY-HOME doctrine" cycle (every AWS at-rest source → the 7-control at-rest set; DynamoDB + EC2-indeterminate class-O false-cleans fixed; cross-cloud key-custody doctrine → ISO A.8.24; SOC 2 file-lock fix). See [CHANGELOG.md](./CHANGELOG.md).
23
27
 
package/cli.mjs CHANGED
@@ -867,7 +867,9 @@ Scan options:
867
867
  --interval <minutes> Watch interval (default 60)
868
868
  --webhook-url <url> Send delta alerts (must be public; private/loopback blocked)
869
869
  --alert-severity <sev> Min severity to alert on (default: high)
870
- --compliance <framework> Run compliance mapping (e.g. soc2). Enterprise only.
870
+ --compliance <framework> Map findings to controls. 'all' = all 7 frameworks, or a CSV
871
+ of soc2,hipaa,nist-csf,pci-dss,iso-27001,cis-v8,gdpr (aliases
872
+ nist/pci/iso/cis). Unknown tokens fail fast. Enterprise only.
871
873
  --compliance-scope <path> JSON file describing the assessment scope
872
874
 
873
875
  License subcommands:
@@ -911,8 +913,12 @@ Environment:
911
913
  COMPLIANCE_TSA_URL RFC 3161 timestamp authority for SOC 2 attestation
912
914
 
913
915
  Cloud-scan hosts:
914
- --host aws | gcp | azure Sentinel literals (case-insensitive). These are not
915
- DNS-resolved; they route the scan to the matching
916
+ --host aws[,gcp,azure] One or more cloud sentinel literals, comma-separated
917
+ (case-insensitive): use 'aws' for one cloud, or
918
+ 'aws,gcp,azure' to audit all three in one run (each cloud
919
+ is scanned in turn). Do NOT write aws|gcp|azure with pipe
920
+ characters — your shell treats | as a pipe. Sentinels are
921
+ not DNS-resolved; they route the scan to the matching
916
922
  cloud-scanner plugins via the provider's control-plane
917
923
  API, and imply CLOUD_PROVIDER=<host> when unset. With
918
924
  --plugins all the scan AUTO-SCOPES to only that cloud's
@@ -926,7 +932,8 @@ Cloud-scan hosts:
926
932
  Examples:
927
933
  nsauditor-ai scan --host 10.0.0.1 --plugins all
928
934
  CLOUD_PROVIDER=aws AWS_PROFILE=default \\
929
- nsauditor-ai scan --host aws --plugins 020 --compliance soc2
935
+ nsauditor-ai scan --host aws --plugins all --compliance all # full AWS audit, all 7 frameworks
936
+ nsauditor-ai scan --host aws,gcp,azure --plugins all --compliance all # all 3 clouds in one run
930
937
  nsauditor-ai scan --host 10.0.0.0/24 --plugins all --compliance soc2
931
938
  nsauditor-ai license install enterprise_eyJhbGciOiJFUzI1NiIs...
932
939
  nsauditor-ai license --status
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nsauditor-ai",
3
- "version": "0.2.15",
3
+ "version": "0.2.17",
4
4
  "description": "Modular AI-assisted network security audit platform — Community Edition",
5
5
  "type": "module",
6
6
  "private": false,
@@ -137,6 +137,8 @@ export function expandRange(range) {
137
137
  * Detect input type and return array of hosts.
138
138
  * - If contains '/' → CIDR
139
139
  * - If contains '-' with IP pattern → dash range
140
+ * - If contains ',' → comma-separated list (each token parsed + flattened, e.g.
141
+ * `aws,gcp,azure` → multi-cloud, or `10.0.0.1,10.0.0.2`)
140
142
  * - If file exists → host file
141
143
  * - Otherwise → single IP/hostname
142
144
  */
@@ -151,6 +153,24 @@ export async function parseHostArg(arg) {
151
153
  return expandRange(arg);
152
154
  }
153
155
 
156
+ // Comma-separated list (e.g. multi-cloud `aws,gcp,azure`, or `10.0.0.1,10.0.0.2`):
157
+ // split and parse each token recursively so cloud sentinels, CIDRs, and ranges all
158
+ // compose. A real host-file whose path happens to contain a comma is still read as a
159
+ // file (checked first); otherwise the comma is treated as a list separator.
160
+ if (typeof arg === 'string' && arg.includes(',')) {
161
+ if (!path.isAbsolute(arg)) {
162
+ const r = path.resolve(arg);
163
+ if (r.startsWith(process.cwd() + path.sep)) {
164
+ try { await fsp.access(arg); return parseHostFile(arg); } catch { /* not a file → treat as a list */ }
165
+ }
166
+ }
167
+ const out = [];
168
+ for (const token of arg.split(',').map((t) => t.trim()).filter(Boolean)) {
169
+ out.push(...await parseHostArg(token));
170
+ }
171
+ return out;
172
+ }
173
+
154
174
  // Path traversal guard: reject absolute paths and paths resolving outside cwd
155
175
  if (path.isAbsolute(arg)) return [arg]; // treat as hostname, not file
156
176
  const resolved = path.resolve(arg);