Odebrany

CVE-2026-93164

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

uprobe/x86: Przenieś zoptymalizowaną wersję uprobe z nop5 do nop10

Andrii zgłosił problem ze zoptymalizowanymi próbami [1], które mogą stukać
obszar czerwonej strefy z instrukcją wywołania przechowującą adres zwrotny na stosie
gdzie kod użytkownika może przechowywać dane tymczasowe bez dostosowywania rsp.

Naprawienie tego poprzez przeniesienie zoptymalizowanych uprobów na 10-bajtowe nie
instrukcję, abyśmy mogli wycisnąć kolejną instrukcję, aby uciec z
obszar czerwonej strefy przed wykonaniem połączenia, np.:

lea -0x80(%rsp), %rsp
zadzwoń do trampa

Należy zauważyć, że instrukcja lea służy do regulacji rejestru rsp bez
zmiana flag.

Używamy nop10 i następującej transformacji do zoptymalizowanych instrukcji
w górę i w tył, jak sugeruje Peterz [2].

Zoptymalizuj ścieżkę (int3_update_optimize):

1) Stan początkowy po zainstalowaniu uprobe przez set_swbp():
cc 2e 0f 1f 84 00 00 00 00 00

Od przesunięcia 0 jest to INT3, po którym następuje koniec oryginału
10-bajtowy NOP.

Po poprzedniej deoptymalizacji bajty 5..9 mogą nadal zawierać
stara instrukcja wywołania, która pozostaje ważna dla już istniejących wątków.

2) Przepisz ogon LEA i wywołaj przemieszczenie:
cc [8d 64 24 80 e8 d0 d1 d2 d3]

Od offsetu 0 powoduje to pułapkę na uprobe INT3. Bajty 1..9 nie są
wykonywalnych punktów wejścia, podczas gdy bajt 0 jest uwięziony.

3) Opublikuj pierwszy bajt LEA:
[48] 8d 64 24 80 e8 d0 d1 d2 d3

Od offsetu 0 jest to:
lea -0x80(%rsp), %rsp
wywołaj <uprobe-trampolina>

Nieoptymalizuj ścieżkę (int3_update_unoptimize):

1) Początkowy stan zoptymalizowany:
48 8d 64 24 80 e8 d0 d1 d2 d3
Tak samo jak 3) powyżej.

2) Przechwytuj nowe wpisy przed przywróceniem bajtów NOP:
[cc] 8d 64 24 80 e8 d0 d1 d2 d3

Od offsetu 0 powoduje to pułapkę. Wątek, który już wykonał
LEA może nadal osiągnąć nienaruszony CALL na przesunięciu 5.

3) Przywróć bajty 1..4 oryginalnego NOP, pozostawiając bajt 0 w pułapce
i bajt 5 jako CALL.
cc [2e 0f 1f 84] e8 d0 d1 d2 d3

Od offsetu 0 to nadal powoduje pułapki. Offset 5 jest nadal WEZWANIEM dla każdego
wątek, który przekroczył już pierwszy bajt LEA.

4) Opublikuj pierwszy bajt oryginalnego NOP:
[66] 2e 0f 1f 84 e8 d0 d1 d2 d3

Od offsetu 0 jest to przywrócony 10-bajtowy NOP; kod operacji CALL i
przemieszczenie są teraz tylko operandami NOP. Offset 5 nadal dekoduje jako
ZADZWOŃ, aby wywołać wątek, który już tam był.

Dla danego nop10 istnieje tylko jedna docelowa trampolina typu uprobe
adres instrukcji, więc instrukcja CALL nie zostanie zmieniona
cykle niezoptymalizacji/optymalizacji.
Dlatego każde zadanie, które zostanie wywłaszczone instrukcją CALL, jest gwarantowane
obserwować to WEZWANIE i nic innego.

Uwaga, jak wyjaśniono w [2], musimy użyć następującego nop10:
PF1 PF2 ESC NOPL MOD SIB DISP32
NOP10: 0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 -- cs nopw 0x00000000(%rax,%rax,1)

co oznacza, że musimy zezwolić na przedrostek 0x2e, który jest mapowany na INAT_PFX_CS
atrybut w funkcji is_prefix_bad.

Zmienia się także błąd wywołania systemowego uprobe, gdy jest wywoływany z uprobe
trampolina na -EPROTO, dzięki czemu jesteśmy w stanie wykryć naprawione jądro.

Zoptymalizowana wydajność uprobe pozostaje taka sama:

uprobe-nop: 3,129 ± 0,013 M/s
uprobe-push: 3,045 ± 0,006 M/s
uprobe-ret: 1,095 ± 0,004 M/s
--> uprobe-nop10: 7,170 ± 0,020 M/s
uretprobe-nop: 2,143 ± 0,021 M/s
Uretprobe-push: 2,090 ± 0,000 M/s
uretprobe-ret: 0,942 ± 0,000 M/s
--> uretprobe-nop10: 3,381 ± 0,003 M/s
usdt-nop: 3,245 ± 0,004 M/s
--> usdt-nop10: 7,256 ± 0,023 M/s

[1] https://lore.kernel.org/bpf/[email protected]/
[2] https://lore.kernel.org/bpf/[email protected]/#t

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