Jun 15, 2026·6 min read·1 visit
The Nuxt development server exposes a Chrome DevTools workspace endpoint that lacks proper cross-origin or host validation. Remote sites visited by a developer can exfiltrate the local directory path and a workspace UUID via DNS rebinding.
A security vulnerability in the Nuxt development server allows unauthenticated local or cross-origin attackers to retrieve the host machine's absolute project directory path and a persistent Chrome DevTools workspace UUID. The issue stems from an unprotected endpoint registered at `/.well-known/appspecific/com.chrome.devtools.json` which does not validate the HTTP Host, Origin, or Referer headers.
The Nuxt framework development environment spins up a local server using the Nitro engine to facilitate rapid prototyping and hot module replacement. To integrate with browser developer tools, Nuxt automatically implements an endpoint at the standard path /.well-known/appspecific/com.chrome.devtools.json. This endpoint facilitates Chrome DevTools Workspaces, allowing real-time synchronization between the browser's console and the local filesystem source code.\n\nIn vulnerable versions of Nuxt, this configuration route was registered directly without any security checks. It exposes the project's root directory path on the local filesystem and a unique, persistent workspace identifier. The endpoint serves this highly sensitive data to any network client capable of making a successful HTTP GET request to the development port.\n\nThe vulnerability is classified as an improper input validation and access control issue, mapping to CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor). It represents an exposure of internal system configurations to untrusted actors on the local area network or malicious third-party websites. The primary attack surfaces include cross-origin requests executed via DNS rebinding and direct probing over local networks.
The underlying flaw resides in how Nuxt configures and registers the Chrome DevTools integration handler. The Nitro server engine registers dev handlers through a pipeline designed to host utility endpoints. In affected releases, the handler for the com.chrome.devtools.json route returned the configuration payload directly, omitting any checks on the incoming HTTP request.\n\nThe server did not implement origin, referer, or host header verification before responding to requests. Consequently, any HTTP client that addressed the server's port could retrieve the sensitive JSON object. This behavior violates standard browser security assumptions regarding local development ports, which are typically assumed to be isolated from remote web origins.\n\nUnder normal conditions, browsers enforce the Same-Origin Policy (SOP) to block cross-origin reads. However, because the server did not validate the HTTP Host header, it remained fully susceptible to DNS rebinding techniques. Furthermore, if the server bound to all interfaces (using 0.0.0.0), any host on the same local network could access the endpoint directly without triggering cross-origin protections.
To understand the technical implementation, it is necessary to examine the original implementation within packages/nitro-server/src/index.ts. The handler was declared as a simple, unconditional event responder that returned the directory and project configuration.\n\ntypescript\n// Vulnerable Code Pattern\nnitro.options.devHandlers.push({\n route: '/.well-known/appspecific/com.chrome.devtools.json',\n handler: defineEventHandler(() => ({\n workspace: {\n ...projectConfiguration,\n root: nuxt.options.rootDir,\n },\n })),\n})\n\n\nThe pull request #35201 resolved this by inserting an authorization check. This validation relies on a new helper function named isLocalDevRequest. The function tests the incoming request's metadata before returning the payload, falling back to a 403 Forbidden status if the check fails.\n\ntypescript\n// Patched Code Pattern\nnitro.options.devHandlers.push({\n route: '/.well-known/appspecific/com.chrome.devtools.json',\n handler: defineEventHandler((event) => {\n if (!isLocalDevRequest(event, getDevHandlerAllowedHosts(nuxt))) {\n setResponseStatus(event, 403)\n return 'Forbidden'\n }\n return {\n workspace: {\n ...projectConfiguration,\n root: nuxt.options.rootDir,\n },\n }\n }),\n})\n\n\nThe patch introduces a helper isLocalDevRequest which parses the host header, the sec-fetch-site header, and fallback origin or referer headers. The primary verification checks if the request's host matches loopback IPs or explicitly allowed hosts configured in Vite. It also uses the sec-fetch-site header to ensure the request is same-origin or initiated directly by the user (none).\n\nThere is a minor limitation in the host parser: const host = hostHeader?.split(':')[0]. For IPv6 addresses containing ports, such as [::1]:3000, splitting on the colon splits the address itself. This causes the host to be evaluated as [ which fails the loopback validation check and generates a 403 error for legitimate local IPv6 requests.\n\nmermaid\ngraph LR\n subgraph Client [Browser Context]\n A["Malicious Page"] -->|1. Fetch Request| B["Localhost Dev Server"]\n end\n subgraph Nuxt [Vulnerable Dev Server]\n B -->|2. Route Handler| C["com.chrome.devtools.json"]\n C -->|3. Discloses| D["Absolute Root Path & UUID"]\n D -->|4. Exfiltrated Data| A\n end\n
Exploitation requires that an attacker establish a vector to reach the development port, typically 3000, on the developer's local machine. Under a DNS rebinding attack, the target developer is enticed to visit a malicious domain controlled by the attacker. The attacker's domain is configured with a very low Time-To-Live (TTL) value to facilitate rapid IP changes.\n\nOnce the page loads, the attacker's DNS server updates its resolution to point to 127.0.0.1. The browser, believing it is communicating with the original domain, issues an asynchronous HTTP request to the development port. Because the browser treats this request as same-origin with the malicious page, the script can bypass standard SOP and read the JSON response.\n\nAlternatively, if the developer binds the server to 0.0.0.0, the endpoint is exposed directly to the local subnet. Any malicious device on the same local network can perform a direct HTTP GET request to retrieve the data. In this scenario, no browser-based interaction is required to successfully extract the information.\n\nbash\n# LAN-based data extraction command\ncurl -s http://192.168.1.50:3000/.well-known/appspecific/com.chrome.devtools.json\n
The exposure of the absolute filesystem path reveals local system details. This disclosure provides information such as local usernames, home directory structures, and naming conventions of internal development projects. For example, a response revealing /Users/restricted_dev/internal-projects/proprietary-finance leaks the precise organizational environment.\n\nThe exposure of the persistent workspace UUID represents a secondary security risk. This identifier remains constant across development sessions, allowing attackers to perform persistent tracking and fingerprinting of a specific developer's machine. This identifier could also be abused to target internal APIs exposed by browser extensions or IDE integrations that rely on the workspace configuration.\n\nWhile the vulnerability does not directly lead to remote code execution on its own, it functions as a critical reconnaissance step. Attackers can combine filesystem layout information with other local vulnerabilities, such as local file inclusion or directory traversal, to construct targeted exploit chains. The absence of validation on developer-facing local endpoints remains a significant threat vector.
The primary mitigation strategy is upgrading the project's Nuxt dependencies to a version incorporating the fix from Pull Request #35201. This introduces the host validation mechanism and rejects unauthorized requests with a 403 status code. Developers should execute a clean package installation to ensure the patch is applied to the active node_modules environment.\n\nIf immediate upgrading is not possible, developers should ensure the development server is strictly bound to the loopback interface (127.0.0.1 or ::1). Binding to wildcard interfaces like 0.0.0.0 or --host should be avoided unless strictly necessary and conducted within an isolated network. Using containers can also isolate the host filesystem and mitigate directory disclosures.\n\nDevelopers can manually verify their exposure using network tools. Sending a modified Host header to the local server simulates a DNS rebinding attempt. If the server returns a 403 Forbidden status, the mitigation is active; a 200 OK status indicates the development server remains vulnerable.\n\nbash\n# Verification command simulating a rebinding host\ncurl -I -H "Host: rogue-domain.com" http://localhost:3000/.well-known/appspecific/com.chrome.devtools.json\n
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
Nuxt Nuxt | All versions before patch #35201 | v3.12.0 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-200 |
| Attack Vector | Network / Local |
| CVSS Score | 6.5 |
| Impact | Information Disclosure |
| Exploit Status | None |
| KEV Status | Not Listed |
The product exposes sensitive information to an actor who is not authorized to have access to that information.
CVE-2026-50020 is a medium-severity HTTP Request Smuggling/Response Smuggling vulnerability (CWE-444) within the Netty asynchronous network application framework. The flaw resides in Netty's HTTP codec implementation, specifically the HttpObjectDecoder class, which silently consumes arbitrary ISO control bytes preceding the first request line.
CVE-2026-50560 describes a vulnerability in Netty's HTTP/2 codec implementation. When acting as an intermediary (such as a reverse proxy, API gateway, or edge server), Netty can be forced into an application-level Denial-of-Service condition. The attack is triggered by negotiating a restrictive SETTINGS_MAX_HEADER_LIST_SIZE from the client, causing Netty to process incoming requests fully, but subsequently crash or abort during outbound response serialization. This results in an asymmetrical consumption of resources on backend systems and thread starvation within the Netty event loop.
A critical supply-chain OS command injection vulnerability exists in the NodejsFunction local bundling pipeline within the AWS Cloud Development Kit (CDK) library (aws-cdk-lib) before version 2.245.0 (and before 2.246.0 on Windows systems). The vulnerability allows a threat actor who can control any of several bundling properties (externalModules, define, loader, inject, or esbuildArgs) to execute arbitrary operating system commands on the host machine running the CDK compilation or deployment toolchain (e.g., during cdk synth, cdk deploy, or cdk diff).
PyJWT versions 2.8.0 through 2.12.1 are vulnerable to an unauthenticated Denial of Service (DoS) attack. When verifying detached JSON Web Signatures (JWS) using the unencoded-payload option (RFC 7797, b64=false), the library eagerly decodes the payload segment before verifying the header configuration or the cryptographic signature. This behavior enables a remote, unauthenticated attacker to inject an arbitrarily large payload segment, triggering excessive CPU and memory resource consumption prior to signature validation.
Nodemailer prior to version 8.0.9 contains a security control bypass vulnerability. Transport-level configuration parameters designed to restrict local file system access and remote URL requests are not propagated to all content-resolution execution paths. This failure allows unauthorized local file inclusion and server-side request forgery when the application utilizes specific transports or processing flags.
GHSA-268h-hp4c-crq3 is a Carriage Return Line Feed (CRLF) injection vulnerability in the Nodemailer npm package affecting versions up to and including 8.0.8. The library allows arbitrary email header injection when parsing user-controlled comments within list headers (such as List-Unsubscribe or List-ID). This occurs because list headers bypass standard validation by utilizing an internal 'prepared' flag, causing unsanitized newlines to be emitted directly into the outgoing RFC822 mail stream. This exploit allows remote attackers to inject custom, unauthorized mail headers, disrupting signature checks, bypassing filters, or spoofing parameters.