CVE-2026-90000
>_ Opis
Tłumaczenie automatyczne – może zawierać nieścisłości.
W jądrze Linuksa usunięto następującą lukę:
HID: rmi: napraw dostęp OOB z niewymiarowymi raportami RMI
Sterownik hid-rmi określa rozmiar bufora writeReport/readReport wyłącznie na podstawie
deskryptor raportu dostarczony przez urządzenie, bez ograniczenia minimalnego:
dane->input_report_size = hid_report_len(input_report);
dane->rozmiar_raportu_wyjściowego = ukryty_raport_len(raport_wyjściowy);
alloc_size = dane->rozmiar_raportu_wyjściowego + dane->rozmiar_raportu_wejściowego;
dane->writeReport = devm_kzalloc(&hdev->dev, alloc_size, GFP_KERNEL);
dane->readReport = dane->writeReport + dane->output_report_size;
ale następnie odczytuje i zapisuje w nim stałe przesunięcia. Urządzenie deklarujące a
1-bajtowy raport wyjściowy i 1-bajtowy raport wejściowy powodują, że funkcja hid_report_len() zwraca wartość 2
dla każdego, więc alloc_size wynosi 4, a rmi_set_page() -- osiągnięto
bezwarunkowo w czasie sondy poprzez rmi_input_configured() -- store
writeReport[4] i rmi_hid_read_block() przechowują writeReport[0..5]. Od
readReport znajduje się w writeReport + Output_report_size, te sklepy również
uszkodzić okno, z którego będzie analizowana następna odpowiedź.
Gorsza jest ścieżka odczytu: długość kopii pochodzi z readReport[1], który
urządzenie się zapełnia i może wynosić do 255, a kopiowanie zaczyna się od
&readReport[2] bez względu na input_report_size, więc przebiega obok
koniec alokacji do sąsiednich obiektów płytowych. To nawet nie
potrzebujesz urządzenia leżącego — rmi_f01_probe() wystawia stały rejestr 21-bajtowy
read, więc każde urządzenie deklarujące raport wejściowy mniejszy niż 23 bajty
czyta poza granicami, nawet jeśli odpowiada zgodnie z prawdą. Te bajty stają się
wartości rejestrów, na które oddziałuje rdzeń RMI: rmi_f01_probe() wypisuje je
log jądra jako identyfikator produktu i eksportuje je w trybie 0444
sysfs o tej samej nazwie, a funkcja rmi_driver_set_irq_bits() wysyła
je z powrotem do urządzenia jako maskę przerwań, więc raport jest za mały
deskryptor wycieka zawartość sterty zarówno do nieuprzywilejowanej przestrzeni użytkownika, jak i do
samo urządzenie.
Ścieżka zapisu również nie jest ograniczona: rmi_hid_write_block() kopiuje plik
nieograniczona długość do &writeReport[4] i największy obiekt wywołujący, jaki może wykonać urządzenie
napędem w czasie próbkowania jest rmi_driver_set_irq_bits(), którego długość wynosi
pochodzące ze źródła przerwań, które urządzenie deklaruje na swojej stronie
Opis Tabela.
Wreszcie pętla odczytu nie może zakończyć się odpowiedzią o zerowej długości: np
odpowiedź niczego nie kopiuje i nie przesuwa ani bajtów_przeczytanych, ani bajtów_potrzebnych,
a ponieważ odpowiedź dotarła, następuje to w ciągu jednej sekundy funkcji Wait_event_timeout().
również nie uruchamia się, więc urządzenie odpowiadające 0 na zawsze utrzymuje pętlę w działaniu
wewnątrz procesu roboczego sondy z wstrzymanym page_mutex. khungtaskd nie
zauważ, bo każda odpowiedź budzi zadanie.
Odrzuć raporty zbyt małe w stosunku do tego, co buduje sterownik — 6 bajtów wyjściowych
dla raportów zapisu i 3 bajty wejściowe dla uzgadniania odczytu – at
czas sondy, zablokuj zapis i kopię odczytu do rozmiarów raportu
zadeklarowane urządzenie i potraktuj odpowiedź o zerowej długości jako błąd. Urządzenie
odrzucony w ten sposób, jest uruchamiany jako zwykłe urządzenie HID, np. takie
w ogóle nie zawiera identyfikatorów raportów RMI.
Nie można pozostawić opcji RMI_DEVICE ustawionej w flagach urządzeń na tej ścieżce, ponieważ
rmi_input_configured() uruchomi następnie konfigurację RMI i osiągnie
rmi_set_page(), która zapisuje w buforze writeReport właśnie odmowę
pominąłem przydzielanie. Bit może zostać ustawiony: rmi_probe() kopiuje
id->driver_data do flag_urządzenia przed sprawdzeniem raportu i powiązaniem
poprzez atrybut new_id sysfs może dostarczyć dane sterownika
RMI_DEVICE (BIT(0)) ustawione. Usuń fragment, w którym kopiowane są dane_sterownika, tzw
RMI_DEVICE nadal oznacza dokładnie „ta sonda zweryfikowała raporty”; the
uwzględniono także trzy skoki na początek, które poprzedzały tę łatkę.
Ścieżka błędu czyści również RMI_READ_DATA_PENDING na wyjściu, ponieważ
ta flaga jest tym, co czeka na testach na górze pętli: pozostawienie jej ustawionej
sprawiłoby, że każde późniejsze Wait_event_timeout() zwróciłoby się natychmiast
nieaktualna odpowiedź i zabicie ścieżki odczytu na resztę życia urządzenia.
Zaciskanie nie powoduje regresji działającego sprzętu: pętla odczytu już
uchwyty
---obcięty---
>_ Referencje
- https://git.kernel.org/stable/c/056ef8e6700b8b6ca11453a9d4bfb1b868a5cd88
- https://git.kernel.org/stable/c/183da103022ec11af55ba9951d2cc171fb6c836b
- https://git.kernel.org/stable/c/48934c2927414a37a7fadeb6091113177c0b2038
- https://git.kernel.org/stable/c/4956993bb3befdf791d71a4952d8d13bcfd44c7b
- https://git.kernel.org/stable/c/a8be8bbf0952bb7ff46636ead1896769c381fe55
- https://git.kernel.org/stable/c/ab2958e0c94edd63315dd14dc548874cc63a4043
- https://git.kernel.org/stable/c/f4cb9c4556dcb593e66dbb855179dbd351dbb053
- https://git.kernel.org/stable/c/fba600d824597b2a894ecae72fc422c2b8c08f8c
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