Aug 26, 2026·6 min read·4 visits
A fail-open validation logic flaw in Whistle's internal service module allows unauthenticated remote attackers to read arbitrary files from the hosting operating system via path traversal.
Whistle prior to version 2.10.3 contains a path traversal vulnerability in its internal service layer. An unauthenticated remote attacker can read arbitrary files on the hosting operating system by issuing a crafted GET request containing relative or absolute file paths to the `/cgi-bin/temp/get` endpoint. This behavior occurs because the application fails open when an input file parameter does not match the temporary file format regex.
Whistle functions as a multi-protocol web debugging proxy. It is designed to intercept, modify, and inspect HTTP, HTTPS, WebSocket, and HTTP2 traffic. It is widely used by developers to debug API responses, inject scripts, and route local files to remote environments. Because of its administrative and utility capabilities, the utility runs with the permissions of the local system user starting the process.
In versions prior to 2.10.3, a path traversal vulnerability exists in the internal service module. The endpoint /cgi-bin/temp/get within this module exposes an interface intended to fetch temporary debugging files. When an external request queries this endpoint, the application extracts the target file from the filename query parameter.
Due to a failure in validating the filename string, unauthenticated remote attackers can traverse the host directory structure. This enables unauthorized read access to critical operating system files, application source code, and configurations. The vulnerability resides under the CWE-22 weakness class.
The vulnerability originates in the fail-open implementation of the query handling logic inside lib/service/service.js. Specifically, the routing layer maps incoming GET requests for the /cgi-bin/temp/get resource directly to an internal controller. This controller parses the filename value from the query string and evaluates it against an internal helper utility.
This helper utility is common.isTempFile(filename). It validates whether the string is a temporary file name. The validation relies on a regular expression, TEMP_FILE_RE = /^\^[\\da-f]{64}$/, designed to match 64-character hexadecimal hashes representing session files. If the parameter matches this structure, the logic appends the filename to the target directory root TEMP_FILES_PATH via path.join().
However, the critical security flaw lies in the handling of strings that do not match the regular expression. Instead of returning an error or halting execution when common.isTempFile returns false, the controller bypasses the path.join block entirely. It then proceeds to invoke the file retrieval utility getFile(filename, callback) with the raw, unvalidated string provided by the user. Because Node's underlying filesystem operations resolve relative and absolute paths directly, an attacker can specify any path on the disk, and the engine will fetch the file contents.
The remediation of CVE-2026-55629 required three distinct adjustments to ensure security. First, the export of the core service module was deactivated in the main entry point file lib/index.js. By omitting loadService from the public interface, the application prevents unauthorized or unintended registrations of internal service components.
Second, the maintainers integrated an authorization check into the routing middleware of lib/service/service.js. Every request directed to the session routing layer must now supply a unique identifier header named _x-whistle-uid_. If the request's header value does not match the active server configuration token config.uid, the controller terminates the request with a 403 Forbidden response.
Third, the validation mechanism was updated to prevent the fail-open scenario. The boolean validation helper common.isTempFile was deleted. In its place, the developers implemented common.getTempFile, which uses an updated regular expression /^(?:\/?temp\/)?([\da-f]{64})(?:\.[\w.-]+)?$/ to perform extraction rather than pure boolean testing. The path concatenation helper now only executes if a valid hash is actively extracted from the user input.
Below is the conceptual structure of the code before and after the application of the patch:
// BEFORE PATCH
var filename = req.query.filename;
if (common.isTempFile(filename)) {
filename = path.join(TEMP_FILES_PATH, filename);
}
// If isTempFile returned false, the execution continued with the raw query string.
getFile(filename, function(em, data) { ... });
// AFTER PATCH
var filename = req.query.filename;
var tempFile = common.getTempFile(filename);
if (tempFile) {
// The path.join function is now only reached if the format is matched.
filename = path.join(TEMP_FILES_PATH, tempFile);
getFile(filename, function(em, data) { ... });
} else {
// If the format does not match, the application does not load raw file paths.
}The change guarantees that an invalid temporary file parameter is never treated as a valid local system path, preventing arbitrary reads.
Exploitation of CVE-2026-55629 requires network connectivity to the active Whistle proxy port. The default port utilized is 8899. An attacker does not require any credentials, pre-existing sessions, or specific application configurations to execute this attack against unpatched versions.
To retrieve local system files, the attacker targets the exposed /cgi-bin/temp/get endpoint. They must formulate a query string containing the target file path. On Linux environments, the payload seeks files such as /etc/passwd. On Windows targets, standard system files such as C:/windows/win.ini or active project configuration files are used.
Upon receiving the payload, the backend fails to match the path string against the 64-character hexadecimal pattern. The application then falls through the routing logic and passes the relative or absolute path payload straight to the local filesystem API. The response returns the file's raw byte array to the client.
The impact of CVE-2026-55629 represents a severe risk to host confidentiality. Since Whistle is frequently executed by developers, engineers, and testing pipelines, the process holds the permission level of the host shell. Any files readable by the developer running the proxy are accessible to an attacker.
This access allows for the retrieval of configuration files, private SSH keys, cloud provider metadata tokens, and environment configurations. This disclosure can provide the lateral movement coordinates needed to access databases or production systems. Furthermore, in containerized or shared environments, the flaw can leak critical orchestration secrets.
The CVSS v4.0 base score is rated at 8.7. The vector reflects network availability, low complexity, and high confidentiality impact. Although the exploit status does not currently indicate active wild usage, the existence of trivial reproduction vectors makes rapid exploitation highly likely once an instance is discovered on the open internet.
The primary remediation for CVE-2026-55629 is updating the Whistle installation to version 2.10.3 or greater. The package is updated globally via the node package manager (npm). This update applies the logic changes, removes the deprecated services exports, and requires the unique header credential for endpoint interactions.
When immediate upgrades are impossible, network-level mitigations must be implemented. Administrators must verify that the Whistle proxy does not listen on wildcard addresses such as 0.0.0.0. Restricting the binding configuration to the local loopback address 127.0.0.1 blocks external connections.
# Command to bind Whistle to localhost exclusively
w2 start -p 8899 -h 127.0.0.1Additionally, corporate networks must enforce firewall rules blocking ingress connections to port 8899 from external IP subnets. Any network monitoring infrastructure should flag HTTP query paths containing /cgi-bin/temp/get paired with suspicious query structures like double-dot paths or absolute system folders.
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| Product | Affected Versions | Fixed Version |
|---|---|---|
whistle avwo | < 2.10.3 | 2.10.3 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-22 |
| Attack Vector | Network (Unauthenticated) |
| CVSS 4.0 Score | 8.7 (High) |
| EPSS Score | 0.00669 (Percentile: 49.20%) |
| Impact | Arbitrary File Disclosure (Read-Only) |
| Exploit Status | PoC Available |
| CISA KEV Status | Not Listed |
The application uses external input to construct a pathname that is intended to identify a file or directory that is located under a restricted directory, but the software does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory.
A denial of service vulnerability in GOVCERT-LU eml_parser before version 3.0.2 allows unauthenticated remote attackers to trigger an unhandled RecursionError exception. The issue arises during the parsing of structured email headers containing excessively nested parentheses representing Comments and Folding White Space (CFWS). Because the parser fails to catch this recursion-limit exception from Python's standard library, processing of the entire mail immediately aborts, which can disrupt automated security triage pipelines and email ingestion components.
Prior to version 3.0.2, GOVCERT-LU's eml_parser library is vulnerable to an algorithmic complexity Denial of Service (DoS) vulnerability via the comment-stripping routine noparenthesis() in routing.py. An unauthenticated attacker can submit a crafted EML file containing nested parenthesized comments to cause complete CPU saturation. This happens due to a quadratic time complexity bottleneck in regex replacement of nested structures.
An arbitrary file read and write vulnerability exists in the Model Context Protocol (MCP) server endpoints of sublinear-time-solver and consciousness-explorer. By providing unvalidated file paths to the export_state, import_state, saveVectorToFile, and loadVectorFromFile tools, local attackers can read or overwrite sensitive host files.
An Authorization Bypass Through User-Controlled Key (CWE-639 / Insecure Direct Object Reference) vulnerability exists in @arikusi/deepseek-mcp-server starting in version 1.4.2 and fixed in 1.7.0. In Streamable HTTP transport mode, a process-global SessionStore singleton allows any remote client to retrieve or modify active conversation contexts belonging to other clients.
CVE-2026-45018 is a critical command injection vulnerability in Chainlit's Model Context Protocol (MCP) stdio transport backend. By submitting a crafted JSON payload containing dangerous argument options to an unauthenticated HTTP endpoint, a remote attacker can bypass executable validation rules and run arbitrary shell commands with the privileges of the active Python process.
An unauthenticated server-side request forgery (SSRF) vulnerability exists in Chainlit versions >= 2.4.0rc0 and < 2.12.0 when the Model Context Protocol (MCP) features are enabled. This vulnerability allows remote, unauthenticated attackers to force the backend application server to initiate arbitrary HTTP/HTTPS connections to internal subnets, localhost endpoints, or cloud metadata infrastructure.