Use this skill whenever the user wants network security scanning, auditing, vulnerability assessment, host reconnaissance, or cloud-account security/compliance auditing with NSAuditor AI (via the nsauditor-ai MCP server: scan_host, scan_cloud, get_findings, probe_service, get_vulnerabilities, list_plugins). Triggers include 'scan', 'audit', 'vulnerability', 'CVE', 'network security', 'port scan', 'service detection', 'OS fingerprinting', 'penetration test', 'TLS/cipher audit', 'certificate check', 'DNS security', 'SPF/DKIM/DMARC/DNSSEC', 'SNMP/SMB/NetBIOS', 'CTEM', 'continuous monitoring', or 'audit my AWS/GCP/Azure account' / 'cloud compliance'. Also use it when the user asks to check if a host is up, enumerate services, find open ports, look up CVEs for a version, audit DNS records, or audit a cloud account — even if they don't say NSAuditor, as long as the nsauditor-ai MCP tools are available. Do NOT use for general coding, web development, or non-security topics.
Resources
8Install
npx skillscat add nsasoft/nsauditor-ai-agent-skill Install via the SkillsCat registry.
We need to produce a 2-3 sentence plain-text summary, objective, factual, no marketing, no superlatives, no calls to action. Must be at most 60 words. Summarize skill: network security scanning, auditing, vulnerability assessment, host reconnaissance, cloud-account security/compliance auditing via NSAuditor AI MCP server. Problem solved: provides automated security scanning and vulnerability detection for hosts and cloud accounts, enabling identification of misconfigurations, open ports, CVEs, compliance issues.
NSAuditor AI — Agent Skill
Version: 0.2.47 (knowledge current as of EE 0.42.0 · requires CE ≥ 0.2.49) — the sovereign-cloud release.
What this release (EE 0.42.0) teaches: Non-commercial AWS partitions and Azure sovereign clouds are now first-class, and both REFUSE rather than silently reporting on the wrong estate. When you drive a scan against GovCloud, China, an ISO partition or the European Sovereign Cloud, findings that previously read CLEAN now fire: a public S3 access point riding a bucket delegation, IAM privilege-escalation at CRITICAL (it demoted to HIGH before), shadow-admin graph edges that were missing entirely, and the full effective-decrypt severity ladder (it collapsed to
info). For Azure,AZURE_ENVIRONMENT/ARM_ENVIRONMENT/AZURE_ARM_ENDPOINT/AZURE_AUTHORITY_HOSTnow select the cloud — and an unrecognised or self-contradicting selection refuses the scan and emits an evidence gap naming the variable that fixes it, because falling back to commercial is how an operator holding both commercial and sovereign credentials gets a real, clean-looking report about an estate they did not mean. Every Azure scan now states which estate it addressed — read that line before trusting a clean Azure result. Also new:npm run gate:sbomemits CycloneDX/SPDX over the installed package rather than the source tree, anddocs/fips-posture.mdstates approved algorithms, explicitly not a validated module — do not let a user infer FIPS 140 validation from it. Plugin count UNCHANGED at 29; all eight coverage matrices UNCHANGED.
Prior: 0.2.46 (post-EE-0.41.0 · requires CE ≥ 0.2.45) — the DocumentDB release.
⛔ If tool output reports an EE version NEWER than the knowledge bound above, say this skill's knowledge does not yet cover that version — never guess at capabilities it might add.
What EE 0.40.3 taught: A timestamp for a DIFFERENT artifact is no longer accepted as yours. RFC 3161 timestamping stays opt-in (
NSAUDITOR_TSA_URL; no default authority). When enabled, a granted token carries amessageImprint— the digest it attests — and nothing compared it to the digest our request carried, so a replay, a caching proxy or an authority fault could return a valid timestamp for someone else's bytes and it was written as evidence, while the auditor's ownopenssl ts -verifyprintedmessage imprint mismatch→ FAILED over it. Refused now, before any write, astsa_imprint_mismatch, naming both digests. Two more codes join it:tsa_response_malformed(bytes RFC 3161 does not admit inside the response; openssl refuses such a file outright) andtsa_token_unreadable(neither this reader nor openssl could decode the token). Eight refusal codes total. ⚠️ Teach the OPPOSITE direction too, because it is a LOOSENING and a user may report it as a change: a BER-encoded token is no longer refused when openssl can read it. 0.40.2 refused those outright; CMS permits BER andopenssl ts -verifyaccepts them, so the old behaviour discarded genuine evidence from authorities whose stacks nobody here has surveyed. A refusal now requires both readers to fail — so timestamps that start working again on 0.40.3 are the fix, not a regression. The chain-of-custody envelope now recordsartifacts[].tsa.imprintVerified(an explicit boolean) plusimprintUnverifiedReasonwhen the comparison could not be made. ⚠️ Teach that the absence ofimprintUnverifiedis NOT the presence of verification — read the boolean. And a run configured for timestamping that TIMESTAMPED fewer artifacts than it attempted now says so ONCE, carrying the refusal codes, so "zero.tsrfiles" is no longer indistinguishable from "timestamping was never configured". ⚠️ THE PUBLISHED AUDITOR INSTRUCTION CHANGED AND THE OLD ONE CANNOT BE RUN: verify withopenssl ts -verify -in <file>.tsr -data <file> -CAfile <ca-bundle>. The prior text passed-queryfileAND-datatogether — mutually exclusive; openssl exits 1 with no verdict at all — and named a.tsqthat no pack contains, because the request is built in a temp directory and deleted. If a user quotes the old command and reports that verification failed, that is why. ⚠️ NOT RETROACTIVE: packs timestamped before 0.40.3 were never checked for imprint match; re-verify them, and treat a.tsrthat fails as never having been a valid timestamp for that artifact. ⚠️signed: trueattests protocol status and what the token SAYS it attests, never cryptography. Plugin catalog UNCHANGED at 28 EE / 55 overall; all eight coverage matrices UNCHANGED; peer floor UNCHANGED at CE ≥ 0.2.45.Prior: 0.2.44 (post-EE-0.40.2) — A TSA rejection is no longer written as evidence. RFC 3161 timestamping stays opt-in (
NSAUDITOR_TSA_URL; no default authority). When enabled, the response status is now read before anything reaches disk: a refusal writes NO.tsr, leaves any sidecar from a prior success byte-identical, and recordssigned: falsewith one of five reason codes —tsa_submit_failed·tsa_rejected·tsa_not_granted·tsa_response_no_token·tsa_response_unparseable— in the chain-of-custody envelope. Teach the reading: a missing.tsrbeside a.sha256means REFUSED, not failed — the per-artifact ledger isartifacts[].tsa.signed/.errorin the envelope, andtsa_rejected(the authority declined; fix the request) routes to a different action thantsa_not_granted(waiting or revocation; ask again later). ⚠️signed: trueattests protocol status, never cryptography — it means the authority granted and enclosed a token;openssl ts -verifyremains the only thing that adjudicates the token itself. ⚠️ Packs produced by earlier versions against a rejecting authority may carry a ~50-byte rejection recorded as signed (real tokens run ~4.6 KB) — a tiny.tsrthat failsopenssl ts -verifyis that class, and re-signing under 0.40.2 refuses honestly instead. Also taught: the TSA policy-OID option (NSAUDITOR_TSA_POLICY_OID) works on OpenSSL ≥ 3.0 hosts for the first time — OpenSSL 3.0 renamed the query flag to-tspolicywhile LibreSSL kept-policy, both report a 3.x version, and the fix attempts the modern spelling and falls back; when the legacy spelling was used the signing result carriestsaPolicyFlagFallback. This is the option commercial TSAs (DigiCert / GlobalSign / Sectigo) require, so an operator who sawunexpected_failurewith a policy OID configured should re-try on 0.40.2. And parenthesised(Dim N)internal dimension codes are gone from GCP finding prose — bareDim Nreferences remain in some GCP IAM finding text, a known census-pinned residual, not a new defect to report. Plugin catalog UNCHANGED at 28 EE / 55 overall; all eight coverage matrices UNCHANGED; peer floor UNCHANGED at CE ≥ 0.2.45.Prior: 0.2.43 (post-EE-0.40.0 · requires CE ≥ 0.2.45 — RAISED) — the eighth-framework release. NIST SP 800-171 Rev 2 ships as
--compliance nist-800-171, and CE registers the stem, so an older CE REJECTS the framework name outright — that is what makes this floor a real bump rather than a paired bump. Teach the scope as "NIST SP 800-171 evidence substrate for CMMC Level 2 preparation." ⚠️ WITHDRAWN — deliberately not claimed, in these exact words: "CMMC certified", "CMMC compliant", "CMMC ready", "FedRAMP authorized", any MET / NOT MET verdict, and any SPRS score. Each of those is a C3PAO determination and none is a product output; a misrepresented SP 800-171 posture is the shape the DOJ Civil Cyber-Fraud Initiative settles, which is why this is a refusal rule for the agent and not a wording preference. All 110 Rev 2 requirements are enumerated — 2 covered / 49 partial / 59 out of scope, each with a written reason — and coverage is claimed at the SP 800-171A determination-statement (objective) level, which is why only two clear the bar: a requirement counts as covered only when EVERY objective is technical system state the scan reads directly. ⚠️ Rev 2 is PINNED: CMMC assesses Rev 2 by rule, and Rev 3 is a different 97-requirement universe with organization-defined parameters — answering a Rev 3 question with Rev 2 output is drift. CUI scope is the operator's assertion: the scanner cannot see CUI, cannot tell FCI from CUI, and cannot see an enclave boundary. Also in this release: a KMS key in an account or project the operator may not control is no longer reported as customer key custody — it becomes an evidence gap, never a violation, because a cross-account CMK is recommended architecture. Plugin catalog UNCHANGED at 28 EE / 55 overall; the seven prior coverage matrices UNCHANGED.Prior: 0.2.42 (post-EE-0.39.0 · requires CE ≥ 0.2.43) — the coverage-honesty release. ⚠️ Teach
deferredScopeas a per-PLUGIN declaration, never as a provider or coverage inventory. Every GCP and Azure plugin now declares what it does NOT evaluate (1021, 1022, 1024, 1025, 1220, 1221, 1222), joining the AWS plugins that already did — 8 to 12 static boundaries each, emitted atrun()scope on the audited path including over an empty estate, because "zero findings" is otherwise indistinguishable from "assessed and clean". A declaration is a static capability boundary: it is NOT an evidence gap and NOT a finding, it routes to ZERO compliance controls by design, and it must be reported as "not assessed". ⚠️ An empty or shortdeferredScopeis NEVER a claim of full coverage — not every plugin declares its boundaries, so the list bounds only what the DECLARING plugins state. Never tell a user that an empty list means everything was assessed. Two AWS declarations (1080 Lambda, 1130 Backup) are now emitted ONCE PER RUN rather than once per region, so a fleet reads nine once-per-run disclosures — a count that no longer scales with the estate. And GCP impersonation now REFUSES rather than degrading: an impersonated client that yields no Authorization header fails loudly by name with the target principal, surfacing asup:falseplus a warning that fires scanner-down synthesis. ⚠️ Teach that refusal as a PASS of the fail-closed design, never as a regression — the alternative it replaced was silent anonymous requests reporting FALSE evidence gaps. Plugin catalog UNCHANGED at 28 EE / 55 overall; every coverage matrix UNCHANGED.Prior: 0.2.41 (post-EE-0.38.0 · requires CE ≥ 0.2.43) — the sign-pack / verify-pack release. ⚠️ This entry described those commands as "reachable and not yet proven" when written, and that is now STALE in the underclaim direction. The published-bytes gate RAN against the EE 0.38.0 registry bytes on 2026-08-17 and PASSED, so the capability is PROVEN for an operator-held key over one framework's envelope and the artifacts it enumerates, never a vendor attestation. What has not changed, and never will, is that scope.
compliance sign-packsigns a chain-of-custody envelope with an operator-held Ed25519 key;compliance verify-packestablishes authorship AND recomputes every enumerated artifact hash against disk. A verified signature proves the holder of a key asserted authorship of ONE framework's envelope, relative to operator key custody — never a vendor attestation, never proof the scan ran. It covers that envelope and its four artifacts, not the pack. Exit 2 means the run could not measure and is never a failure.Prior: 0.2.40 (post-EE-0.37.0 · requires CE ≥ 0.2.42) — the air-gap feed release.
feed bundleandfeed importlet NVD feed files downloaded on a connected host be merged into one archive, hand-carried, and imported into the offline store on an isolated host — delivered as a restricted distribution rather than a publicnpm install, and amd64 only. ⚠️ Teach these precisely:feed bundlebundles the FEEDS YOU DOWNLOADED, never "your database" — the offline store is a lossy derivation of an NVD feed and cannot be turned back into one, so never describe this as a store export or a backup. No KEV or EPSS data ships with the product;--kev/--epsscarry the operator's own downloads from CISA and FIRST, and--extras-dirplaces them on import and prints the environment lines to set. A bundle is integrity-checked, NOT authenticated — the recorded SHA-256 detects alteration in transit but cannot establish authorship, because it travels inside the archive it covers; never describe an imported bundle as trusted or verified-as-genuine. Import skips about a quarter of a real NVD year file by design (withdrawn CVEs, entries with no CPE match data) — that is not data loss, while malformed records are a different signal meaning re-download. The air-gap delivery claims are EARNED BACK at this release, every one of them as a restricted distribution and amd64 only — the offline installation tarball is restricted, the install script is restricted, the feed-import CLI moves the feeds you downloaded, and air-gapped deployment is restricted and amd64 only — because the artifacts exist and the delivery gate passes on the built bytes. Teach them WITH their conditions, which are part of the claim and not footnotes: the bundle is a restricted distribution rather than a publicnpm install, and it is amd64 only. arm64 images remain WITHDRAWN — never describe an arm64 enclave as supported.Prior: 0.2.39 (post-EE-0.36.0 · requires CE ≥ 0.2.40) — the verification release. Every compliance report now cryptographically checks each suppression signature — the Ed25519 suppression-signing capability this exercises is proven as of EE 0.36.0 and verified for approvers whose registry entry carries key material, its verification gate having run against the published bytes and passed — and writes
report.signatureVerification. A MISSING verdict means NOT CHECKED, never failed;cryptoValidis absent when unanswerable, neverfalse. Verification runs for approvers whose registry entry carries key material.Prior: 0.2.38 (post-EE-0.35.0 · requires CE ≥ 0.2.40) — the approval-surface release. Four Enterprise commands are now reachable from the CLI:
compliance suppress | review | renew | keygen.keygencreates an Ed25519 approval keypair for a capability that was not yet proven at that release, writes the private half0600and prints an identity-registry member to paste; it refuses to overwrite an existing signing key.suppresssigns the approval it writes whenNSAUDITOR_SIGNING_KEYnames a local Ed25519 key, and a malformed key fails at the command with nothing written.renewwarns that renewing a signed approval invalidates its signature — the expiry and the renewal record live inside the signed payload, so the record afterwards readssignature does not match payload, which an auditor cannot distinguish from real tampering. ⚠️ Teach this precisely: Ed25519 suppression signing became REACHABLE at that release and was NOT YET PROVEN then. It was PROVEN at EE 0.36.0 — the verification gate ran against the published bytes and passed. Verification runs for approvers whose registry entry carries key material; for a fingerprint-only entry a report readsnot checked, which records that no check ran and never that one failed. These commands are CLI-only — they are not MCP-reachable. Plugin catalog UNCHANGED at 28 EE / 55 overall; every coverage matrix UNCHANGED.Prior: 0.2.37 (post-EE-0.34.0 · requires CE ≥ 0.2.39) — the exploit-intelligence release. Enterprise findings that carry CVEs are joined by CVE-ID against a local CISA KEV catalog and a local FIRST EPSS scores file, banded
KNOWN_EXPLOITED/ELEVATED/BASELINE, and the finding queue is ordered exploit-first — a KEV-listed MEDIUM outranks an unexploited CRITICAL. ⚠️ Teach this accurately: no feed data ships with the product. Both stores are operator-populated viaNSAUDITOR_EXPLOIT_KEV_STORE/NSAUDITOR_EXPLOIT_EPSS_STORE, the same rule as the offline NVD store, and both fail closed when stale (KEV 14-day / EPSS 10-day windows) so an out-of-date catalog never reports "not exploited".riskScoreis UNCHANGED —exploitPriorityis a new axis beside it, not a re-weighting. ⚠️ One correction to this package's own prose: the risk score is CVSS weighted by verification status with an initial-access uplift, not "severity × exploitability × impact × exposure" — that phrasing named an exploitability input that did not exist until this release. Plugin catalog UNCHANGED at 28 EE / 55 overall; every coverage matrix UNCHANGED.
Prior: 0.2.36 (post-EE-0.33.0 · requires CE ≥ 0.2.37) — a wording-only patch on top of the wiring release: the RFC 3161 row said the capability was "implemented but not yet wired to a flag", which EE 0.33.0 falsified and the live-TSA smokes then falsified twice over (npm path 2026-08-07, from inside the
:0.33.0container image 2026-08-08). It is opt-in viaNSAUDITOR_TSA_URL, proven on both delivery vehicles, and the only surviving caveat is version scope — retained images:0.32.11and earlier carry noopenssl. Prior: 0.2.35 — the wiring release. Three CE entry points are new and the skill should teach them:compliance attest(Type II recurring-scan attestation over a directory of prior scans; exit 3 on an empty history), and--sla-policy <file>/--compliance-history <dir>, which reach the SLA/MTTR engine. A startup posture veto refusesNSAUDITOR_OFFLINE_ONLY=1together with a configured outbound path (exit 2). ⚠️ Two corrections to this package's own prose: thecompliance_checkdisclosure now carries the WITHDRAWN marker so an instrument can tell it from a claim, and the Enterprise row no longer calls plugin 1023 a cloud auditor — it scores zero-trust posture from a NETWORK-host scan and cannot be run by selecting it with--plugins. Plugin catalog UNCHANGED at 28 EE / 55 overall; every coverage matrix UNCHANGED.
Prior: 0.2.34 (post-EE-0.32.11 — a correction release. The Verification Engine was WITHDRAWN at EE 0.32.7; this package went on presenting it as a shipped Phase 4, glossing
VERIFIEDas probe-confirmed, and selling "verification probes" in the pricing table. All corrected — the status enum stays, the active-probe gloss goes, and findings are stated to be emitted UNVERIFIED. Upstream:scan_cloudsummaries now surface the INFO tier anddeferredScopeboundaries; a newcompliance_matrixMCP tool returns the shipped coverage matrix for any shipped framework, derived at call time;pdfExportwithdrawn and every capability now ships a description. Plugin catalog UNCHANGED at 28 EE / 55 overall; every coverage matrix UNCHANGED.)
Prior: 0.2.33 (post-EE-0.32.10 — no knowledge change.)
Prior: 0.2.32 (post-EE-0.32.9 — the skill package's own provenance sweep.)
Prior: 0.2.30 (post-EE-0.32.7 — a matrix-neutral release that does two things. (1) Cross-framework routing: the network-scan analysis agents' findings now route in every shipped compliance framework, not just SOC 2 — a host serving cleartext or exposing SMB previously failed the SOC 2 report and read clean in every other framework off the same scan; that gap is closed (mutation-proven guard; every
coverageSummaryblock byte-identical). (2) Capability-claim honesty pass: several Pro/Enterprise capabilities advertised without a shipping implementation — verification engine, branded reports, usage metering, Docker per-scan isolation, and the ZDE "policy engine" / Enterprise-CTEM datastore framings — are withdrawn; the real cores (the code-enforced ZDE read-only guarantee, Pro-tier CTEM retention) ship and are described honestly, and theverifiers/stub files no longer ship. Plugin count UNCHANGED at 28; every coverage matrix UNCHANGED.)
NSAuditor AI is a modular, AI-assisted network security audit platform with 27+ scanner
plugins, CVE matching, MITRE ATT&CK mapping, and Zero Data Exfiltration by design. This
skill teaches you how to operate it via MCP tools and CLI.
MCP Tools Reference
NSAuditor AI exposes tools via Model Context Protocol (stdio transport). Available tools
depend on the license tier (Community / Pro / Enterprise).
Community Edition Tools (always available)
scan_host
Run a full plugin scan against a target host. Executes ALL enabled plugins in priority
order (discovery → service probes → OS detection → result fusion).
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
host |
string | ✅ | — | Target hostname or IP address |
timeout |
number | ❌ | 30000 | Per-plugin timeout in ms |
Returns: { summary, host, services[], findings[] } — see references/schemas.md
Example:
{ "host": "192.168.1.1", "timeout": 10000 }Important:
- For RFC 1918 / private IPs, the MCP server must have
NSA_ALLOW_ALL_HOSTS=1set. - The server blocks loopback (127.x, ::1), link-local (169.254.x, fe80:), and cloud
metadata endpoints (169.254.169.254) — this is SSRF protection, not a bug. - Plugins with unmet requirements auto-skip (e.g., SSH scanner skips if port 22 is closed).
compliance_matrix
Return the SHIPPED compliance coverage matrix for a framework — how many controls are Covered, Partial and
Out of scope, with the control ids and the per-group out-of-scope reasons.
| Parameter | Type | Required | Description |
|---|---|---|---|
framework |
string | ❌ | soc2 | hipaa | nist-csf | pci-dss | iso-27001 | cis-v8 | gdpr | nist-800-171 | all (default) |
ALWAYS call this before stating or tabulating any coverage matrix, and quote what it returns. Do NOT derive a
matrix from the plugin inventory, from a scan result, or from documentation — coverage is a property of the shipped
framework maps, not of the plugin list, and a derived matrix will disagree with the customer's own report.
⚠️ outOfScope is the flattened sub-criterion count, not the number of out-of-scope groups: SOC 2 returns 37
ids across 11 groups. Publishing the group count yields a plausible-looking 10 / 4 / 11.
It fails closed — if the Enterprise pack is not installed or its data is unreadable it raises rather than
returning an empty matrix, because an empty matrix is what gets filled in with a guess.
list_plugins
List all available scanner plugins with metadata.
| Parameter | Type | Required | Description |
|---|---|---|---|
| (none) | — | — | — |
Returns: Array of { id, name, description, priority, protocols[], ports[], requirements }
When to use: Before a scan to understand available plugins, or to help the user select
specific plugins for a targeted probe.
probe_service (Pro license required)
Run a single plugin against a specific host:port for deep-dive investigation.
| Parameter | Type | Required | Description |
|---|---|---|---|
host |
string | ✅ | Target hostname or IP |
pluginName |
string | ✅ | Plugin name or numeric ID (e.g. "ssh_scanner" or "002") |
port |
number | ✅ | Target port number |
Returns: Raw plugin output with full evidence for that specific service.
Common plugin IDs:
| ID | Name | Best For |
|---|---|---|
| 002 | SSH Scanner | Banner, version, weak algorithms/ciphers |
| 004 | FTP Banner | FTP daemon identification, anonymous login |
| 006 | HTTP Probe | Server headers, tokens, vendor hints |
| 007 | SNMP Scanner | Device info via sysDescr, hardware/firmware |
| 009 | DNS Scanner | DNS server version (CHAOS query) |
| 010 | Webapp Detector | Technology stack fingerprinting (Wappalyzer) |
| 011 | TLS Scanner | TLS versions, cipher suites, deprecation |
| 014 | NetBIOS Scanner | SMB/NetBIOS enumeration, null sessions |
| 040 | TLS Cert & Cipher Auditor | Certificate chain, expiry, weak ciphers (Pro) |
| 050 | TRIBE v2 Probe | Debug leaks, stack traces, CORS misconfig (Pro) |
| 060 | DNS Security Auditor | SPF/DKIM/DMARC, DNSSEC, zone transfer (Pro) |
get_vulnerabilities (Pro license required)
Look up known CVEs for a CPE string via the NVD 2.0 API.
| Parameter | Type | Required | Description |
|---|---|---|---|
cpe |
string | ✅ | CPE 2.3 format (see CPE guide below) |
maxResults |
number | ❌ | Max CVE results to return |
Returns: { cpe, totalResults, vulnerabilities[] } — each CVE includes ID, description,
CVSS v3.1 score, severity, vector string, publication date.
CPE Construction Guide:
Format: cpe:2.3:a:<vendor>:<product>:<version>:*:*:*:*:*:*:*
| Detected Program | Detected Version | CPE String |
|---|---|---|
| OpenSSH | 8.9p1 | cpe:2.3:a:openbsd:openssh:8.9p1:*:*:*:*:*:*:* |
| Apache httpd | 2.4.54 | cpe:2.3:a:apache:http_server:2.4.54:*:*:*:*:*:*:* |
| nginx | 1.24.0 | cpe:2.3:a:f5:nginx:1.24.0:*:*:*:*:*:*:* |
| OpenSSL | 3.0.8 | cpe:2.3:a:openssl:openssl:3.0.8:*:*:*:*:*:*:* |
| ISC BIND | 9.18.12 | cpe:2.3:a:isc:bind:9.18.12:*:*:*:*:*:*:* |
| vsftpd | 3.0.5 | cpe:2.3:a:beasts:vsftpd:3.0.5:*:*:*:*:*:*:* |
| Samba | 4.17.5 | cpe:2.3:a:samba:samba:4.17.5:*:*:*:*:*:*:* |
| Log4j | 2.14.1 | cpe:2.3:a:apache:log4j:2.14.1:*:*:*:*:*:*:* |
| MySQL | 8.0.32 | cpe:2.3:a:oracle:mysql:8.0.32:*:*:*:*:*:*:* |
| PostgreSQL | 15.2 | cpe:2.3:a:postgresql:postgresql:15.2:*:*:*:*:*:*:* |
Tip: If vendor is ambiguous, search NVD with just the product name first.
Pro/Enterprise Tools (license gated)
These tools return a license upgrade prompt on CE installations:
| Tool | Tier | Purpose |
|---|---|---|
scan_cloud |
Enterprise | Audit one or more cloud accounts (AWS / GCP / Azure) for security & compliance posture using the server-configured credentials. No network host needed. Input: { providers?: ("aws"|"gcp"|"azure")[], regions?: string[] } — pass only the cloud(s) the user names (providers:["aws"] for "audit my AWS account"); omit providers only when the user asks to audit ALL clouds. Use this (not scan_host) when the user asks to "audit my AWS account", "audit my AWS and Azure accounts", or "check my cloud compliance". CE/Pro callers get an upgrade message. regions (AWS only) — AWS region codes (e.g. ["us-east-1","eu-west-1"]) or ["all"]. Default — single region (MOST requests): a plain "audit my AWS account", a "quick check", or any request that names no region AND does not explicitly ask for all/every/whole-account/complete/full coverage → OMIT regions (audits ONLY the server-configured AWS_REGION, one region; do NOT fan out or batch). Omitting does NOT scan all regions. Specific regions: when the user names region(s), pass exactly those. All regions — ONLY on an explicit "all regions / every region / whole account / full coverage" request: use the discover-then-batch approach in the region-scope note below — do NOT pass a single ["all"] call and rely on it (it fans every regional plugin across all enabled regions and usually EXCEEDS the host's MCP tool-call timeout, e.g. Claude Desktop's, returning nothing). Unknown region codes are rejected before the scan runs (the WHOLE call fails — fix the region and re-call; never silently drop it). |
get_findings |
Enterprise | Drill into the findings of the MOST RECENT scan_cloud scan — a per-provider, per-session cache (NOT live state; cleared when the MCP server restarts). Input: { scanId?, provider?, plugin?, severity?, category?, cursor?, limit? }. Use it AFTER scan_cloud when the summary's category rollup shows a category you want to expand to specific resources, or when you need the FULL untruncated text of a finding. Pass the scanId from the scan_cloud summary footer + the provider; filter by category/severity/plugin; paginate with cursor/limit (server-capped at 20 — follow nextCursor). If you get a "re-run scan_cloud" error the cache was cleared or superseded — re-run scan_cloud, do NOT retry get_findings. CE/Pro callers get the same upgrade message as scan_cloud. |
Interpreting
scan_cloudresults — never report a false clean: readfindingsSummaryfor the findings — it maps each provider tocounts(per-severity totals) and afindingslist of the CRITICAL/HIGH items ({severity, plugin, title}); report those. A cloud was effectively audited only if it appears inauditedProviders. If the result hasaudited: false, anynotesentries, orpluginsRan: 0, the cloud was NOT audited (no plugins, missing credentials, or skipped) — report the gap explicitly; an empty result is not a clean pass. Do not infer "clean" from an emptyfindingsSummarywhen the cloud is not inauditedProviders. Beyond CRITICAL/HIGH,findingsSummary[provider].rollupgroups the remaining findings bycategorywith counts (count-descending) across MEDIUM, LOW and INFO — and the INFO tier is not optional reading, because that is where the evidence gaps and the deferred-scope boundaries live. ⚠️ This sentence said "MEDIUM + LOW" until EE 0.39.0, which was FALSE against the summariser's own three rollup buckets, and false in the direction that hides the tier a reader most needs. Report every tier that occurs; these are actionable too: a category likesqs-age-alarm-missingor*-publicis a real gap, not noise, and reporting only CRITICAL/HIGH while the rollup is non-empty is itself a false clean. To enumerate the specific resources behind a rollup category, or to read a finding's full untruncated text, callget_findingswith thescanIdfrom the summary footer + thecategory.
Reporting
scan_cloudregion scope — never overstate coverage: Report the regions you ACTUALLY scanned, derived from theregionsyou passed — NOT from the findings. If you OMITTEDregions, only the single server-default region (AWS_REGION) was scanned — say exactly that and add that the account's OTHER enabled regions were NOT covered (offer to re-run for all regions). Never escalate a single-region or "quick" request into a multi-region scan. Do NOT claim "all regions" / "every region" / "across N regions" just because GuardDuty or Inspector list per-region findings: those plugins enumerate every enabled region INTERNALLY regardless of scope, so their per-region findings are NOT evidence the other plugins ran outside the region(s) you passed.
Full all-region coverage — discover then batch (use ONLY when the user explicitly asked for all/every/whole-account/complete/full region coverage; NEVER for a plain or "quick" request — those stay single-region per the
regionsdefault above): a singleregions:["all"]call usually exceeds the host's MCP tool-call timeout (e.g. Claude Desktop's) and returns nothing. Reliable pattern: (1) run a default scan (omitregions) — its GuardDuty/Inspector findings enumerate every enabled region, giving you the full list while auditing the default region; (2) scan the REMAINING regions in small batches (3–5 region codes perregions:[...]call) across successive calls until every enabled region is covered; (3) merge and report the TOTAL number of regions actually covered — count them, don't guess. If you try["all"]and it times out, that result is INCOMPLETE — fall back to batching and continue until complete; never report a timed-out or partial scan as full coverage.
⚠️ COMPLIANCE IS A CLI SURFACE, NOT AN MCP TOOL.compliance_checkis WITHDRAWN — there is no such tool and there never was, and the evidence pack is produced bynsauditor-ai scan --host <target> --compliance <fw> --out <dir>, which runs the compliance PHASE and writesscan_compliance_<framework>.{json,md,html}plus its attestation and chain-of-custody sidecars.scan_cloudmaps findings to frameworks but never runs that phase, so no MCP call produces a pack. Usecompliance_matrixto state COVERAGE (what is covered / partial / out of scope); use the CLI to produce EVIDENCE.The framework detail below is accurate and worth keeping — it was attached to a tool name that does not exist:
SOC 2 (AICPA TSC 2017) + HIPAA (§164.312 Technical Safeguards) + NIST CSF 2.0 Core + PCI DSS v4.0.1 (sub-requirement-level for QSA RoC; PCI SSC June 2024 errata) + ISO/IEC 27001:2022 (per-Annex-A-code-level for ISO/IEC 17021-1 certification body assessors; ISO + IEC October 2022; 2013 edition retired October 31, 2025) + CIS Critical Security Controls v8 (per-Safeguard-level; Center for Internet Security May 2021, v8.1 errata June 2024) + GDPR Article 32 (Security of Processing) (sub-measure-level; Regulation (EU) 2016/679; Art. 32 infrastructure substrate only, NOT GDPR compliance) gap analysis — all seven shipped (SOC 2 EE 0.3.x; HIPAA EE 0.9.0; NIST CSF 2.0 EE 0.10.0; PCI DSS v4.0.1 EE 0.11.0; ISO/IEC 27001:2022 EE 0.12.0; CIS Controls v8 EE 0.13.0; GDPR Article 32 EE 0.20.0). Multi-framework via
--compliance all(shorthand for every shipped framework; EE 0.31.4) or--compliance soc2,hipaa,nist-csf,pci-dss,iso-27001,cis-v8,gdpr,nist-800-171(any CSV subset; aliasesnist/pci/iso/cis, and800-171orcmmcfornist-800-171— ⚠️niststays NIST CSF, because two NIST publications now ship and the bare vendor name is ambiguous); an unknown token fails fast (no "Framework load failed" stub). One scan produces one complete auditor-ready evidence pack per framework requested. NIST SP 800-171 Rev 2 (requirement-level3.x.yfor the matrix, SP 800-171A determination-statement level3.x.y[a]for evidence; EE F2 cycle) is the eighth. ⚠️ TEACH ITS SCOPING DOCTRINE VERBATIM AND NEVER PARAPHRASE IT: "NIST SP 800-171 evidence substrate for CMMC Level 2 preparation." WITHDRAWN — deliberately not claimed, in these exact words: "CMMC certified / compliant / ready", "FedRAMP authorized", never a MET / NOT MET verdict, and never an SPRS score — a Level 2 certificate is issued to a CONTRACTOR by a C3PAO under the CMMC rule, and FedRAMP authorizes cloud service offerings, which this product is not. Only 2 of the 110 Rev 2 requirements arecovered, and that is the design rather than a shortfall: one objective scored NOT MET fails its whole requirement, so a requirement is covered only when EVERY one of its determination statements is a statement of technical state the scan reads directly. Each mapped requirement carriesassessmentObjectivesandobjectivesEvidenced;partialBasisnames which of three shortfalls applies. CUI scope is the OPERATOR's assertion — the scanner cannot see CUI, cannot tell FCI from CUI, and cannot see an enclave boundary. The SSP (3.12.4) and POA&M (3.12.2) are operator artifacts this engine informs and never produces. ⚠️ Its requirement ids collide EXACTLY with PCI DSS sub-requirement ids (3.5.1is real in both), so ALWAYS qualify a citation. CIS Controls v8: 17 covered + 23 partial + 113 OOS across 153 Safeguards / 18 Controls. Implementation Group cumulative discipline — IG1=56 (cyber-insurance baseline; ~50-70% of mid-market policies require IG1 attestation), IG2 cumulative=130, IG3 cumulative=153; smallest-IG-membership tagging (NEVER report IG2 as 74-of-74 in isolation). No-certification-body attestation discipline — engine output is INPUT to CSAT / CIS-CAT Pro self-attestation OR a SOC 2 auditor cross-validating CIS scope, never "CIS certified." Cloud Companion Guide v8 shared-responsibility + CIS-Hardened-Image substrate-evidence credit (Safeguards 4.1/4.2/4.6) + 5 Security Functions (NOT 6 — no Govern) + 6 Asset Types + MS-ISAC/EI-ISAC/H-ISAC sector baselines + v7.1-to-v8 cross-reference. CIS Safeguard examples:3.3Data Access Control Lists,5.4Restrict Administrator Privileges,6.3MFA for Externally-Exposed Applications,8.2Collect Audit Logs,11.4Isolated Recovery Data Instance. ISO 27001 Annex A code examples:A.5.15Access control,A.5.23NEW 2022 Cloud services,A.8.5Secure authentication,A.8.9NEW 2022 Configuration management,A.8.16NEW 2022 Monitoring activities,A.8.24Use of cryptography. Statement of Applicability per Clause 6.1.3.d discipline + ISMS Clauses 4-10 OOS-by-design framing (7 Major Nonconformity classes — absence of internal audit per Clause 9.2 or management review per Clause 9.3 = auto-fail Stage 2) + 5-attribute taxonomy NEW in 2022 (controlType / informationSecurityProperties / cybersecurityConcepts [5 categories, NOT 6 like NIST CSF 2.0] / operationalCapabilities / securityDomains) + 2013-to-2022 transition discipline. Pair with ISO-aware GRC (Drata ISO 27001 / Vanta ISO 27001 / AuditBoard / OneTrust ISMS / Secureframe ISO 27001) for SoA workflow + internal audit + management review. PCI DSS sub-requirement examples:Req 1.2.1NSC config standards,Req 8.4.1MFA on non-console admin,Req 10.2.1audit logs enabled,Req 11.3.1quarterly internal vuln scans. Defined-vs-Customized Approach discipline per Appendix E (15 Defined-only sub-requirements enforced at schema layer; CHD Scope operator-attested via CDE DFD per Req 1.2.4; card-brand AOC enforcement view — Visa CISP / Mastercard SDP / Amex DSOP / Discover DISC). NIST SP 800-171 Rev 2 (evidence substrate for CMMC Level 2 preparation — all 110 Rev 2 requirements enumerated, claimed at the SP 800-171A determination-statement level; Rev 2 is pinned because CMMC assesses Rev 2 by rule and Rev 3 is a different 97-requirement universe). ⚠️ Never tell a user this produces a CMMC certification, FedRAMP authorization, MET/NOT MET verdict or SPRS score — it produces none of those, and each is a C3PAO determination. GRC push (Enterprise, opt-in): setCOMPLIANCE_GRC_PROVIDER=vanta(ordrata/secureframe) +COMPLIANCE_GRC_TOKENto map the findings to the platform's evidence/test records and push them at scan time (ZDE-redacted egress; token never serialized; the Vanta·Drata·Secureframe connector trio is complete — Secureframe records model, live tenant validation in progress).
Evidence gaps — never read one as a pass (post EE 0.32.9)
A finding whose text opens Evidence gap (…), or which carries details.evidenceGap: true,
means the scanner could not verify that surface — it is NOT a clean result and must never
be summarised as one. Two shapes to recognise:
Evidence gap (multi-region enumeration incomplete): …/Evidence gap (scan time budget exceeded): …— enumeration did not finish. Report what was NOT covered, not what was.Evidence gap: the <source> scanner could not run (<reason>) …— an entire cloud's
scanner failed to start (an optional SDK absent, credentials unusable). Every in-scope
control of that cloud is a gap. Do not describe a multi-cloud scan as clean when one
cloud's scanner never ran.
If a scan predates EE 0.32.9, its gap findings lead with a retired prefix that no framework
anchor matches, so they route to no control — the engine detects this and warns. Advise a
re-scan rather than reusing the old artifact.
Deferred scope — a declared boundary is neither a gap nor a finding (post EE 0.39.0)
findingsSummary[provider].deferredScope lists surface this release does not evaluate at all.
It is a static capability boundary, and all three of the following are load-bearing:
- It is NOT an evidence gap. A gap means the scanner tried to read something and could not
(AccessDenied, truncated enumeration) — fixable with permissions. A deferred-scope entry means no
code was ever written to look. Never merge the two lists, and never suggest granting permissions
to close one. - It is NOT a finding. It routes to ZERO compliance controls by design, carries no severity
judgement about the estate, and must never be reported under "issues found" or counted as a
failure. Report it as "not assessed". - It is emitted even over an EMPTY estate, deliberately: an account with no resources yields
zero findings whether or not anything was examined, so the declaration is the only thing that
tells those two apart.
⚠️ AN EMPTY OR SHORT deferredScope IS NEVER A CLAIM OF FULL COVERAGE. Not every plugin
declares its boundaries, so the list bounds only what the declaring plugins state — it is not a
coverage inventory. Where the list is empty or short, say plainly that boundaries are declared
per-plugin and this is not an inventory. Never tell a user that an empty list means everything was
assessed. State this as a per-plugin invariant, never as a provider roster: a roster sentence goes
stale on the next Enterprise release, which is exactly why the CE tool description stopped carrying
one at CE 0.2.44.
Since EE 0.39.0 all three clouds declare: AWS through nine emitters, Azure through four (1022, 1220,
1221, 1222) and GCP through three (1021, 1024, 1025). Before that release only AWS declared, and the
asymmetry was itself the hazard — one provider disclosing is what makes another's silence read as
completeness. The AWS declarations are also now emitted once per RUN rather than once per region,
so the count no longer scales with the estate and no entry is region-stamped.
Cross-framework routing — cite the engine, do NOT freehand-map (post EE 0.32.7)
When a user asks which controls a finding maps to, read it from the engine's compliance
pack (the scan_compliance_<framework>.json artifact the CLI writes) — do not infer
a mapping from general security knowledge. The engine deliberately routes some findings
narrowly, and a plausible-looking freehand mapping will overclaim. The non-obvious
dispositions to know:
- Missing HSTS header → SOC 2 CC6.7 ONLY. It is deliberately not mapped to HIPAA
§164.312(e)(1), ISO A.8.9, CIS 3.10, NIST CSF, PCI DSS, or GDPR. The finding fires only
on an endpoint whose transport is encrypted (the header governs a future client's
downgrade, not the observed session), so failing a transmission-security or
secure-configuration control in the other six on one absent response header would
overclaim — a Required HIPAA standard or an IG1 CIS Safeguard flipped on a single-header
inference. (EE 0.32.7 §4B; routes to CC6.7 only, mutation-proven.) - Aggregate open-port count and the opportunistic-STARTTLS / port-inferred cleartext
variants also route to SOC 2 only — each is a breadth heuristic or a self-declared
unverifiable observation, not a per-transmission determination. - Otherwise, network-scan analysis-agent findings (
crypto_agent/exposure_agent) now
route across every shipped framework where the control subject matches (EE 0.32.7): a
confirmed cleartext channel fails HIPAA §164.312(e)(1), ISO A.8.24, NIST PR.DS-02,
CIS 3.10, PCI 4.2.1 and GDPR Art. 32(1)(a) as well as SOC 2 CC6.7.
If unsure, say the pack is what decides it and offer to run the CLI — never assert a control
mapping the engine did not emit, and never claim an MCP call produced a pack.
Suppressions — the workflow SHIPS, the signature does NOT (post EE 0.33.1)
An operator can mark a finding as accepted-risk or false-positive. That suppression workflow ships and is reachable: a suppressed finding renders with status FALSE_POSITIVE, set by an operator rather than by a probe, and the suppression is applied before the pack is written — so it sits inside the hashed artifact rather than being independently attested.
⚠️ Ed25519 SIGNING of suppressions became reachable in EE 0.35.0 via compliance suppress and was PROVEN at EE 0.36.0, verified for approvers whose registry entry carries key material — the verification gate ran against the published bytes and passed, tamper negative control included. Present a produced signature as verified evidence only for approvers whose registry entry carries key material; a fingerprint-only registry entry makes a report read not checked by this report, which records that no check ran and must never be reported as a failure. The signer backends and the frozen algorithm / backend record fields are groundwork, deliberately landed before reachability because retrofitting algorithm agility once signatures exist in customer archives would break every auditor holding one. Setting NSAUDITOR_SIGNING_KEY changes nothing today, because nothing calls the signer.
Never tell an operator their suppressions are cryptographically signed — not even in the softer form "signed once you configure a key". If asked what the SHA-256 chain-of-custody covers: it proves the pack was not altered after generation. It does not attest who suppressed a finding, when, or with what justification, and an assessor asking about suppressions usually wants the second thing.
⚠️ Disambiguation: "suppression" also appears in this package in the unrelated AWS SES email suppression list sense (plugin 1190). They are different subjects; check which one is being asked about.
Five-Phase Pipeline Architecture
NSAuditor AI follows an institutional five-phase pipeline:
Phase 1: DISCOVERY (CE) License → Plugin loading → PluginManager.run() → Concluder
Output: Fused scan with summary, OS, services[], evidence[]
↓
Phase 2: BASIC ANALYSIS (CE) Redaction → MITRE mapping → AI analysis (any provider)
Output: Admin raw JSON/HTML + AI reports + scan history
↓
[ License Gate: Pro required ]
↓
Phase 3: INTELLIGENCE (Pro) CPE generation → NVD CVE lookup → Parallel verification agents:
• Auth Agent (weak auth, default credentials)
• Crypto Agent (TLS, ciphers, certificates)
• Config Agent (misconfigs, debug exposure, CORS)
• Service Agent (CVE-specific targeted probes)
Output: Structured finding queue
↓
Phase 4: VERIFICATION PLANNED — NOT SHIPPED. The finding-status field and its
(planned, not shipped) risk-weighting scaffolding exist; the active safe probes
do not. Every finding today is emitted UNVERIFIED.
↓
Phase 5: SCORING (Pro/Ent) Risk scoring → Pro AI prompts → Compliance mapping
Output: Risk report + compliance report (Markdown, HTML, JSON)Phase 4 is a roadmap entry, kept in the diagram so the pipeline's shape is legible. The
Verification Engine was withdrawn as a capability claim at EE 0.32.7. Do not describe
findings as probe-confirmed (it is WITHDRAWN, not merely unused), and do not tell an
operator a finding was "verified" — seereferences/schemas.md§ Finding Statuses.
Plugin Reference (56 scanners — 27 Community + 29 Enterprise)
references/plugins.md is the authoritative catalog. The counts above are derived from the
shipped plugin files; verify any of them with nsauditor-ai license --plugins, which prints the
live total and marks each Enterprise plugin ✓ active or ✗ requires: <tier>.
The Community set groups roughly as service probes, host/network discovery, and intelligence /
meta plugins; three further plugins are Pro-gated (040 TLS Certificate & Cipher Auditor, 050
TRIBE v2 Probe, 060 DNS Security Auditor).
A per-plugin list used to be duplicated here and drifted: it claimed 18 Enterprise plugins
while enumerating 15, against 28 on disk. One catalog, inreferences/plugins.md.
Workflow Recipes
See references/workflows.md for detailed multi-step patterns:
- Full Security Audit — list_plugins → scan_host → get_vulnerabilities per service
- Targeted Service Investigation — probe_service(pluginId) → get_vulnerabilities
- Subnet Discovery — CLI:
nsauditor-ai scan --host <CIDR> --parallel 10 - CI/CD Pipeline — SARIF output with
--fail-onseverity gating - Continuous Monitoring (CTEM) —
--watch --interval <min> --webhook-url <url> - AI-Powered Report — Scan with AI provider (OpenAI/Claude/Ollama) + redaction
Decision Tree: Which Tool to Use
User wants to...
├── Scan a host comprehensively → scan_host
├── Audit a cloud account (AWS/GCP/Azure) → scan_cloud (Enterprise)
├── Check a specific service/port → probe_service (Pro)
├── Look up CVEs for software version → get_vulnerabilities (Pro)
├── See available plugins → list_plugins
├── Audit TLS certificates → probe_service with plugin 040 (Pro)
├── Check DNS security (SPF/DKIM/DMARC) → probe_service with plugin 060 (Pro)
├── Detect debug leaks / CORS issues → probe_service with plugin 050 (Pro)
├── Scan a subnet → CLI with --parallel (not MCP)
├── Set up continuous monitoring → CLI with --watch (not MCP)
├── State framework COVERAGE → compliance_matrix (any tier)
└── Produce a compliance EVIDENCE PACK → CLI with --compliance (not MCP)Data Schemas
See references/schemas.md for complete structures:
- Scan Result —
{ summary, host{os,mac,vendor,names}, services[], findings[] } - ServiceRecord —
{ port, protocol, service, program, version, status, banner, evidence[] } - Finding —
{ id, category, severity, title, evidence, remediation, cwe, mitre_attack[] } - CVE Response —
{ cpe, totalResults, vulnerabilities[]{cve_id, cvss, severity} } - Plugin Interface —
{ id, name, priority, run(), conclude(), requirements } - SARIF Output — 2.1.0 format for CI/CD consumers
Security Constraints
CRITICAL — Always observe these constraints:
Zero Data Exfiltration (ZDE): NSAuditor AI NEVER sends scan data externally unless
the user explicitly opts in to AI analysis with their own API keys. Nsasoft infrastructure
never sees scan data. Never suggest workflows that violate this boundary.SSRF Protection: The MCP server blocks loopback (127.x, ::1), link-local (169.254.x,
fe80:), and cloud metadata endpoints. SetNSA_ALLOW_ALL_HOSTS=1only for legitimate
local network auditing. DNS rebinding is also blocked via pre-resolution.AI Redaction: When AI analysis is enabled, the redaction pipeline scrubs:
- Private IPv4 addresses →
[REDACTED] - MAC addresses →
[MAC] - Serial numbers →
[REDACTED_HIDDEN] - Email addresses →
[REDACTED_EMAIL] - Bearer tokens →
[REDACTED_BEARER] - AWS keys →
[REDACTED_AWS_KEY] - Configurable via
CONFIDENTIAL_KEYWORDSenv var
- Private IPv4 addresses →
Scan Authorization: ALWAYS confirm the user has authorization to scan the target.
Never scan hosts without explicit user instruction. Unauthorized scanning is illegal.Non-Destructive: every scanner probe is a read-only query — NSAuditor AI never
exploits vulnerabilities or modifies target systems. (Active verification probes are
Planned — not shipped; findings are emitted UNVERIFIED.)
Configuration
Environment Variables
| Variable | Default | Purpose |
|---|---|---|
NSA_ALLOW_ALL_HOSTS |
unset | Set to 1 to scan RFC 1918 private ranges |
PLUGIN_TIMEOUT_MS |
30000 | Global per-plugin timeout |
AI_ENABLED |
false | Enable AI analysis |
AI_PROVIDER |
openai | openai · claude · ollama |
OPENAI_API_KEY |
— | OpenAI API key (or keychain:OPENAI_API_KEY) |
ANTHROPIC_API_KEY |
— | Claude/Anthropic API key |
OPENAI_MODEL |
gpt-4o-mini | OpenAI model name |
ANTHROPIC_MODEL |
claude-sonnet-4-20250514 | Anthropic model name |
OPENAI_REDACT |
true | Redact PII before AI submission |
CONFIDENTIAL_KEYWORDS |
serial,password,token,secret | Comma-separated keys to scrub |
NSAUDITOR_LICENSE_KEY |
— | Pro/Enterprise JWT license key |
COMPLIANCE_GRC_PROVIDER |
— | Enterprise — opt-in scan-time GRC push: vanta, drata, or secureframe. Needs COMPLIANCE_GRC_TOKEN; optional COMPLIANCE_GRC_BASE_URL / COMPLIANCE_GRC_CONTROL_MAP / COMPLIANCE_GRC_REDACTION (off/hash/remove). Egress is ZDE-redacted; token never serialized. Live tenant validation in progress. |
SCAN_OUT_PATH |
out/ | Output directory for scan results |
SMB_NULL_SESSION |
false | Allow SMB null session probe |
ENABLE_SYN_SCAN |
false | Enable Nmap TCP SYN scanning (requires root) |
Plugin-Specific Timeouts
| Variable | Default | Plugin |
|---|---|---|
TLS_SCANNER_TIMEOUT_MS |
8000 | TLS Scanner |
HTTP_PROBE_TIMEOUT_MS |
6000 | HTTP Probe |
WEBAPP_DETECTOR_TIMEOUT_MS |
6000 | Webapp Detector |
DNS_TIMEOUT_MS |
800 | DNS Scanner |
OPENSEARCH_SCANNER_TIMEOUT_MS |
6000 | OpenSearch Scanner |
Installation & Setup
# Install globally
npm install -g nsauditor-ai
# Start MCP server (stdio transport)
nsauditor-ai-mcp
# Or via npx (no global install)
npx nsauditor-ai-mcpAgent Integration
Claude Code:
claude mcp add nsauditor-ai -- npx nsauditor-ai-mcpClaude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"nsauditor-ai": {
"command": "npx",
"args": ["-y", "nsauditor-ai-mcp"],
"env": {
"NSA_ALLOW_ALL_HOSTS": "1",
"NSA_MCP_AUTH_KEY": "<from: nsauditor-ai mcp install-key>",
"PLUGIN_TIMEOUT_MS": "5000"
}
}
}
}⚠️
NSA_MCP_AUTH_KEYis REQUIRED — the server refuses to start without it. Generate one withnsauditor-ai mcp install-key, then put the SAME value in theenvblock above. Without it the MCP
server exits at startup and the client shows the tools as unavailable. (NSA_MCP_AUTH_DISABLE=1
exists as an escape hatch and warns on stderr; it is not the recommended path.)
Cursor / Windsurf / VS Code:
Add to your MCP configuration with the same command/args pattern.
Editions & Licensing
| Edition | Price | Key Features |
|---|---|---|
| Community | Free / MIT | 27 plugins (service probes + host/network discovery + intelligence/meta), basic AI, CTEM, SARIF, scan history |
| Pro | $49/mo | + CVE matching, risk scoring, analysis agents, Pro plugins (040 TLS / 050 TRIBE / 060 DNS) |
| Enterprise | $2k+/yr | + 29 enterprise plugins (1020-1230 range) — 28 cloud-substrate auditors covering AWS / GCP / Azure plus 1023 Zero Trust Assessment (which declares no cloud provider and scores zero-trust posture from a NETWORK-host scan — it never runs on a cloud pass, and selecting it by id on its own does not run it either) — against every shipped framework (SOC 2 10 covered + 4 partial; HIPAA; NIST CSF 2.0; PCI DSS v4.0.1; ISO/IEC 27001:2022; CIS Controls v8; GDPR Art. 32 infrastructure substrate; NIST SP 800-171 Rev 2 evidence substrate for CMMC Level 2 preparation); SOC 2 evidence-pack generation; SHA-256 chain-of-custody attestations (RFC 3161 timestamping is opt-in via the NSAUDITOR_TSA_URL environment variable — there is no CLI flag and no default, it makes an outbound call to the Time-Stamp Authority you name, and it was exercised against a live Time-Stamp Authority on BOTH delivery vehicles — the npm path and, from inside the pushed :0.33.0 Marketplace image, on 2026-08-08; retained images :0.32.11 and earlier carry no openssl); air-gapped operation (offline licensing + offline CVE matching under NSAUDITOR_OFFLINE_ONLY=1) |
→ Pricing
Error Handling
| Error | Cause | Resolution |
|---|---|---|
| SSRF block | Target is loopback/metadata/private | Set NSA_ALLOW_ALL_HOSTS=1 for local scanning |
License gate (🔒) |
Pro/Enterprise tool on CE | Upgrade license or use CE alternative |
| Plugin timeout | Network unreachable / slow target | Increase timeout param or PLUGIN_TIMEOUT_MS |
| No DNS banner | Provider blocks CHAOS/TXT queries | Expected; not all DNS servers expose version |
| CPE format error | Malformed CPE string | Use cpe:2.3:a:vendor:product:version:*:*:*:*:*:*:* |
| No services found | Host down or heavily firewalled | Try NSA_VERBOSE=true to debug; check connectivity |
| AI analysis failed | Bad API key or provider down | Check AI_PROVIDER and API key env vars |
MITRE ATT&CK Mapping
Findings are auto-tagged with MITRE techniques:
| Finding Type | Technique | ID |
|---|---|---|
| SSH vulnerability | Remote Services: SSH | T1021.004 |
| SMB vulnerability | Remote Services: SMB | T1021.002 |
| FTP anonymous login | Valid Accounts | T1078 |
| DNS zone transfer | Gather Victim Network Info | T1590.002 |
| SNMP default community | Network Sniffing | T1040 |
| TLS weakness | Adversary-in-the-Middle | T1557 |
| Debug/stack trace exposure | Gather Victim Host Info | T1592 |
| Weak authentication | Brute Force | T1110 |
Output Formats
| File | Format | Purpose |
|---|---|---|
scan_conclusion_raw.json |
JSON | Full unredacted scan data (admin) |
scan_conclusion_raw.html |
HTML | Admin dashboard with filters |
scan_response_ai_payload.json |
JSON | Redacted payload sent to AI |
scan_response_ai.html |
HTML | Styled report with CVE links, severity badges |
scan_response_ai.txt |
Markdown | AI vulnerability assessment (text) |
| SARIF | JSON | CI/CD integration (GitHub Advanced Security, Azure DevOps) |
| CSV | CSV | Tabular export of findings |
| JSONL | JSONL | Scan history for CTEM delta analysis |