Jun 16, 2026·5 min read·7 visits
Nuxt dev server's use of abstract-namespace Unix sockets on Linux allowed unauthorized local users to connect to the internal IPC server and extract sensitive developer files (such as .env files) without authentication.
A local security vulnerability in the Nuxt development server (nuxt dev) allows local unprivileged users to access sensitive configuration files and source code. On Linux environments running Node.js 20+, Nuxt bound its internal vite-node IPC server to an abstract-namespace Unix socket without any peer authentication, enabling co-resident local users to connect and request module code directly.
On Linux platforms running Node.js 20+, the Nuxt development framework utilizes an internal Inter-Process Communication (IPC) socket server to facilitate module loading between Vite and the Node.js runtime.
In vulnerable versions of Nuxt (4.0.0 to 4.4.6, and 3.18.0 to 3.21.6), this internal IPC server binds directly to a Linux abstract-namespace Unix socket rather than a traditional file-based socket.
Because abstract-namespace sockets lack filesystem inodes, they completely bypass traditional file and directory permission controls, enabling any unprivileged local user on the host system to discover and connect to the socket directly.
Once connected, the local attacker gains access to the fully exposed Vite-Node server endpoints without any secondary authentication or authorization checks.
The root cause of this vulnerability lies in the design of Linux abstract-namespace Unix sockets and how Node.js treats them when prefixed with a null byte (\0).
Traditional Unix domain sockets are represented as nodes on the filesystem, allowing administrators to restrict access using standard discretionary access controls (DAC) such as chmod 0700 or owner permissions.
Conversely, abstract sockets reside purely within the kernel's network namespace and have no filesystem representation, meaning file-level permissions do not apply to them.
Any process in the same network namespace can query /proc/net/unix to identify the socket's unique identifier and open a stream connection to it.
Because the internal createViteNodeSocketServer listening function performed no authorization checks (such as verifying the peer process owner UID or validating a token), the socket was left completely open to all co-resident users.
The original implementation of generateSocketPath in packages/vite/src/plugins/vite-node.ts generated a path starting with a null byte for Linux systems.
// Vulnerable Code Path
if (process.platform === 'linux') {
const nodeMajor = Number.parseInt(process.versions.node.split('.')[0]!, 10)
if (nodeMajor >= 20 && provider !== 'stackblitz') {
// ... checks for Docker omitted ...
if (!isDocker) {
return `\\0${socketName}.sock` // Null byte triggers abstract socket
}
}
}The patch resolved this exposure by removing the abstract socket logic entirely and enforcing a secure, permission-restricted directory pattern.
// Patched Code Path (v4)
export function pickSocketPath (platform: NodeJS.Platform): SocketPathInfo {
const uniqueSuffix = `${process.pid}-${Date.now()}`
const socketName = `nuxt-vite-node-${uniqueSuffix}`
if (platform === 'win32') {
return { socketPath: join(String.raw`\\\\.\\pipe`, socketName) }
}
// Enforce secure 0700 directory permissions
const parentDir = fs.mkdtempSync(join(os.tmpdir(), 'nuxt-vite-node-'))
fs.chmodSync(parentDir, 0o700)
return { socketPath: join(parentDir, `${socketName}.sock`), parentDir }
}Additionally, to close the window between directory creation and socket binding, the patch wraps socket listener instantiation in a strict umask boundary:
// Secure Socket Listening
const previousUmask = process.umask(0o077)
try {
server.listen(socketPath, () => {
try {
fs.chmodSync(socketPath, 0o600)
} catch (error) {
server.close()
}
})
} finally {
process.umask(previousUmask)
}An attacker on a multi-tenant Linux server or workstation can locate active Nuxt dev instances and query files through the exposed IPC server.
First, the attacker enumerates active abstract sockets by reading /proc/net/unix.
grep -o -E "nuxt-vite-node-[0-9\-]+\.sock" /proc/net/unixOnce the target socket ID is obtained, the attacker uses Netcat with the -U flag (and the @ prefix signifying an abstract socket path) to establish a raw TCP-like stream connection.
c -U "@nuxt-vite-node-[PID]-[TIMESTAMP].sock"Finally, the attacker issues a raw JSON instruction to fetch a module, instructing the server to resolve a local path bypassing Vite's server.fs.allow configuration.
{
"id": 1,
"type": "module",
"moduleId": "/home/developer/app/.env?raw"
}The server responds directly with the content of the target file, facilitating arbitrary local file reading with the permissions of the developer process.
The security impact of GHSA-534h-c3cw-v3h9 is rated as Medium (CVSS 5.5) due to the prerequisite of local system access, but the consequences can be significant.
If the development environment is run on shared infrastructure, such as multi-user workstations, academic labs, bastion servers, or shared development servers, any unprivileged system user can leverage this vulnerability.
By accessing the IPC interface, the attacker bypasses Vite's browser-oriented cross-origin and directory traversal restrictions.
This permits the reading of database passwords, API tokens, local SSH private keys, and application source code, resulting in complete local confidential information disclosure.
The primary defensive mitigation is to update to the patched releases: Nuxt 4.4.7 or 3.21.7.
In environments where upgrading dependencies is not immediately feasible, developers can isolate their dev environment using standard Linux containers.
# Run Nuxt dev in a rootless container to isolate namespaces
docker run --rm -it -v $(pwd):/src -w /src node:20 npm run devSystem administrators can detect potential exploitation attempts by auditing /proc filesystem accesses or using system call tracing (such as sysdig or auditd) to monitor unauthorized processes establishing Unix socket connections containing the nuxt-vite-node pattern.
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
nuxt Nuxt | >= 4.0.0, < 4.4.7 | 4.4.7 |
nuxt Nuxt | >= 3.18.0, < 3.21.7 | 3.21.7 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-276 |
| Attack Vector | Local |
| Attack Complexity | Low |
| Privileges Required | Low |
| User Interaction | None |
| Scope | Unchanged |
| Confidentiality Impact | High |
| Exploit Status | Proof of Concept |
CVE-2026-58263 is a high-severity Mutation Cross-Site Scripting (mXSS) vulnerability affecting Jodit Editor prior to version 4.12.28. The flaw exists in Jodit's built-in clean-html sanitizer plugin, which fails to securely parse and sanitize nested elements containing foreign namespaces like MathML and SVG. Attackers can bypass sanitization by smuggling malicious payload elements inside rawtext container tags like style inside a MathML node, leading to DOM mutation and unauthenticated arbitrary script execution in the context of the user's browser session.
Jodit Editor versions prior to 4.13.6 are vulnerable to client-side Cross-Site Scripting (XSS). The clean-html plugin's sanitization routine performs case-sensitive lookups against uppercase-only element blacklists. When processing XML-based foreign namespaces such as SVG or MathML, DOM engines preserve the lowercase format of tags. Because Jodit's denyTags check fails to normalize tag casing, malicious script blocks nested inside foreign namespace elements completely bypass validation and serialize directly into the editor output.
A critical code injection vulnerability exists in Savon, a widely used SOAP client library for Ruby, prior to version 2.17.2. The vulnerability resides within the Savon::Model.all_operations module, where operation names fetched from a target Web Services Description Language (WSDL) document are dynamically evaluated via module_eval without sanitization. An attacker capable of manipulating the target WSDL document (e.g., through Man-in-the-Middle attacks, DNS hijacking, or Server-Side Request Forgery) can execute arbitrary Ruby code in the context of the parent application process.
An integer conversion overflow vulnerability exists in the XCF decoder of ImageMagick before version 6.9.13-51 and 7.1.2-26. The issue arises from mixed-type arithmetic that promotes calculation results to floating-point representations, causing an undefined cast back to integer. Under optimizing compilers, this undefined behavior results in bounds checks being bypassed, allowing out-of-bounds heap reads.
An authenticated file upload validation bypass vulnerability exists in the REDAXO CMS Mediapool addon in versions 5.18.2 through 5.21.0. Under permissive web server configurations, this allows authenticated users with media upload privileges to achieve remote code execution via multi-segment extension file uploads.
A critical SQL injection vulnerability exists in the @nocobase/plugin-notification-in-app-message plugin of NocoBase prior to version 2.0.61. The flaw is caused by direct string interpolation of user-controlled input into a Sequelize.literal() query, allowing authenticated users to execute stacked PostgreSQL queries and achieve remote code execution on the underlying database server.