CVE-2026-80956
NieznaneStreszczenie
W jądrze Linux moduł dm-pcache w funkcji get_cache_segment() skanuje mapę segmentów do cache->n_segs (fizyczna liczba segmentów urządzenia), ale cache_segs_init() inicjalizuje tylko pierwsze cache_info->n_segs segmentów. Spreparowany obraz z mniejszym cache_info->n_segs pozostawia pozostałe struktury pcache_cache_segment wyzerowane (segment.data == NULL), a alokator może przekazać taki segment do cache_kset_close(), która zapisuje przez wskaźnik data bez sprawdzenia NULL. Poprawka ogranicza wyszukiwanie alokatora do cache_info->n_segs.
Ocena ryzyka
Osoba z uprawnieniami CAP_SYS_ADMIN dostarczająca spreparowany obraz cache może wywołać dereferencję NULL i awarię jądra (DoS). Prawidłowe konfiguracje nie są dotknięte.
Rekomendacja
Zaktualizuj jądro Linux do wersji zawierającej poprawkę dla modułu dm-pcache. Ogranicz możliwość ładowania tabel dm-pcache do zaufanych administratorów.
Inne podatności w Linux kernel (dm-pcache)
Zobacz wszystkie- CVE-2026-80962Nieznane
W jądrze Linux moduł dm-pcache nie waliduje pól geometrii (n_segs i id segmentu) pochodzących z metadanych cache_info na dysku. Funkcja cache_segs_init() iteruje n_segs razy, indeksując tablicę cache->segments[], która ma rozmiar wynikający z geometrii urządzenia. Ponieważ metadane są chronione jedynie CRC z publicznym ziarnem, osoba dostarczająca urządzenie cache (CAP_SYS_ADMIN) może podać zbyt duże n_segs lub identyfikator spoza zakresu, powodując odczyt i zapis poza zakresem. Poprawka odrzuca nieprawidłowe wartości przed użyciem.
- CVE-2026-80961Nieznane
W jądrze Linux moduł dm-pcache nie ogranicza pola key_num w ksecie ani granic wewnątrz segmentu. key_num steruje funkcją cache_kset_crc() i pętlą odtwarzania w cache_replay(), a ponieważ sprawdzane są tylko magic i CRC z publicznym ziarnem, nieprawidłowy key_num może spowodować odczyt poza buforem PCACHE_KSET_KEYS_MAX. Dodatkowo przesunięcie i długość klucza w cache_key_decode() są przyjmowane bez weryfikacji, co pozwala na odczyt poza segmentem i wyciek danych do przestrzeni użytkownika. Poprawka dodaje walidację key_num i granic klucza.
- CVE-2026-80960Nieznane
W jądrze Linux moduł dm-pcache nie waliduje pola seg_num pochodzącego z superbloku chronionego tylko crc32c. seg_num określa rozmiar tablicy cache->segments[] i jest używany do ograniczania identyfikatorów segmentów, ale nigdy nie jest sprawdzany względem rozmiaru urządzenia. Osoba dostarczająca urządzenie cache (CAP_SYS_ADMIN) może podać zbyt duże seg_num, co prowadzi do zapisu poza zakresem (memset 12 KiB) w pamięci jądra podczas ładowania tabeli. Poprawka odrzuca seg_num równy zero, większy niż urządzenie może pomieścić lub większy niż PCACHE_CACHE_SEGS_MAX.
- CVE-2026-80959Nieznane
W jądrze Linux moduł dm-pcache nie ogranicza przesunięcia seg_off w funkcji cache_pos_decode(), która pobiera zapisane wartości key_tail i dirty_tail z urządzenia cache. Wartość seg_off równa lub większa niż rozmiar danych segmentu (data_size), kontrolowana przez osobę dostarczającą urządzenie (CAP_SYS_ADMIN), powoduje odczyt poza segmentem. Poprawka odrzuca zdekodowane seg_off, które nie jest mniejsze niż data_size segmentu.
- CVE-2026-80958Nieznane
W jądrze Linux moduł dm-pcache w funkcji cache_replay(), wątku zapisu zwrotnego i wątku GC ogranicza długość odczytu tail-kset przez PCACHE_SEG_SIZE - seg_off, czyli surowy rozmiar segmentu, a nie region danych. Odczyt tail blisko końca segmentu wykracza poza dane segmentu do następującego obszaru kontrolnego. Poprawka ogranicza odczyt do cache_seg_remain(), czyli regionu danych.
- CVE-2026-80957Nieznane
W jądrze Linux moduł dm-pcache w funkcji cache_replay() podąża za łańcuchem last-kset z metadanych przez next_cache_seg_id bez wywołania cond_resched(). Spreparowany łańcuch wskazujący z powrotem na już odwiedzony segment powoduje nieskończoną pętlę odtwarzania. Poprawka ogranicza liczbę przeskoków last-kset do cache->n_segs, ponieważ prawidłowy łańcuch odwiedza każdy segment co najwyżej raz.
Oryginalny opis (angielski, źródło NVD)
In the Linux kernel, the following vulnerability has been resolved: dm-pcache: only hand out initialized cache segments get_cache_segment() scans the segment map up to cache->n_segs, the physical device segment count, but cache_segs_init() only initializes the first cache_info->n_segs segments. A crafted image with cache_info->n_segs smaller than the device count leaves the remaining pcache_cache_segment structs zeroed (segment.data == NULL), and the allocator can hand one to cache_kset_close(), which writes through the returned segment's data pointer with no NULL check. Bound the allocator's search to cache_info->n_segs so only initialized segments are ever returned. A conforming cache sets n_segs equal to the device segment count, so this rejects nothing legitimate.

