Linux: ALSA: ua101: reject mismatched capture/playback packet sizes
What fixes it
- 4294fe57048594a9e158b61c967bb7f943cda477LinuxCVE List
- 86f86e6fdedc33c5b8d38b9208b350f8accf57eeLinuxCVE List
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
In the Linux kernel, the following vulnerability has been resolved:
ALSA: ua101: reject mismatched capture/playback packet sizes
detect_usb_format() cross-checks bSubframeSize, bBitResolution and tSamFreq between the capture and playback interfaces, but never relates the two endpoints' wMaxPacketSize and bNrChannels. Each playback URB gets a buffer of ua->playback.max_packet_bytes, while the number of bytes written into it is derived from the capture stream: capture_urb_complete() computes frames from the received capture packet and capture.frame_bytes, and start_usb_playback() and playback_work() multiply that by playback.frame_bytes.
A device declaring a large capture wMaxPacketSize with few capture channels and a small playback wMaxPacketSize with many playback channels therefore memset()s and memcpy()s past the end of the playback buffer, in open() of the PCM node the driver registers during probe. usb_submit_urb() rejects the over-long iso_frame_desc[0].length with -EMSGSIZE, but only after the write.
Reject such descriptors at probe time. Genuine UA-101/UA-1000 hardware declares proportional packet sizes and is unaffected.
BUG: KASAN: slab-out-of-bounds in start_usb_playback (sound/usb/misc/ua101.c:586) Write of size 2048 at addr ffff8881098f3c00 by task exploit/5021 Call Trace: __asan_memset (mm/kasan/shadow.c:84) start_usb_playback (sound/usb/misc/ua101.c:586) playback_pcm_open (sound/usb/misc/ua101.c:679) snd_pcm_open_substream (sound/core/pcm_native.c:2829) snd_pcm_open (sound/core/pcm_native.c:2865 sound/core/pcm_native.c:2932) snd_pcm_playback_open (sound/core/pcm_native.c:2891) snd_open (sound/core/sound.c:166) chrdev_open (fs/char_dev.c:411) do_dentry_open (fs/open.c:996) vfs_open (fs/open.c:1101) path_openat (fs/namei.c:4837 fs/namei.c:5000) do_file_open (fs/namei.c:5029) do_sys_openat2 (fs/open.c:1417) __x64_sys_openat (fs/open.c:1423 fs/open.c:1439 fs/open.c:1434) do_syscall_64 (arch/x86/entry/syscall_64.c:61 arch/x86/entry/syscall_64.c:84) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
The buggy address belongs to the object at ffff8881098f3c00 which belongs to the cache kmalloc-192 of size 192 The buggy address is located 0 bytes inside of allocated 168-byte region [ffff8881098f3c00, ffff8881098f3ca8)
Text from CVE List
Affected versions 12
- Linuxaffected: 63978ab3e3e963db28093b53bb4598f2702e1ad7 before ada5ded765f059a6e3036e69ca350449442af0fcCVE List
- Linuxaffected: 63978ab3e3e963db28093b53bb4598f2702e1ad7 before fd3a7bf0d988b0878a1957df150edb35f81db87eCVE List
- Linuxaffected: 63978ab3e3e963db28093b53bb4598f2702e1ad7 before eb0c7fda59cf650076f8ed5b949a6c8441aa3606CVE List
- Linuxaffected: 63978ab3e3e963db28093b53bb4598f2702e1ad7 before 4294fe57048594a9e158b61c967bb7f943cda477CVE List
- Linuxaffected: 63978ab3e3e963db28093b53bb4598f2702e1ad7 before 86f86e6fdedc33c5b8d38b9208b350f8accf57eeCVE List
- Linuxaffected: 2.6.34CVE List
- Linuxunaffected: all versions before 2.6.34CVE List
- Linuxunaffected: 6.6.160 through 6.6.*CVE List
- Linuxunaffected: 6.12.113 through 6.12.*CVE List
- Linuxunaffected: 6.18.56 through 6.18.*CVE List
- Linuxunaffected: 7.2.10 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List
References 5
- git.kernel.org/stable/c/ada5ded765f059a6e3036e69ca350449442af0fcReferencevia CVE List
- git.kernel.org/stable/c/fd3a7bf0d988b0878a1957df150edb35f81db87eReferencevia CVE List
- git.kernel.org/stable/c/eb0c7fda59cf650076f8ed5b949a6c8441aa3606Referencevia CVE List
- git.kernel.org/stable/c/4294fe57048594a9e158b61c967bb7f943cda477Referencevia CVE List
- git.kernel.org/stable/c/86f86e6fdedc33c5b8d38b9208b350f8accf57eeReferencevia CVE List