Package: release.debian.org
Severity: normal
Tags: trixie
X-Debbugs-Cc: [email protected], 
[email protected], [email protected]
Control: affects -1 + src:mumble
User: [email protected]
Usertags: pu

[ Reason ]
Mumble Trixie is affected by CVE-2025-71264 which is fixed upstream as well
as in Debian Unstable and Testing

[ Impact ]
The Opus codec decoding has a miscalculation for the size of the buffer, and
without patching the decoding can crash and crash the Mumble application when
the audio stream is used for multiple audio channels

[ Tests ]
This bug was found by the Zom.bi community while creating a music bot, and
they found Mumble would crash for some people as the music started playing.
They were able to debug the issue and create a patch which they sent to the
Debian Security Team via email. Upstream examined the patch and created their
own patch, which can be found here:
https://github.com/mumble-voip/mumble/pull/7032
The patch for this proposed upload to Debian Trixie implements these two
upstream commits from pull 7032.

I and upstream both emailed the Zom.bi community at the same email address
that they had used to contact the Debian Security Team to test the patch that
Mumble upstream implemented, but there has been no reply, and I do not have
an automated test available.

[ Risks ]
The risks of implementing this upload to Trixie should be minimal, as the
same patch is now used for Mumble in Unstable and Forky for a few weeks
without any new bugs reported.

[ Checklist ]
  [*] *all* changes are documented in the d/changelog
  [*] I reviewed all changes and I approve them
  [*] attach debdiff against the package in (old)stable
  [*] the issue is verified as fixed in unstable

[ Changes ]
1) Increase the default Opus buffer length from 60ms to 120ms
2) Change the Opus buffer size to be calculated per-channel

[ Other info ]
This is for Debian Bug #1129178
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1129178

Debian security tracker for the bug:
https://security-tracker.debian.org/tracker/CVE-2025-71264

A .debdiff is attached
diff -Nru mumble-1.5.735/debian/changelog mumble-1.5.735/debian/changelog
--- mumble-1.5.735/debian/changelog     2025-06-30 20:19:46.000000000 -0400
+++ mumble-1.5.735/debian/changelog     2026-02-27 14:55:08.000000000 -0500
@@ -1,3 +1,11 @@
+mumble (1.5.735-5+deb13u1) trixie; urgency=medium
+
+  * debian/patches:
+    - Add 95-opus-dos-security.diff to fix crashes Opus buffer overruns
+      leading to crashes (Closes: #1129178)
+
+ -- Christopher Knadle <[email protected]>  Fri, 27 Feb 2026 14:55:08 
-0500
+
 mumble (1.5.735-5) unstable; urgency=medium
 
   * debian/patches:
diff -Nru mumble-1.5.735/debian/patches/95-opus-dos-security.diff 
mumble-1.5.735/debian/patches/95-opus-dos-security.diff
--- mumble-1.5.735/debian/patches/95-opus-dos-security.diff     1969-12-31 
19:00:00.000000000 -0500
+++ mumble-1.5.735/debian/patches/95-opus-dos-security.diff     2026-02-27 
14:52:28.000000000 -0500
@@ -0,0 +1,56 @@
+Description: Fix Opus out-of-bounds array access, which can lead to
+ application crashes
+Author: Robert Adam <[email protected]>
+Origin: https://github.com/mumble-voip/mumble/pull/7032
+Forwarded: not-needed
+Last-Updated: 2026-02-26
+
+--- a/src/mumble/AudioOutputSpeech.cpp
++++ b/src/mumble/AudioOutputSpeech.cpp
+@@ -86,13 +86,14 @@
+                                        OPUS_SET_PHASE_INVERSION_DISABLED(1)); 
// Disable phase inversion for better mono downmix.
+ 
+       // iAudioBufferSize: size (in unit of float) of the buffer used to 
store decoded pcm data.
+-      // For opus, the maximum frame size of a packet is 60ms.
+-      iAudioBufferSize = iSampleRate * 60 / 1000; // = SampleRate * 60ms = 
48000Hz * 0.06s = 2880, ~12KB
++      // For opus, the maximum frame size of a packet is 120ms (the maximum 
duration for a single frame
++      // is 60ms but multiple frames may be bundled into a single packet of a 
duration up to 120ms).
++      iAudioBufferSize = iSampleRate * 120 / 1000; // = SampleRate * 120ms = 
48000Hz * 0.12s = 5760, ~23KB
+ 
+       // iBufferSize: size of the buffer to store the resampled audio data.
+       // Note that the number of samples in each opus packet can be different 
from the number of samples the system
+       // requests from us each time (this is known as the system's audio 
buffer size).
+-      // For example, the maximum size of an opus packet can be 60ms, but the 
system's audio buffer size is typically
++      // For example, the maximum size of an opus packet is 120ms, but the 
system's audio buffer size is typically
+       // ~5ms on my laptop.
+       // Whenever the system's audio callback is called, we have two choice:
+       //  1. Decode a new opus packet. Then we need a buffer to store unused 
samples (which don't fit in the system's
+@@ -101,7 +102,7 @@
+       // How large should this buffer be? Consider the case in which 
remaining samples in the buffer can not fill
+       // the system's audio buffer. In that case, we need to decode a new 
opus packet. In the worst case, the buffer size
+       // needed is
+-      //    60ms of new decoded audio data + system's buffer size - 1.
++      //    120ms of new decoded audio data + system's buffer size - 1.
+       iOutputSize = static_cast< unsigned int >(
+               ceilf(static_cast< float >(iAudioBufferSize * iMixerFreq) / 
static_cast< float >(iSampleRate)));
+       iBufferSize = iOutputSize + systemMaxBufferSize; // -1 has been rounded 
up
+@@ -346,7 +347,8 @@
+                                       // packet normally in order to be able 
to play it.
+                                       decodedSamples = opus_decode_float(
+                                               opusState, qba.isEmpty() ? 
nullptr : reinterpret_cast< const unsigned char * >(qba.constData()),
+-                                              qba.size(), pOut, static_cast< 
int >(iAudioBufferSize), 0);
++                                              static_cast< opus_int32 
>(qba.size()), pOut, static_cast< int >(iAudioBufferSize / channels),
++                                              0);
+                               } else {
+                                       // If the packet is non-empty, but the 
associated user is locally muted,
+                                       // we don't have to decode the packet. 
Instead it is enough to know how many
+@@ -398,7 +400,8 @@
+                               }
+                       } else {
+                               assert(m_codec == 
Mumble::Protocol::AudioCodec::Opus);
+-                              decodedSamples = opus_decode_float(opusState, 
nullptr, 0, pOut, static_cast< int >(iFrameSize), 0);
++                              decodedSamples =
++                                      opus_decode_float(opusState, nullptr, 
0, pOut, static_cast< int >(iFrameSizePerChannel), 0);
+                               decodedSamples *= static_cast< int >(channels);
+ 
+                               if (decodedSamples < 0) {
diff -Nru mumble-1.5.735/debian/patches/series 
mumble-1.5.735/debian/patches/series
--- mumble-1.5.735/debian/patches/series        2025-06-30 20:08:55.000000000 
-0400
+++ mumble-1.5.735/debian/patches/series        2026-02-27 14:44:01.000000000 
-0500
@@ -4,3 +4,4 @@
 45-add-pid-location-hint.diff
 50-fix-segfault-missing-pipewire-config.diff
 90-debianize-systemd-unit.diff
+95-opus-dos-security.diff

Reply via email to