Why Nmap and Open-Source Scanners Don't Detect Vulnerabilities Reliably: A Sourced Analysis
A research breakdown: why nmap and the open-source stack behind most 'AI pentest' products miss vulnerabilities and false-positive, in both VM and web/API pentest categories - with GitHub issue links, independent benchmark numbers, and concrete reasons compliance reporting shouldn't be built on raw scanner output. Closes with how Pentesterra's own detection architecture addresses each gap.
Every few weeks another "AI pentest platform" shows up. Strip away the chat
interface and it's almost always the same handful of open-source tools
glued together with an LLM: nmap for network recon, Nikto or OWASP ZAP for the web server, sqlmap for injection, Nuclei for CVE
templates, gobuster/ffuf for content discovery. Some go further and
generate a "compliance report" straight off that output.
This is a sourced breakdown of why that doesn't work, in four parts: why these tools miss vulnerabilities and false-positive on the network side, why their output is its own separate problem, why the same pattern repeats on the web/API side, and why none of it should ever feed a compliance report directly. Every claim has a link. I'd rather you check them than take my word for it.
I like every tool named below. I've used all of them for years. Each is genuinely good at the narrow thing it was built for. None of them, alone or chained together with a prompt, adds up to a vulnerability management platform.

Part 1: Why nmap and open-source VM tools miss vulnerabilities and false-positive
Seven concrete, sourced reasons. Each one alone is a real gap; a wrapper that inherits all seven at once is not a vulnerability scanner, it's a port scanner with opinions.
Reason 1: The detection surface is a rounding error against the CVE database
vuln NSE category, out of ~600 NSE scripts total
nmap.org/nsedoc/categories/vuln.html
Fifty-five native detection scripts against a database north of 300,000 CVEs, growing by tens of thousands a year, is a different order of magnitude from a coverage gap. No amount of prompt engineering changes the ratio - the LLM never sees a CVE that nmap never checked for.
Reason 2: "CVE found" mostly means "banner string matched" - and that breaks on every backported patch
The way most wrappers claim network vulnerability detection is
nmap-vulners or vulscan: grab the service banner, extract a version
string, match it against a CVE feed. That's not exploitation and it isn't
verification - it's string matching, and it fails in one very specific,
very well-documented way: distributions backport security fixes without
changing the version string. A patched Debian OpenSSH 7.4 can look, on
paper, identical to a vulnerable one.
| Target reported on | What the script flagged | Why it's wrong | Source |
|---|---|---|---|
| Microsoft IIS 10.0 | CVEs from older IIS releases | Version-string match, no patch-level awareness | nmap-vulners #39 |
| OpenSSH (distro builds) | Full CVE list for the upstream base version | Distro backports the fix; banner version stays the same | nmap-vulners #44 |
| Apache httpd 2.4.6 (RHEL/CentOS) | CVEs fixed upstream by 2.4.39 | RedHat backports fixes without bumping the version string | nmap-vulners #18 |
| Generic CVE matching (any target) | Reporter flags the script "doesn't consider patches" | Acknowledged structural limitation | nmap/nmap #2619 |
TLS via ssl-ccs-injection.nse |
Flags issues neither Metasploit nor Tripwire confirm | Detection logic disagrees with dedicated tools | nmap/nmap #1322 |
The peer-reviewed number behind this: Pittman's 2023 comparative study of port scanning tools (arXiv:2303.11282) measured nmap against a Windows host behind an active firewall at 11 true positives, 12 false positives, 17 false negatives. Without the firewall: 38 true positives, 0 false positives, 2 false negatives. Same tool, same target - accuracy swings entirely on what sits between the scanner and the host, and an AI layer reading the output afterward has no way to know which regime it's looking at.
Reason 3: Hosts that don't answer a ping get skipped entirely, silently
Nmap's default host discovery pings first - ICMP echo, ARP, a TCP probe to
common ports (nmap.org/book/host-discovery-techniques).
A large share of production hosts drop ICMP by default. If every discovery
probe gets dropped, nmap marks the host "down" and never scans a single
port on it - not "scanned, found nothing," never scanned. The fix,
-Pn, requires knowing the gap exists. A wrapper on default flags doesn't,
so hosts silently vanish from the report with no error, just a shorter list.
Reason 4: "Filtered" gets treated as "closed," and that loses real coverage
Nmap's actual port states are open, closed, filtered, and unfiltered (nmap.org/book/man-port-scanning-basics). Filtered means a firewall dropped the probes and nmap genuinely doesn't know what's behind it. A tool that conflates filtered with closed produces a false "nothing here" on a port that may well be open behind a firewall - or burns time and noise trying to force an answer a plain SYN scan won't get.
Reason 5: No evasion strategy means the first real target blocks the scan outright
Nmap ships fragmentation, decoys, timing templates and source-port tricks (nmap.org/book/man-bypass-firewalls-ids), but they only work as a deliberate, target-specific combination, and modern IDS/IPS and WAFs catch most of the classic tricks regardless. A wrapper firing the same default scan against everything gets fingerprinted and dropped by the first competent rate-limiter it meets. At that point the "AI pentest" isn't testing anything - it's generating log noise for the blue team.
Reason 6: The scan itself can cause real damage
- Printers physically misbehave. An open nmap issue documents
-A(aggressive scan) causing printers to print garbage pages of binary output - nmap/nmap #2237. - Legacy and OT devices crash under ordinary scan load - PLCs and HMIs have been documented entering a fail-safe or crashed state from ordinary port scanning, let alone active probing (arXiv:2007.08885).
- Reaching for raw speed makes it worse.
masscanis explicitly built to scan the full IPv4 address space in under five minutes on a 10Gbit link (rushter.com/blog/how-masscan-works). No discovery, no rate awareness, and the failure mode isn't "one device locks up" - it's a self-inflicted SYN-flood pattern across the network.
Reason 7: At scan volume, aggressive timing looks exactly like an attack, because functionally it is one
Aggressive timing templates against a broad range don't just risk crashing one fragile device - they generate the exact burst pattern a DDoS/IDS trigger is built to catch. That's an unannounced denial-of-service test the client never authorized, not recon. An AI layer sitting on top of any of this does not know your /23 contains a decade-old building-management controller. It calls the tool with whatever flags it decided sounded right.
Part 2: Processing nmap's own output is its own separate minefield
Detection accuracy is one problem. Getting a reliable, parseable result out of nmap afterward is a completely separate one, and it's just as poorly understood.
- Most script output was never structured to begin with. NSE gained
the option to return structured XML output in 2014. At the point that
feature shipped, only 47 of the 484 scripts that existed at the time
actually used it (seclists.org/nmap-dev/2014/q3/423).
A decade later most community and custom scripts still dump a free-text
blob, whether you're reading the console,
-oN, or-oX. XML wraps that blob in a tag; it doesn't structure it. - The three output formats genuinely diverge, not just in style.
-oN(normal),-oX(XML) and-oG(grepable) are separate code paths with separate field coverage; grepable output is explicitly documented as the format that breaks when nmap's internals change, while XML is the only one meant to be resilient to that (nmap.org/book/output). Building automation against the wrong one is a common, silent source of missing fields. - XML output can be flat-out invalid if the scan doesn't finish cleanly. This is not an edge case - it's an open, recurring pattern on nmap's own tracker: a killed or interrupted scan leaves an XML file with no closing tag, unparseable by a standard XML parser (nmap/nmap #1917, #243, #2217, #2657). A host that hits its timeout gets its partial results silently discarded - no port table, no version data, nothing recorded for that host at all.
- Some scripts crash the whole run with no error message. Certain NSE
scripts (
ssl-cert.nseamong them) have been reported to kill the nmap process silently mid-scan, leaving a truncated, broken XML file behind with no indication anything went wrong (nmap/nmap #1955).
Put together: a wrapper has to correctly choose the output format, handle the fact that most of what's in it is unstructured text anyway, and defend against the file itself being invalid because the scan didn't end cleanly
- before an LLM ever gets a chance to "analyze" anything. Most of these products do none of that; they call nmap, read stdout, and hope.
Part 3: The same pattern, on the web/API side
Network scanning isn't a special case - the exact same failure shape repeats across the open-source tools these products glue together for web and API pentest.
| Tool | What it actually does | Documented result | Structural blind spot |
|---|---|---|---|
| Nikto | Signature/pattern match against known server issues | Cannot log in, crawl JS/SPA, submit forms, or test business logic (appsecsanta.com/nikto); frequent false positives on custom 404s and CDN-fronted sites | Zero application-layer testing |
| sqlmap | Payload-based blind/error/time-based SQLi detection | Tracker issues: "false positive or unexploitable injection point" (#5394, #2075, #1015); documented case where no available tamper script got past a WAF (vaadata.com) | Needs a hand-tuned injection point and WAF bypass to work at all |
| Nuclei | YAML templates matching known CVEs/misconfigs | False positives from weak matchers (#3896); false negatives even on a templated, named CVE (#13540); port-coverage gaps (#11634) | Only detects what someone already wrote a template for |
| gobuster / ffuf / dirb | Wordlist-based brute force of paths | Structurally bounded by wordlist quality, by design | Cannot find custom-named business-logic endpoints |
| OWASP ZAP | Automated active + passive DAST scan | Independent benchmark: 0% detection on critical vulnerabilities, 29% overall coverage, 15% false-positive rate (aimultiple.com/dast-tools); false-positive management an acknowledged open issue (#5212) | Weak on business logic; heavy manual tuning needed to cut noise |
| w3af | Automated active DAST scan | Limited maintenance since 2020 (appsecsanta.com/w3af) | Frozen coverage against a moving OWASP Top 10 |
Three things make this worse specifically for API pentest, which is where most modern attack surface actually lives:
- None of these tools understand an API contract. They don't parse an OpenAPI/Swagger spec, so they can't enumerate parameters, required auth scopes, or expected object ownership on their own - they need that handed to them, correctly, by whatever's driving them.
- The #1 API vulnerability class has the same "no CVE" problem as broken access control on the web. Broken Object Level Authorization (BOLA) is the #1 risk in the OWASP API Security Top 10 and is present in around 40% of all API attacks (OWASP API1:2023). It's an authorization logic bug tied to your object IDs, not a known CVE in known software - no signature-matching tool can see it. T-Mobile lost 37 million customer records to exactly this class of bug.
- Stateful, multi-step flows are outside what any of these tools do. OAuth token flows, JWT algorithm-confusion attacks, multi-step checkout or account-recovery logic - all of it requires maintaining session state across a sequence of authenticated requests and reasoning about what should be allowed next, which is a different problem than "does this response match a known-bad pattern."
Underneath all of this is the same finding from a 2022 empirical study comparing detection techniques on a real application (Elder et al., arXiv:2208.01595): automated SAST found the most vulnerabilities by volume, manual exploratory testing found the most severe ones, and each technique discovered unique vulnerabilities the others missed entirely. No single automated tool - and by extension, no small chain of them glued together with a prompt - covers the space on its own.
Part 4: Why building a compliance report on nmap/open-source scan output is a bad idea
This is where the false positives and blind spots above stop being an inconvenience and start being a liability.
- The major frameworks explicitly distinguish "vulnerability scan" from "penetration test," and a raw nmap run satisfies neither properly. PCI DSS Requirement 11.3 requires penetration testing methodology (PTES/NIST SP 800-115/OWASP-aligned) separate from and in addition to automated vulnerability scanning - reconnaissance, exploitation, post-exploitation, and reporting of chained, business-impact findings that automated scanners are not built to find (Praetorian, SecurityMetrics). A scan output is not a pentest report just because someone labeled it one.
- NIST SP 800-115 requires validating scanner output before it's reported - discovery and validation are deliberately separate steps. Raw findings need knowledgeable interpretation before publication precisely because scanners produce false positives and false negatives (csrc.nist.gov/pubs/sp/800/115). Piping scanner output straight into a client- or auditor-facing report skips the one step the standard treats as mandatory.
- Unverified false positives at this rate make a compliance report actively misleading, not just noisy. Independent analysis puts false positive rates at 50-80% across security tools broadly, with 43% of security professionals in one survey reporting roughly 40% of their daily alerts were false positives (Anchore, Orca Security 2022 Cloud Security Alert Fatigue Report). A risk register built directly from that output overstates real risk, wastes remediation budget on already-patched backported CVEs (see Reason 2), and is exactly the kind of thing that damages credibility when an actual auditor re-tests a "finding" and discovers it was already fixed.
- A clean scan is not evidence of a compliant control - it can just mean the tool structurally couldn't check that control. Broken access control and business-logic flaws (Part 3) have no CVE and no signature by definition. If a compliance report's evidence chain is "we ran nmap/Nikto/ZAP and found nothing," that is not proof the access-control or authorization requirements of a framework are met - it's proof the tool never had a mechanism to test them in the first place. Reporting the absence of a flagged CVE as the absence of risk is exactly backwards.
- A one-off scan has no audit trail, and auditors are assessing a process, not a single artifact. A raw scan dump has no record of what was triaged, what was verified, what was accepted as risk, or what was remediated and re-tested. Frameworks that require ongoing risk management expect evidence of that lifecycle, not a timestamped tool output.
None of this means scanning is useless for compliance work - it's a necessary input. It means the scan output has to go through verification, scoping against the framework's actual control requirements, and an audit-tracked triage process before it can honestly support a compliance claim. That pipeline is the product, not the scan.
Where this leaves the whole category
Every tool audited above is genuinely good at the narrow thing it does. None of them, on their own or wrapped in AI, is a vulnerability management platform, and none were designed to be one - signature matching and unstructured output are architectural choices in each of them, not bugs to patch. Writing more NSE scripts, more Nuclei templates, or more sqlmap tamper files doesn't change that; it's detection engineering, and it takes real engineering time against real infrastructure, not a weekend spent gluing an LLM to a handful of CLI tools.
What we built instead
This is the direct answer to Parts 1-4, and it's the reason Pentesterra took five years to build against real client infrastructure rather than a few weekends against a lab VM.
Detection doesn't run through one script per check. Network VA and web/API pentest each run through dedicated engines with overlapping, purpose-built checks layered around any open-source baseline - a lead from one detection path is treated as exactly that, a lead, not a finding, until something else confirms it.
How that answers Parts 1-4, category by category
Network / VM detection:
- Findings are cross-validated across multiple independent detection paths before they're reported, instead of trusting one script's banner match (the single biggest source of false positives in Part 1, Reason 2).
- Version findings are reconciled against distro patch/package metadata,
not just the raw banner string - the specific mechanism that catches
what
nmap-vulners-style tooling flags as a false positive on every backported Debian/RHEL/Ubuntu fix. - Host discovery runs multiple independent probes and confirms a host's real status before excluding it, instead of silently dropping anything that doesn't answer ICMP (Reason 3) - a host doesn't disappear from a report just because it declined to ping back.
- A filtered port result triggers a dedicated secondary pass rather than being written off as closed (Reason 4).
- Evasion posture - timing, fragmentation, decoy strategy - is selected per target based on the defenses actually detected there, not fired identically at every target regardless of what's in front of it (Reason 5).
- Scanning is distributed and load-aware rather than raw-speed, keeping scan impact on the target bounded instead of risking the DoS-shaped traffic pattern in Reasons 6-7.
Web / API pentest:
- 57+ dedicated modules (SQLi, XSS, NoSQLi, SSRF, IDOR, JWT, SSTI, request smuggling, race conditions, GraphQL, OAuth, and more), each with its own detection logic - not one generic script or template trying to cover all of them at once.
- Endpoint discovery combines crawling, JS bundle analysis, and spec ingestion (OpenAPI/Swagger where the target exposes one), instead of being bounded to whatever's in a static wordlist - the direct answer to the gobuster/ffuf/dirb gap in Part 3.
- Testing runs authenticated and stateful: session context carries across multi-step flows (login, token refresh, multi-step checkout, account recovery) so authorization and business logic actually get exercised, not just single unauthenticated requests against isolated endpoints.
- Access control and object-ownership are tested as their own explicit module - not inferred from a signature match - because BOLA/IDOR is the #1 real-world API risk category and structurally has no CVE to match against (Part 3).
Keeping up with new attack techniques:
- The knowledge-base pipeline below runs continuously, not as a one-time training snapshot: new CVE disclosures, KEV additions, and published bypass techniques get ingested on an ongoing basis and turned into a verified detection module - not a copy-pasted community template.
- Every new detection script has to earn an
is_verifiedflag against real target behavior before a scan is allowed to trust it, so a newly added technique has to prove it actually works before it's relied on in production - the same discipline Part 2 and Part 4 argue raw open-source tool output skips entirely.
The knowledge base is a maintained system with a real trust order, not a folder of scripts:
| Priority | Source | Why it's ranked there |
|---|---|---|
| 1 | CISA KEV | Confirmed exploited in the wild - highest-confidence signal available |
| 2 | Metasploit (verified modules) | Community-vetted, tested against real targets |
| 3 | Exploit-DB | Public PoCs, lower baseline confidence than KEV/MSF |
| 4 | Custom scripts | Written and verified in-house against real targets |
| 5 | GitHub PoCs | Lowest-confidence tier, requires the most scrutiny before trust |
Every script is deduplicated by SHA-256 hash, versioned, tied to an
is_verified flag, and logged in an audit trail before a scan trusts it.
The research base behind exploitation logic runs over 1,300 real-world
cases sourced from HackerOne disclosures and nuclei templates, continuously
enriched.
This is the direct structural answer to Part 4's audit-trail problem. Every finding carries a machine status that only moves forward through a fixed lifecycle, and it never silently downgrades:

Automatic verification runs first; an analyst can still mark something a false positive, an accepted risk, or send it back for review, with an approval workflow behind that decision. A raw version-string match doesn't get to call itself a finding - it has to survive an actual verification step before it reaches a report, compliance or otherwise.
Distributed across nodes, load-aware, not one process on one box. Before a task is assigned, the system checks each node's real load - CPU, memory, active task count - instead of a fixed split. Web pentest modules are distributed with weighted bin-packing; large network ranges get chunked and distributed the same way, with automatic local fallback if a node stalls. That's also why we don't need raw-speed tools built for scanning entire address ranges in minutes (Part 1, Reason 6) - the work is already parallelized across nodes with resource limits respected per node.
None of that was designed on a whiteboard in one pass. It was built, broken, and rebuilt over five years against real client environments - the kind where a backported Debian patch, a decade-old building-management controller on the same subnet, and a WAF that blocks the first request all show up in the same engagement, sometimes the same day. That's the actual difference between a script that reports a version match and a platform that reports a verified finding.
Sources cited above:
- nmap.org/nsedoc/categories/vuln.html - NSE
vulncategory script count - tenable.com/products/nessus - Nessus plugin count
- sqmagazine.co.uk/cve-statistics - cumulative CVE counts, 2026 forecast
- nmap-vulners #39, #44, #18 - backported-patch false positives
- nmap/nmap #2619, #1322, #2237 - core issue tracker
- Pittman, arXiv:2303.11282 - comparative port-scanner accuracy study
- seclists.org/nmap-dev/2014/q3/423 - NSE structured-output adoption
- nmap/nmap #1917, #243, #2217, #2657, #1955 - incomplete/invalid XML output, silent crashes
- nmap.org/book/output.html - output format reference
- arXiv:2007.08885 - industrial device behavior under scan/DoS conditions
- rushter.com/blog/how-masscan-works - masscan design and speed
- nmap.org/book - host discovery, port states, IDS/firewall evasion reference
- appsecsanta.com/nikto, appsecsanta.com/w3af - tool capability/limitation reviews
- sqlmap #5394, #2075, #1015 - false-positive/unexploitable injection reports
- vaadata.com WAF bypass writeup - sqlmap tamper scripts failing in practice
- nuclei-templates #3896, #13540, #11634 - false positives/negatives, coverage gaps
- aimultiple.com/dast-tools - independent DAST tool benchmark (ZAP detection/FP rates)
- zaproxy/zaproxy #5212 - ZAP false-positive management
- OWASP Top 10:2021, A01 Broken Access Control - web category prevalence data
- OWASP API1:2023, Broken Object Level Authorization - API category prevalence data (~40% of API attacks)
- Optus breach writeup, Peloton writeup - access-control breaches with no CVE
- Elder et al., arXiv:2208.01595 - empirical comparison of detection techniques, unique-vulnerability-per-method finding
- Praetorian, SecurityMetrics - PCI DSS 11.3 scan-vs-pentest distinction
- NIST SP 800-115 - scan validation requirement
- Anchore, Orca Security report via Praetorian - false-positive rate data
https://pentesterra.com/blog/nmap-is-not-a-vulnerability-scanner