VYPR
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.

PackageAffected versionsPatched versions
openclawnpm
< 2026.3.312026.3.31

Affected products

1
  • cpe:2.3:a:openclaw:openclaw:*:*:*:*:*:node.js:*:*
    Range: <2026.3.31

Patches

1
ee52f64226a0

Discord: gate audio preflight on member access (#57695)

https://github.com/openclaw/openclawJacob TomlinsonMar 30, 2026via ghsa
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

News mentions

0

No linked articles in our index yet.