nsauditor-ai 0.2.16 → 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 +3 -1
- package/cli.mjs +7 -2
- package/package.json +1 -1
- package/utils/host_iterator.mjs +20 -0
package/README.md
CHANGED
|
@@ -17,7 +17,9 @@ 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.
|
|
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).
|
|
21
23
|
|
|
22
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).
|
|
23
25
|
|
package/cli.mjs
CHANGED
|
@@ -913,8 +913,12 @@ Environment:
|
|
|
913
913
|
COMPLIANCE_TSA_URL RFC 3161 timestamp authority for SOC 2 attestation
|
|
914
914
|
|
|
915
915
|
Cloud-scan hosts:
|
|
916
|
-
--host aws
|
|
917
|
-
|
|
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
|
|
918
922
|
cloud-scanner plugins via the provider's control-plane
|
|
919
923
|
API, and imply CLOUD_PROVIDER=<host> when unset. With
|
|
920
924
|
--plugins all the scan AUTO-SCOPES to only that cloud's
|
|
@@ -929,6 +933,7 @@ Examples:
|
|
|
929
933
|
nsauditor-ai scan --host 10.0.0.1 --plugins all
|
|
930
934
|
CLOUD_PROVIDER=aws AWS_PROFILE=default \\
|
|
931
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
|
|
932
937
|
nsauditor-ai scan --host 10.0.0.0/24 --plugins all --compliance soc2
|
|
933
938
|
nsauditor-ai license install enterprise_eyJhbGciOiJFUzI1NiIs...
|
|
934
939
|
nsauditor-ai license --status
|
package/package.json
CHANGED
package/utils/host_iterator.mjs
CHANGED
|
@@ -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);
|