Odebrany

CVE-2026-80970

opublikowano:
modyfikacja:
Ocena CVSS
n/a
Brak oceny

>_ Opis

Tłumaczenie automatyczne – może zawierać nieścisłości.

W jądrze Linuksa usunięto następującą lukę:

ALSA: FCP: nie kopiuj niezainicjowanej odpowiedzi inicjującej

fcp_ioctl_init() przydziela swój bufor odpowiedzi za pomocą kmalloc() i kopiuje
cały bufor z powrotem do przestrzeni użytkownika:

buf_size = init.step0_resp_size + init.step2_resp_size;

void *resp __free(kfree) =
kmalloc(rozmiar_buf, GFP_KERNEL);
...
if (copy_to_user(arg->resp, resp, buf_size))
powrót -EFAULT;

Nic nie czyści bufora i jest jedynym zapisem jego wiodącym
step0_resp_size bytes to transfer kontrolny kroku 0:

err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
FCP_USB_REQ_STEP0,
USB_RECIP_INTERFACE | KLASA_TYPU USB | USB_DIR_IN,
0, prywatny->bNumerInterfejsu,
step0_resp, prywatny->step0_resp_size);
jeśli (błąd < 0)
zwróć błąd;

usb_fill_control_urb() nie ustawia URB_SHORT_NOT_OK, więc krótka lub
Etap danych o zerowej długości kończy się statusem 0 i funkcją snd_usb_ctl_msg()
zwraca małą rzeczywistą długość. Jedynym sprawdzeniem jest err < 0, więc krótki
transfer uznajemy za sukces.

snd_usb_ctl_msg() bezwarunkowo kopiuje pełny rozmiar:

buf = kmemdup(dane, rozmiar, GFP_KERNEL);
...
memcpy(dane, buf, rozmiar);

Bajty, których urządzenie nigdy nie zapisał, są zatem przywracane lub niezmienione
i skopiowane do przestrzeni użytkownika. step0_resp_size i step2_resp_size to oba
sprawdzane tylko do 1..255, więc osoba wywołująca wybiera również pamięć podręczną płyty z
kmalloc-8 do kmalloc-512.

W wersji 7.2.0-rc5 (arm64) urządzenie odpowiada na krok 0 z danymi o zerowej długości
etap, s0 = s2 = 255:

# init_on_alloc wyłączony, bez sprayu
okno step0 [0,255): niezerowe=94/255
000: 00 80 60 06 00 00 ff ff 18 00 00 00 57 01 ea 01
010: 08 78 22 13 00 00 ff ff a8 c4 5f 80 00 80 ff ff

# to samo jądro, kmalloc-512 wstępnie zaszczepione 8-bajtowym znacznikiem
okno step0 [0,255): niezerowe=219/255 tagbajtów=232

# identyczne uruchomienie, init_on_alloc=1
okno step0 [0,255): niezerowe=0/255 tagbytes=0

# wszystkie trzy biegi
okno kroku 2 [255,510): dopasowane słowa urządzenia = 62/62

a8 c4 5f 80 00 80 ff ff to adres tekstowy jądra Little-Endian
ffff8000805fc4a8. Okno kroku 2 pozostaje niezmienione, więc ujawnienie tak
dokładnie obszar kroku 0.

Wyzeruj bufor i wymagaj transferu z krokiem 0, aby dostarczyć całość
step0_resp_size bajtów, więc krótki etap danych jest zgłaszany jako błąd.

Odkryte przez XBOW, sprawdzone przez Baula Lee <[email protected]>

>_ Referencje

Dane podatności pochodzą z oficjalnych źródeł (CVE® List / NVD). Opisy po polsku są tłumaczone automatycznie i mogą zawierać nieścisłości – na stronie rekordu można wyświetlić wersję angielską.

This product uses the NVD API but is not endorsed or certified by the NVD.

Copyright © 1999–2026, The MITRE Corporation. CVE is a registered trademark and the CVE logo is a registered trademark of The MITRE Corporation.

CVE Usage: MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE®). Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ALL DOCUMENTS AND THE INFORMATION CONTAINED THEREIN PROVIDED BY MITRE ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.

NVD Terms of Use / CVE® Terms of Use / nvd.nist.gov / cve.org