安全软件
点击放大

Security Intelligence Without Data Exposure.
A modular, AI-assisted network security audit platform that scans, understands, prioritizes, and tracks — without e your data to leave your infrastructure.
![npm]()

![Node.js 20+]()

---
NSAuditor AI is the open-source core of a pri security intelligence platform built by Nsasoft US LLC. It orchestrates 27 specialized scanning plugins against target hosts, fuses their results through an intelligent concluder, and optionally produces AI-powered reports — all running entirely on your machine.
Zero Data Exfiltration by design — and stated precisely. We never see your scan data: no customer data is collected, transmitted, or stored by Nsasoft US LLC, and the product has no telemetry or phone-home endpoint. Scanning, analysis, license and report generation all run on your machine. Two clarifications that matter operationally: AI enrichment is opt-in and uses your own API keys (point it at a local Ollama and nothing leaves the host), while C queries NIST's public NVD API by default — set NSAUDITOR_OFFLINE_ONLY=1 with a local N to make it fully local, which reports an explicit co gap in the scan instead of a silent clean (in Enterprise 1.2.0 that gap reaches no compliance control, so a control only the missing CVE rows would fail can read PASS).
Latest: CE 0.2.56 + Enterprise 1.2.0 — *the delta refuses five more ways a finding could read as fixed without being fixed*.
The Pro/Enterprise report --since delta (introduced in CE 0.2.55) now refuses five more ways a
finding could read as fixed without being fixed: a UDP service that did not answer in the
other run (port-not-measured, listed as <port>/udp), a CVE row whose lookup failed there, a
finding of an analysis agent that did not run, and — new in this release — **an Enterprise package
that failed to load**, which used to leave its plugins running while the scan skipped its intelligence,
analysis-agent and compliance stages without a word. It is now
named on stderr and recorded on the scan's conclusion, and the delta refuses that host's agent and
C rows as e. And a CVE row that while the same program and
still answer is ed — the data moved, not the estate.
Not refused in this release: when the two scans ran different --plugins, a row that an analysis agent or
the C derived from the output of a plugin one scan did not request can read resolved (and in Enterprise,
with SLA tracking on, MTTR counts it closed and the control it failed can read PASS) or new — keep --plugins
identical between compared scans. Every
reason's detail names its run absolutely ("this run", "the baseline run"), and two scans of one host
whose plugin runs finished in the same second get distinct directories. Plugin counts UNCHANGED at 27 Community + 29 Enterprise; every co matrix UNCHANGED; **Enterprise 1.2.0
requires this release** (nsauditor-ai >= 0.2.56). The free last- webhook alerting delta
is untouched and stays free; in this release it does not fire on a service, or finding change (see
Continuous Monitoring below).
For the full per-release history — every prior cycle, in detail — see CHANGELOG.md. This README keeps only the current release headline.
--fail-on se gating for pipeline integrationNSAuditor AI is a in three editions: Community (free, MIT-licensed, no restrictions), Pro ($49/mo), and Enterprise ($2k+/yr).
→ What Pro and Enterprise add — the long-form comparison behind the table below.
| | Community (Free) | Pro ($49/mo) | Enterprise ($2k+/yr) |
|---|:---:|:---:|:---:|
| Network scanning | | | |
| 27 scanner plugins (SSH, HTTP, TLS, DNS, SMB, RPC, mDNS, etc.) | ✅ | ✅ | ✅ |
| AI analysis (OpenAI, Claude, Ollama — your keys) | ✅ basic | ✅ enriched | ✅ enriched |
| Structured findings + SARIF + CS | ✅ | ✅ | ✅ |
| CTEM watch mode | ✅ basic | ✅ ad | ✅ ad |
| Pro features | | | |
| C + MITRE ATT&CK mapping | — | ✅ | ✅ |
| Risk scoring + prioritization | — | ✅ | ✅ |
| Exploit intelligence — CISA KEV + FIRST EPSS joined onto the C, exploit-first ordering (a KE MEDIUM outranks an unexploited CRITICAL); stores are operator-populated — no feed data ships | — | ✅ | ✅ |
| Parallel analysis agents | — | ✅ | ✅ |
| Client reporting — report --format executive renders a completed run as a self-contained, print-ready HTML report with optional co branding (--brand); --format jira writes a Jira-importer CSV. ⚠️ The Jira import mapping is done in Jira and has not been against a live Jira instance. | — | ✅ | ✅ |
| Enterprise — cloud scanning | | | |
| 29 enterprise plugins — 28 cloud (AWS / Azure / GCP) + 1 network-scan zero-trust check | — | — | ✅ |
| Zero Trust assessment | — | — | ✅ |
| Enterprise — compliance (8 frameworks) | | | |
| SOC 2 (AICPA TSC 2017) — 10 covered + 4 partial controls | — | — | ✅ |
| HIPAA Security Rule §164.312 — Zero BAA required | — | — | ✅ |
| NIST CSF 2.0 Core — Subcategory-le (106 of 107 Subcategories) | — | — | ✅ |
| PCI DSS v4.0.1 — Sub-requirement-le for QSA RoC | — | — | ✅ |
| ISO/IEC 27001:2022 — per-Annex-A-code mapping + SoA discipline (93 Annex A controls) | — | — | ✅ |
| CIS Critical Security Controls v8 — per-Safeguard mapping + IG-cumulati (153 Safeguards / 18 Controls) | — | — | ✅ |
| GDPR Article 32 (Security of Processing) — Art. 32 infrastructure substrate (4 covered + 5 partial + 2 OOS / 11 sub-measure units); not GDPR compliance · Art. 83(4) lower fine tier | — | — | ✅ |
| NIST SP 800-171 Rev 2 — e substrate for CMMC Level 2 preparation; all 110 Rev 2 requirements enumerated (2 covered + 49 partial + 59 OOS). Not a certification, not a FedRAMP authorization, no MET/NOT MET , no SPRS score | — | — | ✅ |
| Multi-framework --compliance soc2,hipaa,nist-csf,pci-dss,iso-27001,cis-v8,gdpr,nist-800-171 from one scan | — | — | ✅ |
| Enterprise — auditor-grade e | | | |
| E packs with SHA-256 chain-of-custody (RFC 3161 timestamps opt-in via NSAUDITOR_TSA_URL, exercised against a live TSA on both the npm path and the :0.33.0 container image; retained images :0.32.11 and earlier carry no openssl) | — | — | ✅ |
| Suppression workflow with appro (Ed25519 SIGNING reachable 0.35.0, proven 0.36.0, per appro key material) | — | — | ✅ |
| Ed25519 e signing — compliance sign-pack signs the chain-of-custody en at an appro with an operator-held key, so the scanning fleet stays keyless and authorship is relative to your own key custody, never a attestation. compliance establishes authorship from that operator-held key and re-hashes every artifact the en names, co one framework en and the artifacts it enumerates — not the pack, not the directory. offline with openssl alone. | — | — | ✅ |
| Chain-of-custody manifests | — | — | ✅ |
| SLA / MTTR tracking + compensating controls | — | — | ✅ |
| Recurring-scan attestation (Type II operating-effecti) | — | — | ✅ |
| WORM POSTURE on your own buckets (S3 Object Lock — SEC 17a-4 / FINRA 4511 substrate). The engine WRITING into the immutable store is built, not reachable | — | — | ✅ |
| Enterprise — integration + deployment | | | |
| GRC connectors — Vanta + Drata + Secureframe push (scan-time, opt-in) | — | — | ✅ |
| Tabletop simulation + SIEM correlation — built, not reachable (no caller) | — | — | 🚧 |
| Air-gapped operation once installed — offline licence (local ES256, no callback, every tier) and offline C under NSAUDITOR_OFFLINE_ONLY=1, which is the Pro intelligence engine. The feed bundle / feed import hand-carry pipeline (EE 0.37.0) moves the N you downloaded; it needs the Enterprise package installed but is not licence-gated, so a Pro licensee can run it. | — | ✅ | ✅ |
| Air-gapped DELIVERY — the dependency-complete offline installation tarball, install script and checksums (EE 0.37.0), distributed restricted, amd64 only. No container image bundle ships and arm64 images remain WITHDRAWN. | — | — | ✅ |
This repository is the Community Edition — fully functional, MIT-licensed, no restrictions, no telemetry. Pro and Enterprise features ship via the /nsauditor-ai-ee package and install alongside the CE binary once licensed.
→ Get Pro or Enterprise →
---
Enterprise Edition is also a as an AWS Marketplace container listing — same product, same local ES256 license key, billed through your AWS account (consolidated billing / EDP drawdown, procurement-friendly; custom Enterprise terms via AWS Private Offers). *The listing is public. If it doesn't resolve in your AWS region or account, contact us and we'll extend a Private Offer directly.*
How Marketplace fulfillment works (ZDE and air-gap preserved — no runtime AWS dependency at scan time):
1. Subscribe on the listing (tiers base / growth / scale mirror the 5 / 25 / unlimited-seat plans).
2. Register your email + AWS account ID at the URL shown in the listing's usage instructions — your ES256 license key arrives by email.
3. Pull and run the Docker image from the Marketplace registry (commands in the listing's usage instructions and your license email) with NSAUDITOR_LICENSE_KEY=<your key>. One tier-agnostic image — upgrades are just a new license key, never a new image. The container runs fully offline after that; billing lives in AWS, enforcement is your local key.
Or run without installing:
Or clone and run from source:
Results land in ./out/<host>_<timestamp>/:
| File | Contents |
|---|---|
| scan_conclusion_raw.json | Full unredacted conclusion (admin reference) |
| scan_conclusion_raw.html | Admin RAW HTML with filters and full detail |
| scan_response_ai_payload.json | Redacted payload sent to AI |
| scan_response_ai.json | Raw AI API response |
| scan_response_ai.txt | AI conclusion (markdown) |
| scan_response_ai.html | Styled HTML report with C and badges |
| scan_results.sarif.json | SARIF 2.1 — only with --output-format sarif (renamed scan_<host>.sarif.json for multi-host runs) |
| scan_results.csv | CSV — only with --output-format csv |
| scan_report.md | GitHub-flavored Markdown report — only with --output-format md (or markdown) |
> Works on Node 20+ (tested on Node 22).
---
> Heads-up on AI-client fabrication. Some MCP clients (notably Claude Desktop) can silently substitute AI-generated responses if a tools/call times out, instead of surfacing the failure. Every response from this server now ends with a ── MCP call ── footer and a UUID. Run nsauditor-ai mcp <id> to confirm a response is genuine before acting on it. Full background and workflow: docs/mcp-.md. When in doubt, generate compliance e via the CLI (nsauditor-ai scan ...), which has no MCP client in the path.
Expose scanning capabilities to AI assistants via Model Context Protocol:
Run the installed bin, never npx nsauditor-ai-mcp: nsauditor-ai-mcp is a bin inside the nsauditor-ai package, and when npx does not find that bin it looks the name up on the npm registry instead — which ne this server. For Claude Desktop, paste the blocknsauditor-ai mcp install-key prints (Claude Desktop Setup, below).
The ser seven tools and lists all seven to every client. The licence is
checked when a tool is CALLED, not when the list is served — so an unlicensed call returns
an explicit 🔒 refusal naming the tier it needs, never an empty result that reads as "nothing
found". A higher tier does not add tools; it unlocks the ones already in the list.
A on every tier:
| Tool | Purpose |
|---|---|
| scan_host | Run a full plugin scan against a host — service detection, OS fingerprint and the flags the service checks leave on each service record (weak SSH algorithms, SNMP community, weak TLS protocols / ciphers and a self-signed certificate, the MCP ser; anonymous FTP login and zone transfer only when FTP_CHECK_ANON / DNS_CHECK_AXFR are set — both off by default). It does NOT look up CVEs, run the analysis agents, or return the HTTP probe's dangerous methods (006), SMB null sessions (014), the TLS-certificate / debug-endpoint / DNS-security auditors' findings (040 / 050 / 060) or Enterprise's zero-trust assessment (1023), so zero findings is not a clean (use get_ per service CPE and probe_service for those plugins — both Pro — or the CLI scan with the Enterprise package and a Pro or Enterprise licence) |
| list_plugins | List a scanner plugins with their IDs, priorities and requirements |
| compliance_matrix | Return the shipped co matrix for a framework — Covered / Partial / Out of scope, with the per-group out-of-scope reasons. Needs the Enterprise pack installed: the matrices are its data, so on a Community-only install this fails closed with an install instruction rather than returning an empty matrix (an empty matrix is what gets filled in with a guess) |
Unlocked by Pro (licence key + /nsauditor-ai-ee):
| Tool | Purpose |
|---|---|
| probe_service | Run one specific plugin against a single host:port |
| get_ | Look up known CVEs for a CPE (Common Platform Enumeration) string via the NVD API |
Unlocked by Enterprise:
| Tool | Purpose |
|---|---|
| scan_cloud | Audit one or more cloud accounts (AWS / GCP / Azure) using ser credentials; no network host. "Audit my AWS account" / "Audit my AWS and Azure accounts". |
| get_findings | Drill into the findings of the most recent scan_cloud run (per-provider session cache — not li) |
> scan_cloud runs the requested clouds' plugins concurrently (default up to 20 at once, 25s per-plugin
> timeout; a plugin that runs out is listed as timeout in the result's manifest, i.e. not measured). Tune with
> CLOUD_SCAN_CONCURRENCY (default 20) and CLOUD_PLUGIN_TIMEOUT_MS (default 25000) in the server env. The
> network PLUGIN_TIMEOUT_MS governs scan_host and probe_service, and binds every plugin there — including
> one that declares a longer budget of its own. Read the result's findingsSummary
> (per-provider se counts + a CRITICAL/HIGH list) for the findings; audited:false / notes / pluginsRan:0
> still mean a cloud was NOT audited (never a clean pass). Pass pro:["aws"] to audit only the cloud named.
> All-region AWS co. The server does not split a regions:["all"] call into batches; the agent skill
> (nsauditor-ai-agent-skill) teaches the assistant to cover the enabled regions in batches of 3–5 region codes per
> call. CLOUD_PLUGIN_TIMEOUT_MS (default 25000) bounds each plugin, not the call: raising it can give a slow
> plugin more time and lengthen the call. A call that times out in the client returned no result — never read it as
> a clean account. For unbounded multi-region scans use the CLI (nsauditor-ai scan … --aws-region all), which
> has no MCP client in the path — there you can raise PLUGIN_TIMEOUT_MS (e.g. 90000) freely. On the CLI a
> plugin that declares its own budget already gets it; PLUGIN_TIMEOUT_CEILING_MS caps those.
Security: SSRF protection on all host inputs (blocks RFC 1918, loopback, fc00::/7, cloud metadata), port (1–65535), CPE format enforcement, dependency injection for test isolation. Ser authentication is required — see next section.
The MCP server uses stdio transport, which means it runs as a child process of whate launches it. Without authentication, any process running as your user could spawn the server and use its tools — including the Pro/Enterprise tools that talk to AWS, generate compliance reports, and access your scan history. A per-operator shared-secret check at ser closes this gap.
One-time setup (run once per machine after npm install -g nsauditor-ai):
This generates a 256-bit auth key, stores it in the macOS Keychain (or ~/.nsauditor/.env mode 0600 on Linux/Windows), and prints the Claude Desktop config snippet for you to paste. The MCP ser to start unless the en key matches the stored key (constant-time compare; mismatch produces an actionable error pointing at this command).
Inspect / :
Why the Claude Desktop config snippet uses keychain: indirection on macOS: the printed snippet looks like "NSA_MCP_AUTH_KEY": "keychain:NSA_MCP_AUTH_KEY" rather than the literal key value. The MCP ser the placeholder from your Keychain at startup. Net effect: the secret ne in ~/Library/Application Support/Claude/claude_desktop_config.json (which is mode 0644 by default — readable by other local users and any macOS app with Documents/Application Support entitlement). On Linux/Windows where there's no Keychain equi, the snippet uses the literal key with an explicit chmod 600 warning.
Threat model — what this defends, what it doesn't:
| Threat | Defended? |
|---|---|
| Malicious npm post-install / browser extension running as you spawning the server | ✅ — attacker cannot read your Keychain without GUI prompt |
| Other users on a shared dev box / CI runner | ✅ — key is per-operator |
| Future HTTP/SSE transport network exposure | ✅ — key gates ser, not network |
| Attacker with full operator code-exec AND can suppress macOS Keychain prompts | ⚠ partial — recent macOS log Keychain-access denial events |
| Debugger-attach memory snooping | ⚠ out of scope (any shared-secret auth has this limit) |
| Linux env- in /proc/<pid>/environ | ⚠ partial — see Linux note below |
Linux note (/proc/<pid>/environ): on modern Linux, /proc/<pid>/environ is readable only by the process owner (the same user that spawned the MCP server). Other users on a multi-user system cannot read your MCP auth key from /proc under default kernel settings. The realistic remaining risks are:
auditd configured to log child-process en: review your auditd rules; modern setups exclude env from logs by default.ps eww command on older POSIX systems (modern ps respects /proc permissions).A shell-wrapper indirection script (read key from ~/.nsauditor/.env at exec time, pass to child) was considered for v1 but does NOT solve the underlying issue: the spawned MCP ser needs the key in its env to perform the auth check, so it appears in /proc/<ser>/environ regardless of how the parent process obtained it. v2 may add libsecret integration on Linux to mirror the macOS Keychain indirection model.
Rotation cadence: keys older than 90 days emit a soft warning at every ser AND in nsauditor-ai mcp status output. SOC 2 CC6.1 / CC6.7 re expect a credential-rotation cadence; rotate with nsauditor-ai mcp rotate-key --confirm and update Claude Desktop config with the new key.
Escape hatch for CI / dev (operator-acknowledged risk; emits a stderr warning every startup):
First install the package globally:
Then paste the mcpServers block that install-key prints into your claude_desktop_config.json (Settings →
De → Edit Config). It names node and the ser by absolute path, because Claude Desktop may not see
the directory your shell finds nsauditor-ai-mcp in. Add any other to its env block, for example:
The exact NSA_MCP_AUTH_KEY value to paste is printed by nsauditor-ai mcp install-key — on macOS it's the keychain:NSA_MCP_AUTH_KEY placeholder shown above; on Linux/Windows it's the literal key value (and you should chmod 600 your config file).
NSA_MCP_AUTH_KEY — required (see Authentication section above)NSA_ALLOW_ALL_HOSTS=1 — required to scan private/RFC 1918 addresses (e.g., 192.168.x.x). It turns off the MCPlocalhost, 127.x, ::1, 169.254.x or metadata.google… stay refusedFTP_CHECK_ANON=true — lets the FTP check try an anonymous login (off by default; without it scan_host ne anonymous FTP). DNS_CHECK_AXFR=true with DNS_AXFR_DOMAIN=<zone> — lets the DNS check try a zone transfer of that zone (off by default). The same govern the CLI scan.PLUGIN_TIMEOUT_MS=5000 — the per-plugin budget for scan_host and probe_service (default 30000), and it binds every plugin there, including one that declares a longer budget of its own. It bounds each PLUGIN, not the call: scan_host runs a host's plugins one after another, so the call takes roughly the sum of their times. On one router a scan_host call timed out in Claude Desktop on 2026-08-10 and one returned within 138 s on 2026-09-30, so neither outcome is promised: a call that times out returned no result — never read it as a clean host. On a real home gateway the plugins of one full scan took ~113 s between them at the default budget.PLUGIN_TIMEOUT_CEILING_MS — the upper bound on any plugin's DECLARED budget (default 120000). A few plugins declare their own budget because their cost grows with what they scan (the UPnP and MCP scanners here; several cloud auditors in Enterprise). On the CLI a declaration outranks PLUGIN_TIMEOUT_MS, so this is the setting that caps every plugin there. The MCP tools already bind declarations with their own limits.CLOUD_SCAN_CONCURRENCY — max cloud plugins run at once by scan_cloud (default 20).CLOUD_PLUGIN_TIMEOUT_MS — per-plugin timeout for scan_cloud (default 25000; independent of the network PLUGIN_TIMEOUT_MS). It bounds each plugin, not the call — see the all-region note abo raising it.AI_PROVIDER and API key — optional, enables AI-powered analysis of scan results#### NSA_EN — point the MCP server at an en file
Instead of inlining every scan in the config above, set NSA_EN to a
dotenv file and keep the cloud credentials, CLOUD_PROVIDER, and scan tuning there. To scan
a different account or cloud, change the one path (or swap the file) and restart Claude Desktop —
no JSON editing.
env block.AWS_* keys still in the config env block) that the file does not set are cleared, so a partialNSA_MCP_AUTH_KEY and NSAUDITOR_LICENSE_KEY are resolved before the file and must stay~/.nsauditor/.env); if present in NSA_EN they are ignored.To target an en via the file, add it as an en:
(On Linux/Windows, replace the keychain:NSA_MCP_AUTH_KEY placeholder with the literal key printed by install-key.)
"MCP authentication is not configured" at ser → run nsauditor-ai mcp install-key. If you set NSA_MCP_AUTH_DISABLE=1 in CI by intent, that's fine — but check that you didn't forget it in your shell rc.
"NSA_MCP_AUTH_KEY env var is not set, but a key is configured in storage" → the ser a key in your Keychain (or ~/.nsauditor/.env) but the spawning client didn't pass NSA_MCP_AUTH_KEY in the en. Update your Claude Desktop / Claude Code config to include the en (use nsauditor-ai mcp install-key output as a reference snippet).
"NSA_MCP_AUTH_KEY env var does not match the key configured in storage" → most often means you ran nsauditor-ai mcp rotate-key --confirm but didn't update Claude Desktop config with the new key. Run nsauditor-ai mcp status to confirm storage source, then either re-paste the new key or use keychain:NSA_MCP_AUTH_KEY indirection (macOS only) so future rotations don't require a config change.
"MCP_AUTH uses keychain: indirection but the referenced Keychain entry could not be read" → typically a headless macOS / SSH-only CI runner where there's no GUI session to appro access. Replace the keychain: placeholder with the literal key value (or move auth to ~/.nsauditor/.env with mode 0600).
mcp status reports keychain-locked → distinct from unconfigured: the Keychain entry exists but the security daemon refused to unlock without a GUI prompt. Same workarounds as the previous error: approve a Keychain GUI prompt, replace keychain: indirection with the literal key, or move auth to ~/.nsauditor/.env.
mcp status shows ⚠ Created: ... — > 90d threshold → key is older than the 90-day rotation cadence. Run nsauditor-ai mcp rotate-key --confirm and update Claude Desktop config with the new key. Ser the same warning to stderr at every startup.
Claude Desktop reports "Current tier: CE" despite nsauditor-ai license --status showing Enterprise → first run nsauditor-ai mcp tier to get the ground-truth tier the MCP ser resolves at startup. If mcp tier reports enterprise but Claude Desktop's list_plugins says CE, the AI client is synthesizing the response without actually calling the tool — see docs/mcp-.md and any suspicious response with nsauditor-ai mcp <id>.
If mcp tier itself reports CE → genuine resolution failure. Inspect the license storage:
If license is in ~/.nsauditor/.env but not in Keychain on macOS, re-run nsauditor-ai mcp install-key — the auto-mirror writes the license to Keychain so Claude Desktop's child process can read it via the keychain: indirection.
---
Store API keys in the macOS Keychain instead of plaintext .env files:
Then reference them with the keychain: prefix in .env or Claude Desktop config:
The keychain: prefix works anywhere an API key is read — CLI, MCP server, or programmatic API.
---
> Run nsauditor-ai --help (or -h, or just nsauditor-ai help) for a quick reference of subcommands, flags, env vars, and worked examples — works without a license key configured. -- / -v prints nsauditor-ai <> and exits 0.
| Flag | Description | Default |
|---|---|---|
| --host <target> | Target: IP, hostname, CIDR, dash range. Aliases: --ip, --target | *required*\* |
| --host-file <path> | File with one host per line (# comments, blank lines OK) | — |
| --plugins <list> | Comma-separated plugin IDs or all | all |
| --ports <list> | Additional ports to scan, merged into the default config-derived list. Comma-separated. Optional /tcp or /udp suffix per entry (default: tcp). Examples: 8090 · 8090,9090 · 8090/tcp,5353/udp. Use this to scan custom services on non-standard ports (e.g. MCP servers on 8090). A range such as 1-1000 is not parsed and adds nothing | — |
| --out <dir> | Custom output directory — applies to the per-scan folder *and* to alternate-format files (SARIF/CS) | out/ |
| --parallel <n> | Concurrent host scans | 1 |
| --output-format <fmt> | Additional output format: sarif (CI/CD) · csv (spreadsheet) · md or markdown (chat/PR/Slack quotable) | — |
| --fail-on <sev> | Exit code 1 if a flag it gates on is ≥ se (critical\|high\|medium\|low\|info): anonymous FTP login and DNS zone transfer are critical, weak SSH algorithms medium, and any concluded scan counts as info — so --fail-on info fails every scan that concludes. Anonymous FTP login and zone transfer are tested only when FTP_CHECK_ANON=true / DNS_CHECK_AXFR=true with DNS_AXFR_DOMAIN are set, so on a default scan --fail-on high and --fail-on critical never exit 1. It also reads dangerous HTTP methods (medium), but no scan's conclusion carries that flag today. It does not read the SNMP default community, weak TLS protocols / ciphers, a self-signed certificate, the MCP ser, Enterprise's CVE rows or agent findings, so exit 0 is not a clean host; exit 2 for an unknown se or no conclusion | — |
| --insecure-https | Accept self-signed TLS certificates | false |
| --watch | CTEM continuous alerting loop — re-scan on --interval, compare each host with its previous scan ([ScanHistory] lines), webhook on --alert-se — but not on a service, or finding change in this release (see Continuous Monitoring). Not an e cadence: no retention, no cross-run aggregation, skips SARIF/CS + --fail-on, dies with the process. Use a scheduler for SOC 2 Type II history. | false |
| --interval <min> | Rescan interval in minutes (requires --watch) | 60 |
| --webhook-url <url> | Webhook URL for watch-mode alerts (see --watch) | — |
| --alert-se <sev> | Minimum se for webhook alerts | high |
| --compliance <fw> | Compliance framework to map findings into. Accepts CSV for multi-framework runs (e.g. soc2, hipaa, nist-csf, pci-dss, iso-27001, cis-v8, gdpr, nist-800-171, or any combination like soc2,hipaa,nist-csf,pci-dss,iso-27001,cis-v8,gdpr,nist-800-171 — all expands to the same eight). Enterprise license required. Supported frameworks as of EE 0.40.0 — eight: soc2 (AICPA TSC 2017) + hipaa (HIPAA Security Rule §164.312 Technical Safeguards) + nist-csf (NIST Cybersecurity Framework 2.0 Core, CSWP 29 Feb 2024) + pci-dss (PCI DSS v4.0.1, PCI SSC June 2024 errata) + iso-27001 (ISO/IEC 27001:2022, ISO + IEC October 2022) + cis-v8 (CIS Critical Security Controls v8, CIS May 2021 / v8.1 errata June 2024) + gdpr (GDPR Article 32 / Security of Processing, Regulation (EU) 2016/679 — Art. 32 infrastructure substrate, not GDPR compliance) + nist-800-171 (NIST SP 800-171 Rev 2 — e substrate for CMMC Level 2 preparation, not a CMMC certification, not a FedRAMP authorization, and no MET/NOT MET determination or SPRS score). See /nsauditor-ai-ee README for per-framework co details. | — |
| --compliance-scope <path> | Optional JSON file describing the assessment scope (passed to the compliance engine for co attestation) | — |
| --help, -h | Print usage block (subcommands, flags, env vars, examples) and exit 0 | — |
| --, -v | Print nsauditor-ai <> and exit 0 | — |
\* Either --host or --host-file is required.
| Format | Example | Description |
|---|---|---|
| Single IP | 192.168.1.1 | Scan one host |
| Hostname | example.com | Resolved via DNS |
| CIDR | 192.168.1.0/24 | All usable hosts (min prefix: /16) |
| Dash range (short) | 192.168.1.1-50 | Last-octet range |
| Dash range (full) | 10.0.0.1-10.0.1.254 | IP-to-IP range (max 65534) |
| Host file | --host-file targets.txt | One host/CIDR/range per line |
commandnsauditor-ai runs a fast (<2s) en check without scanning anything. Useful for CI/CD setups, Docker HEALTHCHECK probes, and first-time-user diagnosis. Each check returns a status; the o exit code is 0 (all OK), 1 (warnings), or 2 (errors).
Checks: plugin discovery, license JWT (if key set), AI provider configuration, output-directory writability + free space, DNS resolution.
Docker HEALTHCHECK example:
report command (Pro/Enterprise)nsauditor-ai report --from <dir> --format executive|jira turns a completed scan run under --from into a client-facing deli — an HTML report a consultant sends to their customer, or a Jira-importer CSV.
What it reads. A scan record keeps findings in more than one place, and the report reads all of them: each plugin's result.findings (an array, or a dict of categories as the DNS auditor emits), zero-trust dimension findings, per-port TLS issues, and the finding queue (scan_finding_queue.json) that carries the CVE/KE entries. result.data is deliberately NOT read — on a network scan it holds probe telemetry, not findings. The container in is enforced by a census: a container holding findings that no reader opens fails the build rather than rendering as a clean report.
| Flag | Description | Default |
|---|---|---|
| --from <dir> | The scan --out directory holding the run's record and per-host e | *required* |
| --format executive | Self-contained, print-ready HTML report; no external network reference other than an http(s)/mailto <a href> | — |
| --format jira | Jira-importer CSV (Summary/Description/Priority/Labels/External ID); the import mapping is done in Jira and has not been against a live Jira instance. pass-tier records are EXCLUDED — a Jira issue is a work item and a passing check is not work; every other tier is kept, INFO included, because INFO carries the e gaps and scope boundaries. Passing checks appear in the executive report under their own PASS tier. | — |
| --run <id> | Report a specific run id instead of the newest one under --from | newest run |
| --since <runId\|prior> | Compare the reported run with a baseline run under --from: prior is the run that started immediately before it, or name a run id. The executive report lists each new, resolved and changed finding, and each finding that could NOT be compared with its reason; stdout prints the counts, the changed and not-comparable rows and the limits; the jira CS none of it. Keep --plugins identical between the two scans (see What's New). Every refusal exits 2: if the baseline was found but cannot support a comparison, the executive report is still written, states the refusal and lists no new, resolved or changed finding; if no baseline is found, if the reported run's own record fails , or with --format jira, nothing is written | — |
| --brand <brand.json> | Co branding (company name, prepared-by, contact, logo) — --format executive only | unbranded |
| --out <path> | Write to this path instead of report_<runId>.<ext> beside the run record | report_<runId>.<ext> |
| --allow-partial | Render even if some requested hosts were ne, or the run ne completion — the caveat is stated on the cover, ne | false |
A --from/--brand/--run/--out/--since (nothing after the flag, or a shell glob that swallowed the argument) is a fatal error, not a silent default.
Exit contract — 0 a report was rendered · 1 fix the RUN (no run record under --from, or an
incomplete run without --allow-partial) · 2 fix the REQUEST or its en (an unknown or
missing flag value, an unwritable --out, a --brand file that is refused, or a --since comparison
that could not be made — see --since above).
⚠️ --brand with --format jira is refused, not ignored: a Jira CSV has nowhere to put branding,
and silently dropping a flag the caller passed is how a report goes out unbranded without anyone
noticing.
#### The brand.json file
--brand takes a small JSON object. Every field is optional; omit the file entirely and the report
renders unbranded with the default title.
| field | type | default | notes |
|---|---|---|---|
| title | string | Network Scan Report | Replaces the report's headline. |
| companyName | string | *(empty)* | The client the report is prepared for. |
| preparedBy | string | *(empty)* | The consultant or firm preparing it. |
| contact | string | *(empty)* | Free text — an address, an email, a phone number. |
| logoPath | string | *(none)* | A local PNG or JPEG, resol to the brand file's own directory. Embedded into the HTML as a data URI. |
**logoPath is deliberately restrictive, and each refusal protects the report's core promise —
that it opens with no external network reference of any kind:**
\\host\share\...) is refused for the same reason: it is a network reference.../ escapes are refused, checkedlogo.svg to logo.png does not get it past the check.brand.json that emits "" is not an error.A brand file that cannot be read, is not valid JSON, is not a JSON object, or whose logoPath is
refused is a fatal error — the report is not written. A flag you passed is ne
dropped, because that is how a report goes out unbranded without anyone noticing.
⚠️ --brand applies to --format executive only. Passing it with --format jira is refused,
not ignored: a CSV has nowhere to put a cover page.
---
After purchasing at nsauditor.com/ai/pricing, you'll receive an email with your license key and an npm install command. Two steps:
:
License keys are delivered automatically webhook — no manual processing. Subscription renewals generate a fresh key and email it to you before the current one expires.
No license key? E in this repository works perfectly without one. The CE is not crippled — it's a complete, production-ready security scanner.
→ Pricing · Enterprise contact
---
| ID | Name | Protocols | Purpose |
|---|---|---|---|
| 001 | Ping Checker | ICMP/ARP | Reachability + TTL-based OS hints |
| 002 | SSH Scanner | TCP:22 | Banner, fingerprinting, timeout policy |
| 003 | Port Scanner | TCP/UDP | Bulk open port detection (populates context for downstream plugins) |
| 004 | FTP Banner Check | TCP:21 | FTP daemon detection |
| 005 | Host Up Check | TCP/UDP | Quick multi-probe reachability confirmation |
| 006 | HTTP Probe | TCP:80/443 | Headers, ser, hints |
| 007 | SNMP Scanner | UDP:161 | sysDescr, OIDs, serial/hardware/firmware extraction |
| 008 | Result Concluder | Meta | Fuses all plugin outputs (always runs last) |
| 009 | DNS Scanner | TCP/UDP:53 | .bind CHAOS/TXT + A record lookup |
| 010 | Webapp Detector | HTTP | Technology stack fingerprinting |
| 011 | TLS Scanner | TCP:443+ | TLS + cipher enumeration per port |
| 012 | OpenSearch Scanner | HTTP:9200+ | OpenSearch/Dashboards + Linux/Node.js hints |
| 013 | OS Detector | Meta | Deri/OS from all prior banners with TTL fallback |
| 014 | NetBIOS Scanner | UDP:137/TCP:445 | NetBIOS/SMB enumeration + SMB2 null session probe |
| 015 | SUN RPC Scanner | TCP/UDP:111 | RPC portmapper service discovery (NFS, mountd) |
| 016 | WS-Discovery | UDP:3702 | Multicast device discovery with XML metadata |
| 024 | TCP SYN Scanner | TCP (Nmap) | SYN half-open scan via Nmap wrapper (optional) |
| 040 | TLS Certificate & Cipher Auditor | TCP:443+ | Cert expiry, chain integrity, hostname mismatch, weak ciphers, deprecated protocols, key strength |
| 050 | TRIBE v2 Neural API Security Probe | TCP/HTTP:8080 | Debug leak detection, stack traces in errors, header security, CORS misconfiguration, unauthenticated routes |
| 060 | DNS Security Auditor | DNS/UDP:53 | SPF/DKIM/DMARC, dangling CNAMEs, DNSSEC, NS delegation, zone transfer exposure, MX security, CAA records |
| 070 | MCP Scanner | TCP/HTTP+SSE | Detects MCP (Model Context Protocol) servers on candidate ports (1967, 3000, 3005, 5173, 6274, 6277, 8000, 8090). Audits for cleartext transport (HTTP not HTTPS), missing/anonymous auth, anonymous tool enumeration, deprecated protocol , and Inspector exposure on non-loopback. Maps findings to CWE/OWASP/MITRE per the FindingSchema. STDIO-transport MCP servers are out of scope (no network port). |
| Name | Purpose |
|---|---|
| ARP Scanner | MAC resolution + OUI lookup + OS hints |
| mDNS/Bonjour Scanner | Local service discovery + friendly names from TXT records |
| UPnP/SSDP Scanner | Device discovery + description XML parsing |
| DNS-SD Scanner | DNS Service Discovery announcements |
| LLMNR Scanner | Link-local multicast name resolution |
| DB Scanner | Database service detection (MySQL, PostgreSQL, Redis, etc.) |
Enterprise adds 29 cloud and posture auditors on top of the Community scanners — AWS, Azure and GCP, mapped to eight compliance frameworks. They require /nsauditor-ai-ee and an Enterprise licence; a Pro licence does not unlock them.
→ Pro / Enterprise plugin catalog — every plugin with its id, what it audits, and the AWS region-scoping rules for the regional auditors (--aws-region <one|csv|all>).
See Pro & Enterprise Acti to install a licence.
*Enterprise feature. Requires /nsauditor-ai-ee.*
Every compliance scan already produces a GRC-ready JSON e artifact. The GRC connectors take the next step: they map each NSAuditor compliance finding to your GRC platform's own e/test records and push them at scan time — so your Vanta, Drata, or Secureframe workspace reflects the latest cloud posture without a manual export/import round-trip.
Opt-in, and Zero-Data-Exfiltration by default. The push is off unless you set the en below. When it runs, finding text and target identifiers go to your platform as written unless you set COMPLIANCE_GRC_REDACTION to hash or remove (redaction is off by default); the persisted audit log stores a body fingerprint (never the raw payload), and your API token is ne to any artifact. Nothing leaves your infrastructure that you didn't opt into.
| Platform | Status | Model |
|---|---|---|
| Vanta | Connector + scan-time acti shipped | Maps findings to Vanta test results; suppression-aware outcome mapping (pass / fail / passed-with-compensating-control), framework-dimensioned idempotency keys, retry with rate-limit backoff, circuit breaker |
| Drata | Connector library shipped | Pushes structured records Custom Connections; your Drata Test Builder rules (Ad/Enterprise plans) e them — the connector delivers e, your rules do the e |
| Secureframe | Connector library shipped (early-access) | Pushes structured records to a workspace e collection; your Secureframe rules e them — the connector carries the control status , it does not compute pass/fail. API shape published-assumed; li deferred (partner intake) |
Reliability + audit-integrity built in: idempotent retries (a network-timed-out push won't create duplicate records), per-attempt + total-duration timeout caps, a consecuti circuit breaker, token redaction across every log and error path, and a durable per-control push audit log written next to your scan artifacts.
> Honest status. The Vanta, Drata, and Secureframe connectors are shipped, opt-in, and covered by an extensive test suite. Li against production Vanta / Drata / Secureframe tenants is in progress as partner onboarding proceeds — until it completes, treat production use as early-access and against your own tenant first. This is a single-workspace, operator-configured connector; it is not a multi-tenant managed sync. (Secureframe's API shape is published-assumed pending partner intake; its idempotency keys are SENT but dedup is un.)
---
The Result Concluder (plugin 008) merges all plugin outputs into a normalized structure:
1. Imports each plugin's conclude() adapter to get normalized Ser objects
2. Merges services by (protocol, port), preferring authoritati
3. Selects OS — OS Detector result first, then high-signal hints (Windows services, HTTP tokens), finally TTL fallback
4. Produces a unified { summary, host, services, e } output
5. Enriches host details with names from mDNS, UPnP, NetBIOS; MAC + from ARP
---
NSAuditor AI supports three AI pro for analysis. All pro work in all tiers — CE, Pro, and Enterprise. AI is optional; the platform is fully functional without it.
Pro: OpenAI (GPT-4o), Anthropic Claude (Sonnet/Opus), Ollama (fully local)
What changes by tier is the prompt content, not the provider:
utils/attack_map.mjs: ser CVE→technique mapping (mapC, mapSer), plus a CWE→technique fallback (cweToMitre, cwesToMitre) co ~30 common CWEs (auth, crypto, injection, memory safety, info disclosure, pri escalation, web). The CWE fallback fires only when C mapping returns no techniques — useful for findings annotated with e.cwe[] (per FindingSchema v0.1.13+) but no C, such as agent-detected misconfigurations and compliance-flagged weaknessesRedaction: On by default (OPENAI_REDACT=false turns it off), the redaction pipeline masks IP addresses, MAC addresses, serial numbers, and configurable confidential keywords before the payload reaches an AI API. Admin RAW reports retain full detail for internal review.
For fully local AI (no external API calls), use Ollama:
---
Watch mode enables periodic rescanning with delta detection and webhook alerts:
scan_history.jsonl and printed as a [ScanHistory] line: new, removed and changed services, and the findings delta=== Delta Report === shows no change for any host. The gate opens only when a cycle scanned a different set of hosts from the cycle before (in practice, one cut short by stopping the loop); an alert is then posted for each host whose services carry a flag at or above --alert-se (at info, every service counts). Read changes from the [ScanHistory] lines.sendWebhook(). NSA_ALLOW_ALL_HOSTS=1 lifts the scan-entry guard for local network auditing — on the CLI the whole guard, loopback and metadata included; over MCP, the check of what a host name resolves to — and never the webhook guardscan_history.jsonl in the output directory (--out, default out/; 7-day retention in CE)---
Configuration is entirely en — a .env file, --env <file>, or the shell. No config is required for a default scan.
→ Configuration reference — every en , its default and its effect.
The two that change behaviour most: NSAUDITOR_OFFLINE_ONLY=1 forbids outbound C and reads a local N instead (reporting an explicit co gap in the scan rather than a silent clean; in Enterprise 1.2.0 that gap reaches no compliance control, so a control only the missing CVE rows would fail can read PASS), and OPENAI_API_KEY / ANTHROPIC_API_KEY / a local Ollama endpoint enable the opt-in AI analysis pass.
NSAuditor AI uses a plug-and-play plugin system. Plugins are auto-discovered from ./plugins/ — no registration needed.
probe_info and response_banner concise — full detail goes in eauthoritati to take precedence o plugins for the same portNSAUDITOR_PLUGIN_PATH---
Run the full suite:
Run a specific suite:
Tests use Node.js built-in --test runner with the assert module — no external test framework. Each test is self-contained with inline fixtures and lightweight network stubs.
---
| Issue | Solution |
|---|---|
| No DNS banner | Provider may block CHAOS/TXT (.bind) or UDP/53 |
| OpenSearch o TLS | Set OPENSEARCH_SCANNER_INSECURE_TLS=true |
| TLS shows "closed" | Service may require SNI — set TLS_SCANNER_SNI=hostname |
| RPC not detected | Ensure port 111 is accessible and RPC portmapper is running |
| WS-Discovery timeout | Check network config and firewall for multicast on UDP 3702 |
| SYN scan requires root | Run with sudo or use TCP connect scanner (plugin 003) instead |
| Webhook URL rejected | Private/loopback/cloud metadata blocked by SSRF guard. NSA_ALLOW_ALL_HOSTS does not lift this guard: use a public webhook URL |
| EE plugins not loading | /nsauditor-ai-ee is installed and license key is set |
---
We welcome contributions! See CONTRIBUTING.md for guidelines.
Quick :
1. Fork the repo and create a feature branch
2. Add a Signed-off-by line to your commits (git commit -s)
3. Include tests for any new or changed behavior
4. Submit a PR
All contributions to this repository are under the MIT license. For Enterprise Edition contributions, see the nsauditor-ai-ee repository which requires a signed IP Assignment Agreement.
What we won't accept: Code that phones home, transmits scan data externally, or weakens the Zero Data Exfiltration boundary.
Check ./plugins/ first. If a plugin doesn't exist:
Commonly requested plugins: RDP, VNC, SMTP/POP3/IMAP, MySQL/PostgreSQL/MSSQL/MongoDB/Redis, LDAP, RabbitMQ/Kafka/MQTT, SIP, NTP, Modbus/S7/DNP3/BACnet, WordPress/Jenkins/GitLab detectors.
---
For the full technical architecture, see ARCHITECTURE.md.
Tech stack: Node.js 20+ · ES Modules (.mjs) · OpenAI + Anthropic SDKs · Node.js built-in test runner · MCP stdio transport
Design patterns: Factory (PluginManager.create) · Strategy (orchestrated/legacy execution) · Context (shared state) · Adapter (plugin conclude()) · Guard Clause (requirement gating) · Capability gating (CE/Pro/EE) · Semaphore (concurrency control) · Delta (scan history diff) · Boundary Guard (SSRF/injection protection) · Finding Queue (structured intermediate format) · Parallel Agents (concurrent specialized analysis)
---
NSAuditor AI is built on a Zero Data Exfiltration (ZDE) architecture:
OPENAI_REDACT=false turns it off).NSAUDITOR_OFFLINE_ONLY=1, which emits an explicit co gap in the scan rather than a silent clean when the store cannot answer (in Enterprise 1.2.0 that gap reaches no compliance control, so a control only the missing CVE rows would fail can read PASS). Stated precisely because it matters operationally: a default scan still attempts N unless that is set. The other outbound paths — AI enrichment, the GRC push, the continuous-monitoring webhook, the opt-in RFC 3161 timestamping path (NSAUDITOR_TSA_URL, no default ever), and the AWS KMS signing path that ships but is not yet wired — are opt-in and off by default; the paths that are *not* optional are the scan target itself, your own cloud provider's APIs during a cloud scan, and DNS resolution of the target. All of them are enumerated with their trigger and default state in the egress register (EE docs/architecture.md §14.1.1), which is generated from code and guarded in both directions — deliberately, so this sentence ne has to carry a completeness claim that prose alone cannot keep true. Populating the local N is the operator's; no feed data is delivered with the product. The prior absolute form of this bullet — *"Fully air-gappable. Every feature works without internet access (Enterprise includes offline N)"* — is WITHDRAWN (CE 0.2.33): quoted here so the withdrawal record stays on this page now that release history lives in the CHANGELOG.Nsasoft US LLC is not a data processor, data controller, or business associate under any data protection regulation. You own and control all data produced by NSAuditor AI.
---
MIT — see LICENSE for the full text.
© 2024-present Nsasoft US LLC. "NSAuditor" and "NSAuditor AI" are trademarks of Nsasoft US LLC.
The Pro and Enterprise features a via /nsauditor-ai-ee are licensed under a separate proprietary license. See www.nsauditor.com/ai/pricing for details.
开发语言:JavaScript
Star 数:20
该项目属于安全软件方向的开源资源,代码结构清晰,适合安全研究人员学习参考。项目围绕NSAuditor AI — Open-source, AI-powered network security scanner. 27 plugins, CVE matching, MITRE ATT&CK mapping, verified vulnerabilities, continuous monitoring, MCP integration. Zero data exfiltration. MIT licensed.展开,提供了可运行的实现,对理解相关安全机制、工具原理与攻防技术具有较高的研究价值。
从技术实现角度看,此类项目的核心在于对底层原理的深入理解与工程化落地。开发者在研究过程中可以结合官方文档与社区讨论,梳理项目的初始化流程、核心模块职责与数据流转,逐步掌握其中的技术细节与设计思路。
1. 下载源码压缩包,解压到本地环境。
2. 根据项目类型准备对应的运行环境与依赖。
3. 按照 README 中的步骤完成配置与部署。
4. 在隔离的测试环境中运行验证,避免影响生产系统。
本资源来源于开源社区,仅供安全研究、技术学习与合法授权范围内的攻防演练使用,请勿用于任何非法或侵害他人权益的用途。使用本项目产生的一切后果由使用者自行承担。
| 资源标题 | nsauditor-ai - NSAuditor AI — Open-source, AI-powered network sec |
| 所属分类 | 安全软件 |
| 发布作者 | admin |
| 发布时间 | 2026-10-05 22:54:23 |
| 下载权限 | 免费下载 |
| 附件数量 | 2 个下载链接 |
| 浏览次数 | 138 |
| 讨论数量 | 0 |
| 主题状态 | 正常讨论中 |