Medium severity5.3NVD Advisory· Published Apr 23, 2026· Updated Apr 28, 2026
CVE-2026-41335
CVE-2026-41335
Description
OpenClaw before 2026.3.31 contains an information disclosure vulnerability in the Control Interface bootstrap JSON that exposes version and assistant agent identifiers. Attackers can extract sensitive fingerprinting information from the Control UI bootstrap payload to identify system versions and agent configurations.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
openclawnpm | < 2026.3.31 | 2026.3.31 |
Affected products
1Patches
1c5c10adc022fgateway: trim control UI bootstrap payload (#57727)
6 files changed · +10 −16
src/gateway/control-ui-contract.ts+0 −2 modified@@ -4,6 +4,4 @@ export type ControlUiBootstrapConfig = { basePath: string; assistantName: string; assistantAvatar: string; - assistantAgentId: string; - serverVersion?: string; };
src/gateway/control-ui.http.test.ts+4 −3 modified@@ -27,7 +27,6 @@ describe("handleControlUiHttpRequest", () => { basePath: string; assistantName: string; assistantAvatar: string; - assistantAgentId: string; }; } @@ -196,7 +195,8 @@ describe("handleControlUiHttpRequest", () => { expect(parsed.basePath).toBe(""); expect(parsed.assistantName).toBe("</script><script>alert(1)//"); expect(parsed.assistantAvatar).toBe("/avatar/main"); - expect(parsed.assistantAgentId).toBe("main"); + expect(parsed).not.toHaveProperty("assistantAgentId"); + expect(parsed).not.toHaveProperty("serverVersion"); }, }); }); @@ -222,7 +222,8 @@ describe("handleControlUiHttpRequest", () => { expect(parsed.basePath).toBe("/openclaw"); expect(parsed.assistantName).toBe("Ops"); expect(parsed.assistantAvatar).toBe("/openclaw/avatar/main"); - expect(parsed.assistantAgentId).toBe("main"); + expect(parsed).not.toHaveProperty("assistantAgentId"); + expect(parsed).not.toHaveProperty("serverVersion"); }, }); });
src/gateway/control-ui.ts+0 −3 modified@@ -10,7 +10,6 @@ import { import { isWithinDir } from "../infra/path-safety.js"; import { openVerifiedFileSync } from "../infra/safe-open-sync.js"; import { AVATAR_MAX_BYTES } from "../shared/avatar-policy.js"; -import { resolveRuntimeServiceVersion } from "../version.js"; import { DEFAULT_ASSISTANT_IDENTITY, resolveAssistantIdentity } from "./assistant-identity.js"; import { CONTROL_UI_BOOTSTRAP_CONFIG_PATH, @@ -365,8 +364,6 @@ export function handleControlUiHttpRequest( basePath, assistantName: identity.name, assistantAvatar: avatarValue ?? identity.avatar, - assistantAgentId: identity.agentId, - serverVersion: resolveRuntimeServiceVersion(process.env), } satisfies ControlUiBootstrapConfig); return true; }
ui/src/ui/controllers/control-ui-bootstrap.test.ts+6 −4 modified@@ -12,8 +12,6 @@ describe("loadControlUiBootstrapConfig", () => { basePath: "/openclaw", assistantName: "Ops", assistantAvatar: "O", - assistantAgentId: "main", - serverVersion: "2026.3.7", }), }); vi.stubGlobal("fetch", fetchMock as unknown as typeof fetch); @@ -34,8 +32,8 @@ describe("loadControlUiBootstrapConfig", () => { ); expect(state.assistantName).toBe("Ops"); expect(state.assistantAvatar).toBe("O"); - expect(state.assistantAgentId).toBe("main"); - expect(state.serverVersion).toBe("2026.3.7"); + expect(state.assistantAgentId).toBeNull(); + expect(state.serverVersion).toBeNull(); vi.unstubAllGlobals(); }); @@ -59,6 +57,8 @@ describe("loadControlUiBootstrapConfig", () => { expect.objectContaining({ method: "GET" }), ); expect(state.assistantName).toBe("Assistant"); + expect(state.assistantAgentId).toBeNull(); + expect(state.serverVersion).toBeNull(); vi.unstubAllGlobals(); }); @@ -81,6 +81,8 @@ describe("loadControlUiBootstrapConfig", () => { `/openclaw${CONTROL_UI_BOOTSTRAP_CONFIG_PATH}`, expect.objectContaining({ method: "GET" }), ); + expect(state.assistantAgentId).toBeNull(); + expect(state.serverVersion).toBeNull(); vi.unstubAllGlobals(); });
ui/src/ui/controllers/control-ui-bootstrap.ts+0 −3 modified@@ -37,14 +37,11 @@ export async function loadControlUiBootstrapConfig(state: ControlUiBootstrapStat } const parsed = (await res.json()) as ControlUiBootstrapConfig; const normalized = normalizeAssistantIdentity({ - agentId: parsed.assistantAgentId ?? null, name: parsed.assistantName, avatar: parsed.assistantAvatar ?? null, }); state.assistantName = normalized.name; state.assistantAvatar = normalized.avatar; - state.assistantAgentId = normalized.agentId ?? null; - state.serverVersion = parsed.serverVersion ?? null; } catch { // Ignore bootstrap failures; UI will update identity after connecting. }
ui/vite.config.ts+0 −1 modified@@ -50,7 +50,6 @@ export default defineConfig(() => { basePath: "/", assistantName: "", assistantAvatar: "", - assistantAgentId: "", }), ); });
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
6- github.com/openclaw/openclaw/commit/c5c10adc022f42eb75ebb3bf364dd607738683b3nvdPatchWEB
- github.com/advisories/GHSA-hr8g-2q7x-3f4wghsaADVISORY
- github.com/openclaw/openclaw/security/advisories/GHSA-hr8g-2q7x-3f4wnvdVendor AdvisoryWEB
- nvd.nist.gov/vuln/detail/CVE-2026-41335ghsaADVISORY
- www.vulncheck.com/advisories/openclaw-information-disclosure-via-control-ui-bootstrap-jsonnvdThird Party AdvisoryWEB
- github.com/openclaw/openclaw/releases/tag/v2026.3.31ghsaWEB
News mentions
0No linked articles in our index yet.