VYPR
Moderate severityNVD Advisory· Published Mar 19, 2026· Updated Mar 20, 2026

OpenClaw < 2026.2.22 - Node Role Device-Identity Bypass via WebSocket Authentication

CVE-2026-32001

Description

OpenClaw versions prior to 2026.2.22 contain an authentication bypass vulnerability that allows clients authenticated with a shared gateway token to connect as role=node without device identity verification. Attackers can exploit this by claiming the node role during WebSocket handshake to inject unauthorized node.event calls, triggering agent.request and voice.transcript flows without proper device pairing.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
openclawnpm
< 2026.2.222026.2.22

Affected products

1

Patches

1
ddcb2d79b17b

fix(gateway): block node role when device identity is missing

https://github.com/openclaw/openclawPeter SteinbergerFeb 21, 2026via ghsa
3 files changed · +24 1
  • CHANGELOG.md+1 0 modified
    @@ -125,6 +125,7 @@ Docs: https://docs.openclaw.ai
     - Gateway/Security: remove shared-IP fallback for canvas endpoints and require token or session capability for canvas access. Thanks @thewilloftheshadow.
     - Gateway/Security: require secure context and paired-device checks for Control UI auth even when `gateway.controlUi.allowInsecureAuth` is set, and align audit messaging with the hardened behavior. (#20684) Thanks @coygeek and @Vasco0x4 for reporting.
     - Gateway/Security: scope tokenless Tailscale forwarded-header auth to Control UI websocket auth only, so HTTP gateway routes still require token/password even on trusted hosts. Thanks @zpbrent for reporting.
    +- Gateway/Security: require device identity for `role: node` websocket connections even when shared-token auth succeeds, preventing unpaired device-less clients from invoking `node.event`. Thanks @tdjackey for reporting.
     - Docker/Security: run E2E and install-sh test images as non-root by adding appuser directives. Thanks @thewilloftheshadow.
     - Skills/Security: sanitize skill env overrides to block unsafe runtime injection variables and only allow sensitive keys when declared in skill metadata, with warnings for suspicious values. Thanks @thewilloftheshadow.
     - Security/Commands: block prototype-key injection in runtime `/debug` overrides and require own-property checks for gated command flags (`bash`, `config`, `debug`) so inherited prototype values cannot enable privileged commands. Thanks @tdjackey for reporting.
    
  • src/gateway/server.auth.e2e.test.ts+22 0 modified
    @@ -363,6 +363,28 @@ describe("gateway server auth/connect", () => {
           await expectMissingScopeAfterConnect(port, { device: null });
         });
     
    +    test("rejects node role when device identity is omitted", async () => {
    +      const ws = await openWs(port);
    +      const token = resolveGatewayTokenOrEnv();
    +      try {
    +        const res = await connectReq(ws, {
    +          role: "node",
    +          token,
    +          device: null,
    +          client: {
    +            id: GATEWAY_CLIENT_NAMES.NODE_HOST,
    +            version: "1.0.0",
    +            platform: "test",
    +            mode: GATEWAY_CLIENT_MODES.NODE,
    +          },
    +        });
    +        expect(res.ok).toBe(false);
    +        expect(res.error?.message ?? "").toContain("device identity required");
    +      } finally {
    +        ws.close();
    +      }
    +    });
    +
         test("allows health when scopes are empty", async () => {
           const ws = await openWs(port);
           try {
    
  • src/gateway/server/ws-connection/message-handler.ts+1 1 modified
    @@ -490,7 +490,7 @@ export function attachGatewayWsMessageHandler(params: {
                 return true;
               }
               clearUnboundScopes();
    -          const canSkipDevice = sharedAuthOk;
    +          const canSkipDevice = role === "operator" && sharedAuthOk;
     
               if (isControlUi && !controlUiAuthPolicy.allowBypass) {
                 const errorMessage =
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

5

News mentions

0

No linked articles in our index yet.