Medium severity5.3NVD Advisory· Published Apr 28, 2026· Updated Apr 30, 2026
CVE-2026-41374
CVE-2026-41374
Description
OpenClaw before 2026.3.31 performs Discord audio preflight transcription before validating member authorization, allowing unauthenticated attackers to consume resources. Remote attackers can trigger audio preflight processing without member allowlist validation to cause resource exhaustion.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
openclawnpm | < 2026.3.31 | 2026.3.31 |
Affected products
1Patches
1ee52f64226a0Discord: gate audio preflight on member access (#57695)
2 files changed · +75 −15
extensions/discord/src/monitor/message-handler.preflight.test.ts+60 −0 modified@@ -765,6 +765,66 @@ describe("preflightDiscordMessage", () => { expect(result?.wasMentioned).toBe(true); }); + it("does not transcribe guild audio from unauthorized members", async () => { + const channelId = "channel-audio-unauthorized-1"; + const guildId = "guild-audio-unauthorized-1"; + const client = createGuildTextClient(channelId); + + const message = createDiscordMessage({ + id: "m-audio-unauthorized-1", + channelId, + content: "", + attachments: [ + { + id: "att-1", + url: "https://cdn.discordapp.com/attachments/voice.ogg", + content_type: "audio/ogg", + filename: "voice.ogg", + }, + ], + author: { + id: "user-2", + bot: false, + username: "Mallory", + }, + }); + + const result = await preflightDiscordMessage({ + ...createPreflightArgs({ + cfg: { + ...DEFAULT_PREFLIGHT_CFG, + messages: { + groupChat: { + mentionPatterns: ["openclaw"], + }, + }, + } as import("openclaw/plugin-sdk/config-runtime").OpenClawConfig, + discordConfig: {} as DiscordConfig, + data: createGuildEvent({ + channelId, + guildId, + author: message.author, + message, + }), + client, + }), + guildEntries: { + [guildId]: { + channels: { + [channelId]: { + allow: true, + requireMention: true, + users: ["user-1"], + }, + }, + }, + }, + }); + + expect(transcribeFirstAudioMock).not.toHaveBeenCalled(); + expect(result).toBeNull(); + }); + it("drops guild message without mention when channel has configuredBinding and requireMention: true", async () => { const conversationRuntime = await import("openclaw/plugin-sdk/conversation-runtime"); const channelId = "ch-binding-1";
extensions/discord/src/monitor/message-handler.preflight.ts+15 −15 modified@@ -679,9 +679,22 @@ export async function preflightDiscordMessage( shouldRequireMention: shouldRequireMentionByConfig, bypassMentionRequirement, }); + const { hasAccessRestrictions, memberAllowed } = resolveDiscordMemberAccessState({ + channelConfig, + guildInfo, + memberRoleIds, + sender, + allowNameMatching, + }); + + if (isGuildMessage && hasAccessRestrictions && !memberAllowed) { + logDebug(`[discord-preflight] drop: member not allowed`); + // Keep stable Discord user IDs out of routine deny-path logs. + logVerbose("Blocked discord guild sender (not in users/roles allowlist)"); + return null; + } - // Preflight audio transcription for mention detection in guilds. - // This allows voice notes to be checked for mentions before being dropped. + // Only authorized guild senders should reach the expensive transcription path. const { hasTypedText, transcript: preflightTranscript } = await resolveDiscordPreflightAudioMentionContext({ message, @@ -725,13 +738,6 @@ export async function preflightDiscordMessage( surface: "discord", }); const hasControlCommandInMessage = hasControlCommand(baseText, params.cfg); - const { hasAccessRestrictions, memberAllowed } = resolveDiscordMemberAccessState({ - channelConfig, - guildInfo, - memberRoleIds, - sender, - allowNameMatching, - }); if (!isDirectMessage) { const { ownerAllowList, ownerAllowed: ownerOk } = resolveDiscordOwnerAccess({ @@ -834,12 +840,6 @@ export async function preflightDiscordMessage( return null; } - if (isGuildMessage && hasAccessRestrictions && !memberAllowed) { - logDebug(`[discord-preflight] drop: member not allowed`); - logVerbose(`Blocked discord guild sender ${sender.id} (not in users/roles allowlist)`); - return null; - } - const systemLocation = resolveDiscordSystemLocation({ isDirectMessage, isGroupDm,
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/ee52f64226a03efadfdf1e3b759e13424a3d4e41nvdPatchWEB
- github.com/advisories/GHSA-hhff-fj5f-qg48ghsaADVISORY
- github.com/openclaw/openclaw/security/advisories/GHSA-hhff-fj5f-qg48nvdVendor AdvisoryWEB
- nvd.nist.gov/vuln/detail/CVE-2026-41374ghsaADVISORY
- www.vulncheck.com/advisories/openclaw-resource-consumption-via-discord-audio-preflight-before-member-authorizationnvdThird Party AdvisoryWEB
- github.com/openclaw/openclaw/releases/tag/v2026.3.31ghsaWEB
News mentions
0No linked articles in our index yet.