Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book

Podatność w sterownikach AMD. Jako zwykły użytkownik można czytać pamięć (hasła, inne sekrety…)

22 września 2021, 09:35 | W biegu | 0 komentarzy

Badacze z ZeroPeril, firmy zajmującej się doradztwem z zakresu bezpieczeństwa IT, ujawnili niedawno podatność CVE-2021-26333 dotyczącą modułu sterownika jądra, który stanowi część AMD Chipset Driver. Mowa o pliku amdpsp.sys, a luka obejmuje procesory wypisane na tej stronie

Co można zrobić? Jako użytkownik o niskich uprawnieniach możemy czytać względnie losowe fragmenty pamięci (w której mogą znajdować się różne “ciekawe rzeczy” – np. hasło admina). Badacze opisują to tak:

The contents of those physical pages varied from kernel objects and arbitrary pool addresses that can be used to circumvent exploitation mitigations such as KASLR,, and even registry key mappings of \Registry\Machine\SAM containing NTLM hashes of user authentication credentials that can be used in subsequent attack stages. 

For example, these can be used to steal credentials of a user with administrative privilege and/or be used in pass-the-hash style attacks to gain further access inside a network.

Sterownik, po otrzymaniu żądania 0x9c422008, wywołuje funkcję MmAllocateContiguousMemorySpecifyCache, która odpowiada za alokację zakresu pamięci i mapowanie jej na pulę przestrzeni adresowej jądra. Później próbuje zainicjować otrzymany zakres zerami na podstawie rozmiaru alokacji.

Możliwość ataku jest spowodowana inicjalizacją zawartości pamięci. Rozmiar alokowanej pamięci jest zaokrąglony do rozmiaru pamięci stronicowej, czyli zwykle 4096 bajtów (co można sprawdzić przy użyciu prostego programu w C++).

W dalszej kolejności sterownik wywołuje funkcję MmMapLockedPagesSpecifyCache, używając trybu user mode (pozostały tryb to kernel mode). Pozwala to na przetworzenie zawartości, która normalnie byłaby dostępna wyłącznie dla programów działających na poziomie jądra. Sterownik wyposażony jest w tablicę o rozmiarze umożliwiającym 100 mapowań w tym samym czasie. Jest w niej przechowywany base address każdego mapowania, dzięki czemu mogą być wykonywane kolejne operacje.

Drugi błąd polega na tym, że sterownik, po otrzymaniu żądania 0x9c42200c, przeszukuje listę zapisanych mapowań. Jeśli znajdzie prawidłowy wpis, wywoła funkcję MmFreeContiguousMemory w celu „uruchomienia” niestronicowej puli alokacji powiązanej z mapowaniem. Zgodnie z dokumentacją powinno to dotyczyć zakresu pamięci fizycznej – poprzednio alokowanej. Praktyka wygląda jednak inaczej i mapowanie tej pamięci wciąż znajduje się w user mode i pozostaje prywatne dla powiązanych procesów.

Opisana podatność została załatana, a poprawkę można zainstalować poprzez Windows Update lub aktualizując AMD Chipset Driver.

–Michał Giza

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

Odpowiedz