CVE-2026-104480 Overview
Discord libdave versions prior to 1.2.0 fail to reject Messaging Layer Security (MLS) Welcome messages when the resulting group roster contains an unrecognized participant. The library is the C++ reference implementation of the Discord Audio & Video End-to-End Encryption (DAVE) protocol used to protect voice and video calls.
An attacker positioned on the DAVE signaling path, such as a compromised or malicious voice gateway, can inject an unauthorized member into an end-to-end encrypted media session. Affected clients will accept the roster and derive media keys that the attacker-controlled participant also holds, breaking confidentiality and integrity of the call.
Critical Impact
Silent eavesdropping and tampering of end-to-end encrypted audio and video sessions negotiated through libdave prior to version 1.2.0.
Affected Products
- Discord libdave (C++) versions prior to 1.2.0
- Applications and clients embedding the DAVE protocol reference implementation
- Voice and video sessions negotiated through a Discord-compatible voice gateway
Discovery Timeline
- 2026-10-02 - CVE-2026-104480 published to the National Vulnerability Database
- 2026-10-02 - libdave v1.2.0 released with commit 9686fba restoring strict Welcome validation
- 2026-10-02 - Last updated in NVD database
Technical Details for CVE-2026-104480
Vulnerability Analysis
The DAVE protocol layers MLS group key agreement on top of Discord's voice signaling to protect audio and video streams. When a new participant is added, the voice gateway distributes an MLS Welcome message, and recipients validate the proposed group roster against the set of user IDs the gateway has announced as members of the call.
In vulnerable builds of libdave, the roster check in cpp/src/mls/session.cpp was downgraded to a log-only warning. The code iterated over leaves in the welcomed group state and called IsRecognizedUserID against the recognized user ID set, but no longer returned false when the check failed. The session was accepted regardless.
This category of flaw is tracked as [CWE-390] Detection of Error Condition Without Action. The validation primitive executed correctly; the response to a negative result was removed, allowing an unauthorized leaf to persist in the finalized MLS group.
Root Cause
A prior change relaxed the strict Welcome validation to work around race conditions where in-flight add proposals could reference participants who had already disconnected. The workaround left the comparison in place but commented out the return false and the error-tracking call, converting a security check into a diagnostic log line.
Attack Vector
Exploitation requires control of the DAVE signaling path. A malicious or compromised voice gateway, or an on-path attacker able to add, alter, or withhold signaling messages, crafts an MLS Welcome whose roster includes an attacker-controlled leaf not present in the recognized user ID set. Vulnerable clients process the Welcome, derive shared MLS epoch secrets, and admit the attacker leaf as a legitimate media peer. The attacker then receives decrypted audio and video and can inject media that other participants accept as authentic.
return false;
}
- // TODO: Until we leverage revocation in the protocol
- // if we re-enable this change we will refuse welcome messages
- // because someone was previously supposed to be added but disconnected
- // before all in-flight proposals were handled.
-
for (const auto& leaf : state.roster()) {
if (!IsRecognizedUserID(leaf.credential, recognizedUserIDs)) {
DISCORD_LOG(LS_ERROR) << "MLS welcome lists unrecognized user ID";
- // TRACK_MLS_ERROR("Welcome message lists unrecognized user ID");
- // return false;
+ TRACK_MLS_ERROR("Welcome message lists unrecognized user ID");
+ return false;
}
}
Source: GitHub libdave Commit 9686fba. The patch re-enables the error tracker and the return false so unrecognized leaves cause the Welcome to be rejected.
Detection Methods for CVE-2026-104480
Indicators of Compromise
- Client logs containing the string MLS welcome lists unrecognized user ID emitted by vulnerable libdave builds.
- MLS epoch transitions whose participant list does not match the roster announced by the voice gateway for the same session.
- DAVE sessions negotiated against gateways or proxies not operated by the expected service provider.
Detection Strategies
- Inventory applications that bundle libdave and flag builds reporting a version earlier than 1.2.0.
- Correlate client-side DAVE session logs with gateway membership events to surface roster mismatches.
- Alert on unexpected MLS Welcome acceptance events where the recognized user ID list and the committed roster differ.
Monitoring Recommendations
- Forward DAVE and MLS client diagnostics to a centralized logging pipeline for retention and search.
- Monitor outbound TLS connections from voice-enabled applications for unexpected destinations acting as gateways.
- Baseline normal voice session participant counts per channel and alert on silent additions.
How to Mitigate CVE-2026-104480
Immediate Actions Required
- Upgrade all consumers of libdave to version 1.2.0 or later and rebuild dependent applications.
- Push updated Discord client builds that embed the fixed libdave to all users and enforce minimum-version policies.
- Audit any custom DAVE signaling infrastructure to confirm it is operated and authenticated as expected.
Patch Information
The fix is included in GitHub libdave Release v1.2.0 and shipped through commit 9686fba to cpp/src/mls/session.cpp. The patch restores the strict rejection path for MLS Welcome messages whose roster contains unrecognized user IDs. Reference material for the broader protocol is available on the Dave Protocol Homepage and the GitHub libdave Repository.
Workarounds
- Restrict voice and video usage to clients confirmed to run libdave1.2.0 or later until all endpoints are patched.
- Where feasible, require participants to visually or verbally confirm expected attendees before sharing sensitive content on calls.
- Treat session audio and video as confidential-at-gateway-trust-level until clients are updated, since the gateway can admit extra members.
# Verify the libdave version linked into a build
git -C libdave describe --tags
# Expected output: v1.2.0 or later
# Rebuild against the fixed release
git -C libdave fetch --tags
git -C libdave checkout v1.2.0
cmake -S libdave/cpp -B build && cmake --build build
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

