This is a floor plan left in the lobby, not the master key
Tenable plugin 57640 is a generic web-app finding, not a product-specific CVE. It fires when a malformed HTTP request makes the application return physical filesystem paths or similar internal error details in the response, such as Windows paths like C:\inetpub\... or Linux paths like /var/www/.... There is no clean version range because the issue is endpoint- and configuration-specific: any web application or framework can be affected if verbose errors, stack traces, or debug responses are exposed to unauthenticated users.
The vendor's MEDIUM label is understandable if you score the leak in isolation, but at enterprise patch-priority scale it is usually too high. This bug normally provides reconnaissance value only: it helps attackers tune a later LFI, path traversal, file disclosure, or framework-specific exploit, but it rarely changes the game on its own. For a 10,000-host estate, this belongs in hardening/backlog hygiene, not emergency patch motion, unless the leaking app is internet-facing and already has a second exploitable flaw.
4 steps from start to impact.
Trigger an exception with curl or Burp
curl, Burp Suite Intruder, or OWASP ZAP. The goal is not code execution; it is to push the app into an unhandled error path so the response reveals internal details.- Unauthenticated network reachability to the web application
- An endpoint that mishandles malformed input
- Verbose error handling or debug output exposed to the client
- Modern frameworks often suppress stack traces in production
- Custom error pages and reverse proxies frequently mask backend errors
- Some apps only leak on obscure endpoints or edge-case parameters
Extract path and framework clues with grep
grep, Burp match rules, or ZAP alerts to identify whether the app runs on IIS/.NET, Apache/PHP, Tomcat/Java, Node, or another stack.- The server returns the raw error body to the client
- The response includes absolute paths or stack traces
- Many leaks are partial and reveal only one path fragment
- Containerized apps may expose paths that are less useful outside the container context
- Path disclosure alone does not prove file-read, auth bypass, or RCE
57640 is the equivalent family-level signal.Use the leak to tune a second exploit
- A second vulnerability or weakness exists in the same app or backend
- The disclosed path materially helps craft that exploit
- This step assumes a follow-on flaw; without one, the chain stops here
- WAFs, input validation, and framework defaults often kill the second-stage bug
- The value of the leaked path varies widely by stack and app design
Reach localized impact, not automatic estate-wide compromise
- The chained vulnerability is real and reachable
- The compromised app has sensitive data or pivot value
- No direct privilege boundary is crossed by this leak alone
- Impact remains narrow unless the app also has high-value secrets or a stronger paired flaw
- MFA does nothing here; this is usually an unauthenticated response-handling problem.
- Endpoint EDR on the web server is not a fix; the issue is the app voluntarily disclosing internal details in HTTP responses.
- Blindly patching the web server binary may not help; this is commonly application or framework configuration, not an Apache/IIS/Tomcat CVE.
The supporting signals.
| CVE status | None. Plugin 57640 is a generic web-application check and is not tied to a single CVE or product advisory. |
|---|---|
| In-the-wild status | No strong evidence of standalone exploitation campaigns. This pattern is commonly used during recon, but path disclosure by itself is not a known major intrusion driver. |
| Proof-of-concept availability | Trivial. No special exploit kit is needed; curl, Burp Suite, and OWASP ZAP can trigger and detect it. |
| EPSS | N/A. EPSS is CVE-based, and this Nessus plugin is not mapped to a CVE. |
| KEV status | N/A. CISA KEV tracks CVEs; this finding has no CVE, so there is no KEV entry or add date. |
| CVSS / vendor label | Tenable marks it MEDIUM, but the plugin page does not publish a product-specific CVSS vector or score for this check. |
| Affected scope | Potentially any web app that returns internal filesystem paths, stack traces, or debug error content to the client after malformed requests. |
| Fixed version | No universal patched version exists. Remediation is usually framework configuration, disabling debug output, and consistent custom error handling; distro/server backports are not relevant unless the leak comes from a specific upstream bug. |
| Scanning / exposure reality | This is not reliably internet-enumerable via Shodan/Censys banners. It usually requires active DAST-style probing against live endpoints, which is why exposure counts are sparse and environment-specific. |
| Disclosure / attribution | Tenable published plugin 57640 on 2012-01-25 and last updated it on 2021-01-19. This is a scanner heuristic, not a credited vendor-disclosed vulnerability. |
Sources.
Why this verdict
- Requires only recon value, not direct impact — the plugin describes path disclosure after malformed requests, which usually yields environment clues rather than immediate file read, auth bypass, or code execution.
- Follow-on bug required — to become materially dangerous, the attacker typically needs LFI, traversal, source disclosure, unsafe upload handling, or another app-specific flaw to chain with the leaked path.
- Reachable population is narrower than it looks — modern production apps often hide stack traces behind generic error pages, reverse proxies, or framework defaults, so many real deployments will not expose useful path details even when scanners hit odd endpoints.
- Modern controls should stop or blunt it — custom error pages, debug-off production configs, WAF normalization, and secure framework defaults all reduce practical exploitability.
- Blast radius is local to the application — even when real, the leak usually helps target one app more precisely; it is not an estate-wide privilege escalator.
Why not higher?
There is no evidence here of direct confidentiality loss beyond environmental metadata, and no proof of a weaponized chain attached to the finding. If you cannot show a second reachable bug that becomes easier because of the leaked path, MEDIUM or HIGH is inflation.
Why not lower?
This is not pure noise. Physical path leakage does help attackers fingerprint the stack, refine traversal depth, and target configuration files or source paths more efficiently, especially on internet-facing legacy apps. It deserves cleanup and verification, just not high-priority patch treatment.
Crowdsourced verification payload.
Run this from an auditor workstation or CI runner that can reach the target URL over HTTP/S. Invoke it as python3 check_path_disclosure.py https://app.example.com/ with no special privileges; add a full path like https://app.example.com/login if you want to test a specific endpoint.
#!/usr/bin/env python3
# check_path_disclosure.py
# Probe a web application for path / stack-trace disclosure via malformed requests.
# Exit codes:
# 0 = PATCHED
# 1 = VULNERABLE
# 2 = UNKNOWN / error
import re
import sys
import requests
from urllib.parse import urljoin
TIMEOUT = 10
HEADERS = {
'User-Agent': 'noisgate-path-disclosure-check/1.0',
'Accept': '*/*'
}
PATH_PATTERNS = [
re.compile(r'[A-Za-z]:\\\\(?:[^\\\\\r\n]+\\\\)*[^\\\\\r\n]*'), # Windows path
re.compile(r'/(?:var|srv|opt|home|usr|etc|tmp|app|www)/(?:[^\s"<>:]*)'), # Unix path
re.compile(r'inetpub\\\\wwwroot', re.I),
re.compile(r'/var/www', re.I),
re.compile(r'/usr/local/', re.I),
]
STACK_PATTERNS = [
re.compile(r'Traceback \(most recent call last\):'),
re.compile(r' at [A-Za-z0-9_$.]+\([A-Za-z0-9_$.]+:\d+\)'), # Java-ish stack trace
re.compile(r'System\.[A-Za-z0-9_.]+Exception', re.I),
re.compile(r'Fatal error:', re.I),
re.compile(r'Warning: .* on line \d+', re.I),
re.compile(r'<b>Stack trace</b>', re.I),
]
PROBES = [
('GET', ''),
('GET', "'\"<>{}..;/"),
('GET', 'nonexistent-noisgate-__trigger__-404'),
('GET', '?id=%27%22%3C%3E%7B%7D'),
]
def fetch(url, method='GET'):
try:
if method == 'GET':
r = requests.get(url, headers=HEADERS, timeout=TIMEOUT, allow_redirects=True, verify=True)
else:
r = requests.request(method, url, headers=HEADERS, timeout=TIMEOUT, allow_redirects=True, verify=True)
return r
except requests.RequestException:
return None
def analyze(body):
findings = []
for pat in PATH_PATTERNS:
m = pat.search(body)
if m:
findings.append(f'path:{m.group(0)[:160]}')
for pat in STACK_PATTERNS:
m = pat.search(body)
if m:
findings.append(f'stack:{m.group(0)[:160]}')
return findings
def main():
if len(sys.argv) != 2:
print('UNKNOWN - usage: python3 check_path_disclosure.py https://target/')
sys.exit(2)
base = sys.argv[1].strip()
if not base.startswith('http://') and not base.startswith('https://'):
print('UNKNOWN - target must start with http:// or https://')
sys.exit(2)
hits = []
tested = 0
for method, suffix in PROBES:
target = urljoin(base if base.endswith('/') else base + '/', suffix)
r = fetch(target, method=method)
if r is None:
continue
tested += 1
body = r.text[:200000]
findings = analyze(body)
if findings:
hits.append({'url': target, 'status': r.status_code, 'findings': findings[:5]})
if hits:
print('VULNERABLE')
for hit in hits:
print(f"URL={hit['url']} STATUS={hit['status']} FINDINGS={'; '.join(hit['findings'])}")
sys.exit(1)
if tested == 0:
print('UNKNOWN - no successful HTTP responses received')
sys.exit(2)
print('PATCHED')
print('No obvious path or stack-trace disclosure detected in tested responses.')
sys.exit(0)
if __name__ == '__main__':
main()