Odebrany

CVE-2026-98797

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ę:

net: cap skb->queue_mapping, gdy wybrana zostanie kolejka tx

skbedit może ustawić skb->queue_mapping i podnieść skip_txqueue dla każdego procesora
flag, aby funkcja __dev_queue_xmit() honorowała mapowanie. __dev_queue_xmit()
wyczyściłem flagę przed sch_handle_egress() i przeczytałem ją dopiero później,
więc flaga nie była ograniczona do xmit, który ją ustawił: zagnieżdżony xmit
(mirred przekierowanie lub lustro lub upuszczenie po skbedit) może ustawić flagę
a zewnętrzny xmit zużyłby go na skb, który nigdy nie przeszedł
skbedit.

Przesłany pakiet nadal niesie ze sobą rx_queue wejściowej karty sieciowej + 1 cal
skb->queue_mapping, więc urządzenie zewnętrzne następnie indeksuje stan swojej kolejki tx
z tą przestarzałą wartością. Tablica podrzędna Taprio q->qdiscs[] ma rozmiar
liczba kolejek urządzenia, więc taprio_enqueue() indeksuje poza przydziałem
i wyłudza wynik jako strukturę Qdisc *.

Używamy (ab) skb->nf_skip_egress, co oznacza „pomiń wyjście netfilter
dla tego pakietu” oznaczyć tagiem „Czy jestem na wyjściu z połączenia?”. Pomimo przeciążenia
Nie postrzegam tego jako konfliktu, ponieważ znacznik jest ustawiony tylko wokół
pojedyncze wywołanie sch_handle_egress() i ścieżka ingresu są strzeżone
tc_at_ingress.
Wyślę kolejną łatkę (net-next), gdy trafi ona do sieci obok
zmień nazwę bitu/flagi skb->nf_skip_egress na skb->skip_egress

Uzbrój flagę tylko z klasyfikatora wyjściowego, który może z niej korzystać: podnieś
skip_txqueue z tcf_skbedit_act() tylko wtedy, gdy działa wewnątrz
sch_handle_egress(), dzięki skb->nf_skip_egress. Kolejka wyjściowa
klasyfikator działa w q->enqueue(), po wybraniu kolejki tx,
więc ustawione przez niego mapowanie nie może mieć wpływu na bieżący pakiet; uzbrojenie flagi
zanieczyszcza to tylko do późniejszego xmit. Następnie zdobądź flagę dla xmit
ramka, w której działa hak wyjściowy: zapisz przychodzącą wartość i po prostu ją wyczyść
przed sch_handle_egress() i przywróć go po haku - na
zużyta (upuszczona) ścieżka lub w tym samym wywołaniu, które ją odczytuje, na ścieżce
ocalała ścieżka. Zapis i przywracanie pozostają w pliku
egress_needed_key gałąź statyczna, więc pakiet płaci za nie tylko wtedy, gdy
haki wyjściowe są aktywne (2f1e85b1aee4).

Zapisz wybraną wartość netdev_cap_txqueue() z powrotem w skb->queue_mapping
w netdev_tx_queue_mapping(), ponieważ netdev_core_pick_tx() już to robi, więc
ścieżka skip_txqueue nigdy nie udostępnia późniejszego czytnika na ścieżce xmit a
mapowanie urządzenia nie może służyć. Sklep wykonany jeszcze później w tym samym
ramka, przez program tc BPF dołączony do kolejki nadawczej, znajduje się poza nią
ścieżka i nie jest ponownie ograniczona; osobna kontynuacja rozwiąże tę ścieżkę.

netdev_xmit_skip_txqueue() zwraca poprzednią wartość flagi, więc
zapisanie i wyczyszczenie to jedno wywołanie, a gdy zostanie wyświetlony komunikat o braku operacji
CONFIG_NET_EGRESS jest wyłączony. skb->nf_skip_egress jest kompilowany w ramach
CONFIG_NET_EGRESS zamiast CONFIG_NETFILTER_SKIP_EGRESS, więc
skb_at_tc_egress() jest poprawna zawsze, gdy budowana jest ścieżka wyjścia.

Użytkownik lokalny w sieciowej przestrzeni nazw może przekierować pakiet z urządzenia
z większą liczbą kolejek TX na kolejkę z mniejszą liczbą po ustawieniu tylko prawidłowego mapowania
na większym urządzeniu. Dochodzi do tych odczytów i pod KASAN-em błędów
z „płytą poza granicami w taprio_enqueue”.

Warunki odtworzenia błędu: wyzwalaczem raportu jest użytkownik lokalny
z CAP_NET_ADMIN w sieciowej przestrzeni nazw, więc nie jest potrzebny żaden program eBPF.
Przy CONFIG_NET_SCH_TAPRIO=y, CONFIG_NET_ACT_SKBEDIT=y,
CONFIG_NET_ACT_MIRRED=y, CONFIG_NET_CLS_MATCHALL=y,
CONFIG_NET_SCH_PRIO=y i KASAN włączone, utwórz qa (3 kolejki), qb
(2 kolejki) i qc (1 kolejka) jako urządzenia fikcyjne; umieść korzeń taprio na qb
(num_tc 1, kolejki 2@0) i clsact na wszystkich trzech; następnie dodaj wyjście
filtr matchall na każdym urządzeniu. Na qa: „akcja skbedit kolejka_mapping 2
akcja potokowa mirred przekierowanie wyjścia dev qb”. Na qb: „akcja odzwierciedlała wyjście
Mirror Dev QC”. Na qc: „akcja skbedit kolejka_mapping 0 potok”. Wyślij jednego
pakiet wysłany q. skbedit qc ustawia flagę, gdy zewnętrzny xmit qb jest włączony
lot; bez poprawki qb zużywa go i odczytuje taprio z dwoma wpisami
tablica podrzędna z nieaktualnym mapowaniem przekazanego pakietu. QC, którego
skb
---obcięty---

>_ 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