Any team running OpenClaw that installs local plugins or hook packs from untrusted sources is exposed to install-time arbitrary code execution — even though --ignore-scripts is in use, it does not protect against .npmrc overriding the git executable. Update to 2026.3.24 immediately and treat any recently installed local plugin/hook as potentially compromised. Until patched, block local plugin/hook installations from unverified sources at the process level.
What is the risk?
High risk (CVSS 8.6). Exploitability is trivial: no privileges required, user interaction is just running a routine install command, and the PoC payload is as simple as pointing git to calc.exe. The blast radius is high — full code execution on the installing machine at install time, before any trust boundary is established. AI/ML teams routinely share and install community plugins and hook packs, making this a realistic attack vector in collaborative or open-source AI development environments. The deceptive element — that --ignore-scripts is present, implying safety — means developers may have false confidence in the installation workflow.
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| openclaw | npm | <= 2025.3.23 | 2026.3.24 |
Do you use openclaw? You're affected.
Severity & Risk
Attack Surface
What should I do?
5 steps-
PATCH
Upgrade to OpenClaw 2026.3.24 immediately — this is the only complete fix.
-
AUDIT
Review all local plugins/hooks installed since 2026.3.13 for the presence of .npmrc files and unexpected git dependencies.
-
WORKAROUND (pre-patch): Strip or sanitize .npmrc files from package directories before running openclaw install. A pre-install hook or wrapper script that deletes .npmrc from staged directories mitigates the issue.
-
POLICY
Restrict openclaw plugins/hooks install to known-good registries; avoid installing from arbitrary local paths or untrusted archives.
-
DETECT
Alert on executions of unexpected binaries spawned by npm during OpenClaw install sessions (EDR process tree monitoring: npm → unexpected child process).
Classification
Compliance Impact
This CVE is relevant to:
Related AI Incidents (3)
Package "openclaw" mentioned in incident; Company "OpenClaw" in CVE description
Package "openclaw" mentioned in incident; Company "OpenClaw" in CVE description
Malicious Nx npm packages published via a compromised CI workflow with postinstall scripts executing arbitrary code to exfiltrate credentials directly matches both the 'supply_chain' and 'code_execution' attack types of this CVE. The attack vector (tampered package triggering malicious code at install time) is the same class of vulnerability.
Source: AI Incident Database (AIID)
Frequently Asked Questions
What is GHSA-m3mh-3mpg-37hw?
Any team running OpenClaw that installs local plugins or hook packs from untrusted sources is exposed to install-time arbitrary code execution — even though --ignore-scripts is in use, it does not protect against .npmrc overriding the git executable. Update to 2026.3.24 immediately and treat any recently installed local plugin/hook as potentially compromised. Until patched, block local plugin/hook installations from unverified sources at the process level.
Is GHSA-m3mh-3mpg-37hw actively exploited?
No confirmed active exploitation of GHSA-m3mh-3mpg-37hw has been reported, but organizations should still patch proactively.
How to fix GHSA-m3mh-3mpg-37hw?
1. PATCH: Upgrade to OpenClaw 2026.3.24 immediately — this is the only complete fix. 2. AUDIT: Review all local plugins/hooks installed since 2026.3.13 for the presence of .npmrc files and unexpected git dependencies. 3. WORKAROUND (pre-patch): Strip or sanitize .npmrc files from package directories before running openclaw install. A pre-install hook or wrapper script that deletes .npmrc from staged directories mitigates the issue. 4. POLICY: Restrict openclaw plugins/hooks install to known-good registries; avoid installing from arbitrary local paths or untrusted archives. 5. DETECT: Alert on executions of unexpected binaries spawned by npm during OpenClaw install sessions (EDR process tree monitoring: npm → unexpected child process).
What systems are affected by GHSA-m3mh-3mpg-37hw?
This vulnerability affects the following AI/ML architecture patterns: agent frameworks, plugin systems, AI development pipelines, CI/CD pipelines with AI tooling.
What is the CVSS score for GHSA-m3mh-3mpg-37hw?
GHSA-m3mh-3mpg-37hw has a CVSS v3.1 base score of 8.6 (HIGH).
Technical Details
NVD Description
> Fixed in OpenClaw 2026.3.24, the current shipping release. ### Summary During the installation phase of OpenClaw local plugins/hooks, the Git executable can be hijacked by a project-level .npmrc file, leading to arbitrary code execution during installation. ### Details Please note that the source code locations mentioned below are based on version openclaw-2026.3.13-1, but the issue has been confirmed to still exist in the current latest version, 2026.3.23. When installing a local plugin directory, local plugin archive, local hook pack directory, or local hook pack archive, OpenClaw first copies the source directory to a temporary `stageDir`, then executes the following in that directory: ``` npm install --omit=dev --silent --ignore-scripts ``` See `src/infra/install-package-dir.ts:176-199`. Since this process does not strip the project root `.npmrc`, and npm reads the project-level `.npmrc` during local project installation, an attacker could use a `.npmrc` file in a malicious plugin or hook directory to override npm’s `git` executable path. By leveraging a Git dependency, the attacker could trigger npm to call this malicious program, thereby executing arbitrary local code during the installation phase. **Affected Paths** - Plugin CLI entry point: `src/cli/plugins-cli.ts:199-255` - Hook CLI entry point: `src/cli/hooks-cli.ts:573-676` - Plugin local directory / archive installation: `src/plugins/install.ts:379-405`, `src/plugins/install.ts:541-565` - Hook local directory / archive installation: `src/hooks/install.ts:380-403`, `src/hooks/install.ts:443-470` - Actual execution of `npm install --ignore-scripts`: `src/infra/install-package-dir.ts:176-199` **Vulnerability Trigger Flow** 1. The user executes one of the following commands: - `openclaw plugins install <path-or-spec>` - `openclaw hooks install <path-or-spec>` 2. If the argument is a local directory or local archive, OpenClaw navigates to the local installation path. 3. OpenClaw copies the source directory to a temporary `stageDir`. See `src/infra/install-package-dir.ts:176-177`. 4. If `dependencies` are present in `package.json`, OpenClaw executes the following in `stageDir`: ``` npm install --omit=dev --silent --ignore-scripts ``` See `src/infra/install-package-dir.ts:188-199`. 5. npm reads the project-level `.npmrc` file in this directory. Official documentation: [`.npmrc`](https://docs.npmjs.com/cli/v11/configuring-npm/npmrc/) 6. If `.npmrc` is set to `git=<path to malicious program>` and there is a git dependency in the dependency tree, npm will invoke that `git` program when resolving the dependency. Official documentation: [`npm config git`](https://docs.npmjs.com/cli/v11/using-npm/config/) Git dependency documentation: [`package.json`](https://docs.npmjs.com/cli/v11/configuring-npm/package-json/) 7. Consequently, an attacker can execute arbitrary local programs during the plugin/hook installation phase without waiting for the plugin or hook to be loaded later. **Triggering Commands** - Plugin installation command: ``` openclaw plugins install <path-or-spec> ``` - Hook installation command: ``` openclaw hooks install <path-or-spec> ``` When `<path-or-spec>` is a local directory or local archive, it will be resolved to the path used by the `npm install --omit=dev --silent --ignore-scripts` command mentioned above. ### PoC Currently, `testpoc/` is a minimal PoC directory used to verify that “when installing local packages, OpenClaw enters the `npm install --ignore-scripts` path.” It is divided into two core sections: testpoc/pkg/ Purpose: Simulates the local package directory installed by `openclaw plugins install ...` or `openclaw hooks install ...` testpoc/repo/ Purpose: Simulates a Git dependency repository within the npm dependency tree Directory Structure testpoc/ ├─ pkg/ │ ├─ .npmrc │ ├─ package.json │ └─ sample-hook/ │ ├─ HOOK.md │ └─ handler.js └─ repo/ ├─ package.json └─ .git/... Function of Each Component testpoc/pkg/.npmrc Current content: git=calc.exe Function: Overrides npm’s Git executable configuration. Meaning: When npm encounters a git dependency during installation, it will not call the system git but will attempt to call the program specified here. This is the core trigger point of this PoC. See testpoc/pkg/.npmrc:1 testpoc/pkg/package.json Currently, this is a “mixed-use” manifest that includes both plugin and hook fields: { “name”: “probe-host”, “version”: “1.0.0”, “private”: true, “openclaw”: { “extensions”: [“./dist/index.js”], “hooks”: [“./sample-hook”] }, “dependencies”: { “probe-git-dep”: “git+file:///D:/AI Agent Source/OpenClaw/openclaw-2026.3.13-1/.testpoc/repo” } } Its functionality is divided into three layers: openclaw.extensions: Allows it to be validated as a plugin package openclaw.hooks: Enables it to be validated as a hook package The Git URL in dependencies: Forces npm to enter the Git dependency resolution path during installation See testpoc/pkg/package.json:1 testpoc/pkg/sample-hook/HOOK.md Purpose: To meet the minimum metadata requirements for a hook package. This is the key file that allows `openclaw hooks install pkg` to pass the pre-check. See testpoc/pkg/sample-hook/HOOK.md:1 testpoc/pkg/sample-hook/handler.js Current content: export default async function handler() { return { ok: true }; } Purpose: Meets the requirement that the hook directory must contain a handler entry file. It is not a usage point in itself; its sole purpose is to allow OpenClaw to proceed to the dependency installation phase. See testpoc/pkg/sample-hook/handler.js:1 testpoc/repo/package.json Current content: {“name”:“probe-git-dep”,‘version’:“1.0.0”} Purpose: Serves as the minimum repository content corresponding to a Git dependency. The focus is not on the repository code itself, but on the fact that “it is a Git repository,” allowing npm to perform Git-related operations on it. See testpoc/repo/package.json:1 testpoc/repo/.git/ Purpose: Makes testpoc/repo/ a real Git repository rather than a regular directory. When npm resolves git+file://... When installing dependencies, this is treated as the Git source. How the current PoC works If installing via hooks: openclaw hooks install testpoc/pkg The trigger chain is: OpenClaw identifies testpoc/pkg as the local hook package path Through pre-validation in openclaw.hooks, HOOK.md, and handler.js Proceeds to src/infra/install-package-dir.ts:188-199 Executes: npm install --omit=dev --silent --ignore-scripts npm reads testpoc/pkg/.npmrc npm processes the git dependency in package.json npm attempts to call the git=calc.exe specified in .npmrc ### Impact It is best described as an installation-time local command execution / unsafe package-install configuration issue. More precisely: OpenClaw installs local plugin and hook packs by running npm install --omit=dev --silent --ignore-scripts inside the staged package directory, see src/infra/install-package-dir.ts:188-199. If that local package directory contains an attacker-controlled .npmrc, npm will still read it. If .npmrc overrides npm’s git executable and the package has a git dependency, npm can invoke the attacker-chosen program during install. Who is impacted Users who run: openclaw plugins install <local path/archive> openclaw hooks install <local path/archive> And who install a malicious or untrusted local package that includes: a controlled .npmrc a git dependency a runnable attacker-controlled git target on that platform This should be treated as a security issue, not just “malicious plugin behavior,” because the code execution happens during OpenClaw’s install workflow, before the plugin or hook is ever loaded as trusted runtime code. The important distinction is: A normal “trusted plugin” case is: the operator installs a plugin, enables it, and later that plugin runs with plugin privileges. This issue is different: OpenClaw’s installer executes npm install --omit=dev --silent --ignore-scripts inside an attacker-controlled package directory, and npm still honors attacker-controlled project config from .npmrc. That means an untrusted local plugin or hook package can influence the package manager itself and reach arbitrary program execution at install time, via npm’s git setting and a git dependency, even though --ignore-scripts is present. Why this matters from a security perspective: It is install-time execution, not post-install trusted execution. The execution is triggered by OpenClaw’s installer in src/infra/install-package-dir.ts:188-199. This occurs before the package is accepted as a trusted loaded plugin/hook in the usual sense. It defeats an expected safety boundary. The code explicitly uses --ignore-scripts, which strongly suggests an intent to make installation safer. But the installer still allows attacker-controlled package-manager configuration from .npmrc to affect execution. So the current mitigation is incomplete in a security-relevant way. The dangerous input is part of a supported user flow. OpenClaw explicitly supports installing plugins and hook packs from local directories and archives: src/cli/plugins-cli.ts:199-255 src/cli/hooks-cli.ts:573-676 That makes “download a package/archive, then install it” a realistic operator action, not an artificial lab setup. The issue is broader than plugin trust. The problem is not “plugins can do bad things once trusted.” The problem is “the installer consumes attacker-controlled package-manager config before trust is established.” That is much closer to an unsafe install / supply-chain execution flaw than to ordinary trusted-plugin behavior. Hooks are affected too. The same installer path is used for hook packs, not only plugins. So this is a shared install-surface issue, not an isolated plugin-runtime concern.
Exploitation Scenario
An attacker publishes or shares a seemingly legitimate OpenClaw plugin or hook pack (e.g., a 'LangChain observability hook' on GitHub). The package contains a .npmrc with git=<path-to-malicious-binary> and a git dependency in package.json. A developer downloads the archive and runs openclaw hooks install ./hook-pack. OpenClaw copies the directory to a staging area without stripping .npmrc, then executes npm install --ignore-scripts. npm reads .npmrc, encounters the git dependency, and calls the attacker's binary instead of the system git — executing arbitrary code with the developer's privileges before the hook is ever loaded or trusted. In a CI/CD context, this could result in credential theft, backdoor installation, or lateral movement into cloud infrastructure.
Weaknesses (CWE)
CVSS Vector
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H References
Timeline
Related Vulnerabilities
CVE-2026-30741 9.8 OpenClaw: RCE via request-side prompt injection
Same package: openclaw CVE-2026-28451 9.3 OpenClaw: SSRF via Feishu extension exposes internal services
Same package: openclaw GHSA-cwj3-vqpp-pmxr 8.8 openclaw: Model bypasses authz to persist unsafe config
Same package: openclaw CVE-2026-27001 7.8 OpenClaw: prompt injection via unsanitized workspace path
Same package: openclaw GHSA-r39h-4c2p-3jxp 7.8 OpenClaw: RCE via malicious repo setup-api.js
Same package: openclaw