Severity by source
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/E:P/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
Local-only attack vector and low privileges required because exploitation demands direct control over an internal API parameter in a local developer context; no scope change as impact is confined to the current process.
Primary rating from Vendor (vuldb).
CVSS VectorVendor: vuldb
Lifecycle Timeline
2DescriptionCVE.org
A vulnerability was detected in publint up to 0.1.4. This impacts the function child_process.exec of the file src/node/pack.js of the component package-manager Command Handler. The manipulation results in os command injection. Attacking locally is a requirement. The exploit is now public and may be used. The patch is identified as adf2d9a09945fc98c85a2520a89f441d78b2dbd8. It is advisable to implement a patch to correct this issue. The project maintainer explains: "I think it's very rare for someone to use this package with untrusted input".
AnalysisAI
OS command injection in the @publint/pack component of publint (up to v0.1.4) allows a local attacker who controls the packageManager input to execute arbitrary shell commands via unsanitized string interpolation passed to child_process.exec. The affected functions packAsJson and pack in src/node/pack.js and src/node/pack-as-json.js construct shell command strings by concatenating the packageManager variable directly into template literals before passing them to util.promisify(cp.exec). A proof-of-concept exploit is publicly available (CVSS 4.0 E:P), though the maintainer explicitly states exploitation requires untrusted input usage, which is outside the package's intended use case and not confirmed actively exploited in the wild.
Technical ContextAI
publint is a Node.js npm package linting tool; its @publint/pack sub-package orchestrates invocations of package managers (npm, yarn, pnpm, bun) to produce pack outputs. The vulnerability (CWE-77: Command Injection) arises because pack.js and pack-as-json.js build the shell command via string interpolation - e.g., let command = \${packageManager} pack\`` - and execute it through Node.js's child_process.exec, which spawns a shell that interprets metacharacters. If the packageManager value contains shell metacharacters such as semicolons or pipes, the shell interprets them as command delimiters and executes the injected payload. The fix replaces child_process.exec string-based invocation with the tinyexec library using argument arrays (exec(command[0], command.slice(1), ...)), which bypasses shell interpretation entirely, and adds an allowlist validation restricting packageManager to the set ['npm', 'yarn', 'pnpm', 'bun']. No CPE strings are provided in source data; the package is an npm module for Node.js developer environments.
RemediationAI
Upgrade @publint/pack to the version incorporating commit adf2d9a09945fc98c85a2520a89f441d78b2dbd8, available via the upstream repository at https://github.com/publint/publint/commit/adf2d9a09945fc98c85a2520a89f441d78b2dbd8 and tracked in PR #238 (https://github.com/publint/publint/pull/238). The changeset marks this as a patch release for @publint/pack, but no specific tagged release version number is independently confirmed from available data - verify the exact version in the npm registry after the upstream release. If immediate upgrade is not feasible, the primary compensating control is to ensure the packageManager parameter passed to packAsJson or pack is never sourced from untrusted or user-controlled input; the maintainer's advisory confirms this is not the intended usage pattern. Additionally, restricting execution context to sandboxed CI environments limits the blast radius of any injected commands.
Same weakness CWE-77 – Command Injection
View allSame technique Command Injection
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-47863
GHSA-vg6g-fgc8-7284