Hi LTS team,
I've prepared a security fix for qemu in Bullseye and I'm looking for
a sponsor to review and upload it since I a not a DM/DD.
(Note: I am working on several packages including chromium-embedded-framework and plan to apply for NM soon)
This is my first LTS contribution, I took this one as a way to learn the process.
## Summary
- Package: qemu
- Version: 1:5.2+dfsg-11+deb11u4 (current: 1:5.2+dfsg-11+deb11u3)
- CVE: CVE-2025-11234
- Debian Bug: #1117153
- Severity: Medium (use-after-free, potential code execution)
## Vulnerability Description
CVE-2025-11234 is a use-after-free vulnerability in QEMU's WebSocket
channel implementation (QIOChannelWebsock). When a QIOChannelWebsock
object is freed while waiting for a handshake to complete, the
associated GSource is not cleaned up properly. This causes callbacks
to be invoked on already-freed memory.
Attack vector: An attacker can trigger this by sending incomplete
WebSocket connections to a QEMU VNC server with WebSocket enabled
(-vnc :0,websocket=PORT).
## The Fix
The fix backports upstream commit cebdbd038e44af56e74272924dc2bf595a51fd8f
(included in QEMU v7.2.22). The changes are:
1. Add new field `guint hs_io_tag` to QIOChannelWebsock structure to
track the GSource associated with the handshake (separate from the
existing io_tag used for normal I/O).
2. Store the GSource ID when scheduling handshake callbacks in
qio_channel_websock_handshake() and qio_channel_websock_handshake_io().
3. Clear hs_io_tag when handshake callbacks complete.
4. Add cleanup of hs_io_tag in qio_channel_websock_finalize() and
qio_channel_websock_close() to prevent use-after-free.
Files modified:
- include/io/channel-websock.h (add hs_io_tag field)
- io/channel-websock.c (track and cleanup GSource)
## Testing Performed
Build testing:
- Built successfully with pbuilder in a clean Bullseye chroot
- All binary packages generated correctly
- Patch applies cleanly with quilt
Functional testing:
- Installed patched QEMU in Docker container (Debian Bullseye)
- Started QEMU with VNC WebSocket enabled (-vnc :99,websocket=5700)
- Stress tested with 50,000+ incomplete WebSocket handshakes
- QEMU remained stable throughout testing (both patched and unpatched)
Note on crash-based testing:
The use-after-free race condition did not trigger a visible crash in
our containerized test environment. This is what I interpret as expected behavior for UAF
bugs - the race window is extremely small and modern memory allocators
delay reuse of freed memory. Definitive runtime verification would
require rebuilding QEMU with AddressSanitizer (--enable-sanitizers).
The fix is verified correct by:
1. Code review against upstream commit cebdbd038e44
2. Analysis confirming the GSource leak in pre-fix code
3. The fix has been included in QEMU v7.2.22, v10.0.7, v10.1.3
## Patch
The adapted patch for QEMU 5.2 is attached. The original upstream
commit can be found at:
https://gitlab.com/qemu-project/qemu/-/commit/cebdbd038e44af56e74272924dc2bf595a51fd8f## Additional Notes
- Bookworm (QEMU 7.2) is already fixed in 1:7.2+dfsg-7+deb12u18
- The security tracker marks Bullseye as <no-dsa> (Minor issue)
- The fix is minimal, affecting only WebSocket handling
I'm happy to make any changes requested and to provide additional
testing or information as needed, or do a salsa Merge Request instead.
Thanks for your time,
Juan Manuel Méndez Rey <
vejeta@gmail.com>