Podatność w podsystemie nvmet jądra Linux powoduje awarię systemu (crash) podczas wyłączania przestrzeni nazw NVMe-oF, gdy nadal trwają operacje I/O. Błąd wynika z braku właściwej synchronizacji licznika percpu, co prowadzi do dostępu do już zwolnionych zasobów kolejki blokowej.
▸ Pokaż oryginał (EN)
In the Linux kernel, the following vulnerability has been resolved: nvmet: Fix crash when a namespace is disabled The namespace percpu counter protects pending I/O, and we can only safely diable the namespace once the counter drop to zero. Otherwise we end up with a crash when running blktests/nvme/058 (eg for loop transport): [ 2352.930426] [ T53909] Oops: general protection fault, probably for non-canonical address 0xdffffc0000000005: 0000 [#1] PREEMPT SMP KASAN PTI [ 2352.930431] [ T53909] KASAN: null-ptr-deref in range [0x0000000000000028-0x000000000000002f] [ 2352.930434] [ T53909] CPU: 3 UID: 0 PID: 53909 Comm: kworker/u16:5 Tainted: G W 6.13.0-rc6 #232 [ 2352.930438] [ T53909] Tainted: [W]=WARN [ 2352.930440] [ T53909] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-3.fc41 04/01/2014 [ 2352.930443] [ T53909] Workqueue: nvmet-wq nvme_loop_execute_work [nvme_loop] [ 2352.930449] [ T53909] RIP: 0010:blkcg_set_ioprio+0x44/0x180 as the queue is already torn down when calling submit_bio(); So we need to init the percpu counter in nvmet_ns_enable(), and wait for it to drop to zero in nvmet_ns_disable() to avoid having I/O pending after the namespace has been disabled.
Podatność jest klasyfikowana jako nieskończona pętla (CWE-835) związana z nieprawidłową obsługą licznika percpu chroniącego oczekujące operacje I/O w przestrzeni nazw nvmet. Przestrzeń nazw może zostać wyłączona, zanim licznik oczekujących operacji I/O spadnie do zera. W konsekwencji funkcja submit_bio() próbuje uzyskać dostęp do kolejki blokowej, która została już zniszczona (torn down), co powoduje błąd general protection fault i null-pointer dereference wykryty przez KASAN. Poprawka polega na inicjalizacji licznika percpu w nvmet_ns_enable() i oczekiwaniu na jego spadek do zera w nvmet_ns_disable() przed zakończeniem wyłączania.
Atakujący lub błędnie skonfigurowany klient NVMe-oF może doprowadzić do awarii systemu (kernel crash / Oops) i odmowy usługi (DoS). Ze względu na wektor sieciowy bez uwierzytelnienia (AV:N/AC:L/PR:N/UI:N) oraz ocenę CVSS 9.8, podatność stwarza ryzyko całkowitej utraty dostępności systemu.
Należy zastosować patche dostępne u producenta zgodnie z referencjami: https://git.kernel.org/stable/c/4082326807072b71496501b6a0c55ffe8d5092a5 oraz https://git.kernel.org/stable/c/cc0607594f6813342b27c752c6fb6f6eb9980cb5. Administratorzy powinni niezwłocznie zaktualizować jądro do wersji zawierającej poprawkę.
Jądro Linux — wersje wskazane w referencjach producenta; podatność potwierdzona na gałęzi 6.13.0-rc6; szczegółowy zakres wersji dostępny w referencjach projektu kernel.org
Błąd był odtwarzalny podczas uruchamiania testu blktests/nvme/058 z transportem loop. W śladzie stosu widoczna jest zależność od modułu nvme_loop oraz workqueue nvmet-wq.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HLinux Kernel
OSLinux6.146.13 – 6.13.5 (bez)
Powiązane podatności
Type confusion w V8 (Google Chrome) — zdalne uszkodzenie sterty
Commvault Command Center – nieuwierzytelniony RCE przez path traversal w ZIP
RCE przez YAML deserialization w IBM Aspera Faspex
RCE w VMware Workspace ONE Access i Identity Manager poprzez server-side template injection
Command Injection w VMware Workspace One Access i Identity Manager