18‑letnia luka w jądrze Windowsa pozwala malware ukryć się przed antywirusami
Procedura PsSetLoadImageNotifyRoutine wykorzystywana jest w jądrzeWindowsów do zarejestrowania dostarczonego przez sterownik wywołaniazwrotnego, które następnie jest powiadamiane przy każdej operacjizaładowania modułu. Powszechnie korzystają z niej programyantywirusowe do sprawdzania, które moduły zostały załadowanepodczas uruchomienia. Niestety jednak ten niskopoziomowy mechanizmkernela od 18 lat zawiera błąd, pozwalający twórcom malware nałatwe oszukanie programów antywirusowych. No cóż, dla jednychbłąd, dla innych niekoniecznie – Microsoft już uznał, że niema tu czego naprawiać.
08.09.2017 13:15
18 lat kopiowania kodu
Omri Misgav, badacz z izraelskiej firmy enSilo, pracował ostatnionad analizą kernela systemów Windows, i właśnie podczas tejanalizy odkrył problem w PsSetLoadImageNotifyRoutine, mechanizmowipowiadomień, który od czasów Windowsa 2000 pozwala napowiadamianie programu o nowo zarejestrowanych sterownikach. Jako żepozwala on też na wykrycie załadowania obrazu PE (formatu plikówuruchamialnych Windowsa) do pamięci wirtualnej, zaczęto gowykorzystywać w oprogramowaniu antywirusowym do wykrycia aktywnościzłośliwego oprogramowania.
Okazuje się jednak, że po zarejestrowaniu procedury powiadomieńdla załadowanych obrazów PE w kernelu, wywołanie zwrotne możeotrzymać niepoprawne nazwy obrazów. W opisie tegoodkrycia, badacze z enSilo wyjaśniają, że o ile dlasystemowych bibliotek DLL zwracane są pełne ścieżki plików istałe wartości, to dla dynamicznie ładowanych obrazów PE ścieżkipozbawione są nazw wolumenów, a czasem kompletnie zniekształcone,mogą wskazywać nawet na inne pliki, a nawet takie, które w ogólenie istnieją.
W rezultacie w wielu wypadkach system operacyjny nie zwracaproducentowi oprogramowania antywirusowego prawdziwych informacji opliku. Oznacza to, że antywirus nie może przeskanować właściwegopliku, albo skanuje coś innego niż powinien. Zachowanie takie nigdynie zostało udokumentowane w Microsoft Developer Network, lecz jakwynika ze śledztwa izraelskich badaczy, Microsoft wiedział o tymproblemie już 10 lat temu.
Wykorzystanie tego osobliwego zachowania mechanizmu kernela NTdocenią twórcy szkodników typu Advanced Persistent Threat, czylitych, które próbują pozostać w systemie niezauważone, na długiczas. Napastnik po zdobyciu przyczółka na atakowanej maszynie musizmusić system do przejawienia wspomnianego błędu. Jest to możliweza pomocą takich technik wstrzyknięć danych jak Process Hollowingczy AtomBombing. Odpowiednio spreparowany złośliwy plik możewówczas ukryć swoją aktywność przed antywirusem poprzezdoprowadzenie do sytuacji w której PsSetLoadImageNotifyRoutinezwraca fałszywe dane o jego lokalizacji.
Jest dobrze jak jest, nie ma się czego obawiać
Na taki atak podatne są wszystkie systemy Microsoftu z jądremNT, od czasów Windowsa 2000 – najwyraźniej przez 18 lat nikt nieruszał tego fragmentu kodu. Dziś też Microsoft nie chce go ruszać.Omri Misgav skontaktował się z Microsoft Security Response Center,gdzie powiedziano mu, że to nie jest bug zagrażającybezpieczeństwu, i że nie ma żadnych planów naprawienia kodukernela. Jest tak, ponieważ już wcześniej zabezpieczeniaexploitowanej przez PsSetLoadImageNotifyRoutine maszyny muszą byćzłamane przez napastnika.