Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Network-reachable endpoint, no auth or user interaction, and a simple traversal parameter give AV:N/AC:L/PR:N/UI:N; arbitrary file read yields C:H with no integrity or availability impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
4DescriptionCVE.org
Whistle is an HTTP, HTTP2, HTTPS, and WebSocket debugging proxy. Prior to 2.10.3, lib/service/service.js handles GET /cgi-bin/temp/get by reading req.query.filename, joining it to TEMP_FILES_PATH only when it matches the temporary file pattern, and otherwise passing the user-supplied filename directly to getFile, allowing a remote attacker to read arbitrary files such as /etc/passwd. This issue is reported as fixed in version 2.10.3.
AnalysisAI
Arbitrary file read in the Whistle debugging proxy (avwo/whistle) before 2.10.3 lets remote attackers retrieve any file on the host by abusing the GET /cgi-bin/temp/get endpoint. Because lib/service/service.js only sanitizes req.query.filename when it matches the temporary-file pattern and otherwise hands the raw filename to getFile, a value like ../../../../etc/passwd escapes TEMP_FILES_PATH and is served back. The CVSS 4.0 score is 8.7 (high) with a confidentiality-only impact; there is no public exploit identified at time of analysis, and the flaw is fixed in 2.10.3.
Technical ContextAI
Whistle is a Node.js-based cross-protocol (HTTP/HTTP2/HTTPS/WebSocket) debugging proxy commonly run by developers to capture and rewrite traffic. The vulnerable logic lives in lib/service/service.js, which implements the /cgi-bin/temp/get handler for downloading Whistle's own temporary capture files stored under config.TEMP_FILES_PATH. The root cause is CWE-22 (Improper Limitation of a Pathname to a Restricted Directory / Path Traversal): the handler applies a path-safe join to TEMP_FILES_PATH only when the supplied filename matches the expected temp-file naming pattern, but falls through to passing the attacker-controlled filename directly into getFile for any non-matching value. With no canonicalization or traversal-sequence filtering on that fallback path, ../ sequences resolve outside the intended temp directory to any file the Whistle process user can read. The fixing commit (777bcf6) is a broad release change touching config.js, HTTPS/CA and WebSocket handling; the security-relevant hardening is bundled into the 2.10.3 release rather than isolated in the visible diff hunks.
RemediationAI
Vendor-released patch: 2.10.3 - upgrade Whistle to version 2.10.3 or later (for example, npm install -g whistle@latest or pin whistle@2.10.3), per advisory GHSA-3vfr-4gwf-qxfp (https://github.com/avwo/whistle/security/advisories/GHSA-3vfr-4gwf-qxfp) and release https://github.com/avwo/whistle/releases/tag/v2.10.3. If you cannot patch immediately, do not expose the Whistle service to untrusted networks: bind it to 127.0.0.1/loopback instead of 0.0.0.0 so the /cgi-bin/temp/get endpoint is unreachable remotely, and place any required remote access behind an authenticating reverse proxy or firewall rule that restricts source IPs - the trade-off is losing convenient network-wide access to the debugging UI. Additionally, run the Whistle process under a low-privilege, dedicated service account so that even a successful traversal only reads files that account can access, limiting exposure of sensitive files such as /etc/passwd, SSH keys, or application secrets; the side effect is that Whistle features needing broader filesystem access may require explicit permission grants.
Same weakness CWE-22 – Path Traversal
View allSame technique Path Traversal
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-45030
GHSA-3vfr-4gwf-qxfp