CVE-2026-90015
>_ Opis
Tłumaczenie automatyczne – może zawierać nieścisłości.
W jądrze Linuksa usunięto następującą lukę:
xhci: naprawiono utracone bufory odbić na niszczycielach czołgów obejmujących kilka segmentów pierścienia
Kiedy TD osiągnie łącze TRB z danymi, które nie są dopasowane do
wMaxPacketSize punktu końcowego, xhci_align_td() przygotowuje niewyrównany koniec
przez bufor odbić segmentu pierścieniowego zawierającego to łącze TRB.
xhci_unmap_td_bounce_buffer() później odmapowuje to i, w przypadku transferów IN,
kopiuje dane z powrotem do bufora URB.
Ścieżka kolejkowania rejestruje segment, który został odrzucony w td->bounce_seg,
przy założeniu, że niszczyciel czołgów nigdy nie obejmuje więcej niż dwóch segmentów pierścienia.
To założenie nie jest prawdziwe: niszczyciel czołgów jest wystarczająco duży, aby pomieścić trzy lub więcej
segmenty przechodzą przez kilka łączy TRB i mogą być odbijane w każdym z nich.
Tylko ostatni przetrwa w td->bounce_seg, więc każde wcześniejsze odbicie
bufor nie jest kopiowany z powrotem, ani nie jest mapowane DMA.
URB nadal kończy się rzeczywistą długością równą żądanej długości
i nie ma błędu, więc transfer wygląda na pomyślny, gdy wMaxPacketSize
dziura w buforze docelowym cicho zachowuje poprzednią
zawartość. Wycieka również mapowanie DMA przy każdym upuszczonym odbiciu.
Każdy wystarczająco duży i fragmentaryczny transfer zbiorczy może to uderzyć. To było
znalezione w urządzeniu pamięci masowej USB za xHCI obsługującym wersję dm
target z 512-bajtowymi blokami skrótu, w których wykrywane są raczej nieaktualne dane
niż po cichu skonsumowany. Urządzenie zalicza się do SuperSpeed, czyli tzw
wMaxPacketSize wynosi 1024, podczas gdy dm-bufio wysyła jedno 512-bajtowe bio na każdy skrót
blok. verity_prefetch_io() powoduje, że warstwa bloków łączy ich setki
w jedno żądanie zawierające do 512 wpisów listy rozproszenia po 512 bajtów każdy.
Przy 256 TRB na segment pierścienia, taki niszczyciel czołgów obejmuje trzy segmenty i każdy
granica segmentu przypada na nieparzystą wielokrotność 512, tj. nie jest wyrównana
wMaxPakietRozmiar. dm-bufio następnie buforuje blok mieszający zawierający nieaktualne dane i
dm-verity deklaruje, że blok metadanych jest uszkodzony:
mapowanie urządzeń: prawdziwość: 8:2: blok metadanych 10850 jest uszkodzony
Odtwarzacz obsługujący to pod qemu jest dostępny pod adresem
https://github.com/baloo/xhci-verity
Stan odbicia (bounce_buf, Bounce_dma, Bounce_len, Bounce_offs)
już żyje w segmencie pierścieniowym, więc nie ma nic więcej do śledzenia.
Kontynuuj nagrywanie ostatniego odbitego segmentu w td->bounce_seg i dalej
po zakończeniu przejdź segmentami od td->start_seg do niego, usuwając mapowanie
każdy segment, który nadal ma oczekujące odbicie.
Zatrzymanie się w td->bounce_seg zamiast td->end_seg ma znaczenie: odbicie
oznacza, że TD kontynuuje podróż poza łącze TRB tego segmentu, więc odbijanie_seg jest
zawsze dokładnie przed end_seg, a późniejszy TD mógł już się rozpocząć
w end_seg i został tam odrzucony. Przejście tak daleko skopiowałoby obcego
odbij bufor do tego URB i odmapuj go dwukrotnie. Utrzymuje także spacer
poprawne, jeśli TD kiedykolwiek owinie cały pierścień tak, że end_seg == start_seg.
[mn: Dodaj kontrolę ring->num_segs, aby zapobiec mało prawdopodobnej nieskończonej pętli for.]
>_ Referencje
- https://git.kernel.org/stable/c/3c9a2b5a4f1183696f02ac280ced1d34afb409b1
- https://git.kernel.org/stable/c/43239fc6dfb62c50ae1b9c0e82bac0f8cd2e285c
- https://git.kernel.org/stable/c/7236bbd2cb7d9fc0eda896bbd34790341e2a4377
- https://git.kernel.org/stable/c/a1629dfb011446d02905778f6df19f14c5f4f3b3
- https://git.kernel.org/stable/c/c8124b28f12dbdd126118e63d0ebf8093a01fb81
- https://git.kernel.org/stable/c/e04d5304a248e5d2a7f4faa87541644bdd320cfb
- https://git.kernel.org/stable/c/efaab8938fb92979be6df359f7d1a43fb7e4717d
- https://git.kernel.org/stable/c/ff44dfb03a293bf30e31f98772a1dd316a6071d1
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