CVE-2026-80960
NieznaneStreszczenie
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.
Ocena ryzyka
Podatność umożliwia osobie z uprawnieniami CAP_SYS_ADMIN zapis poza zakresem w pamięci jądra, co może prowadzić do uszkodzenia systemu lub eskalacji uprawnień. Wymaga jednak wysokich uprawnień.
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-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.
- CVE-2026-80956Nieznane
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.
Oryginalny opis (angielski, źródło NVD)
In the Linux kernel, the following vulnerability has been resolved: dm-pcache: validate on-media seg_num against the cache device size seg_num is read from the crc32c-only superblock, so whoever supplies the cache device on a table load (CAP_SYS_ADMIN) controls it. It sizes cache->segments[] and is the value every later on-media segment id is bounded against, yet it is never checked against the device. Because cache_dev->mapping is the direct map of the pmem, CACHE_DEV_SEGMENT() for a segment id past the device resolves to ordinary kernel memory beyond the mapping; a new-cache init reaching such an id has cache_seg_init() -> cache_dev_zero_range() memset() 12 KiB over that memory -- an out-of-bounds write into the kernel heap at table load. A zero seg_num makes the segment allocations ZERO_SIZE_PTR. Reject a seg_num that is zero, larger than the device can hold, or larger than PCACHE_CACHE_SEGS_MAX before it is used.

