Ujawniono brzydki hack w jądrze Linuksa, który był w mainline od ponad trzech lat. Ze względu na buggy X.Org Server/xf86-video-modesetting DDX, jądro Linuksa narzucało inne zachowanie w kwestii tego, czy proces zaczyna się od znaku „X”, i z kolei wyłącza obsługę atomowego ustawiania trybu.
Badacz bezpieczeństwa Linuksa, Jason Donenfeld (który jest również znany z wymyślania WireGuard), natknął się na ten brzydki hack kodu w jądrze.
Donenfeld skomentował w ten weekend listę dyskusyjną jądra:
To odwraca 26b1d3b527e7 (“drm/atomic: zabierz atomowe zabawki z dala od X”), kłębek podobny do rootkita, który nie ma sensu znajdować się w jądrze ogólnego przeznaczenia. Jest to rodzaj hackowania do debugowania, którego użyję za chwilę, ale nigdy nie zatwierdzę, lub rodzaj złośliwej sztuczki polegającej na ukrywaniu pierwszego procesu.
Historia jest taka, że niektóre kody w przestrzeni użytkownika–xorg-server–mają ustawiony DDX, który tak naprawdę nie jest poprawnie zakodowany. Ponieważ nikt nie chciał już dłużej dbać o X11, zamiast naprawiać błędny kod, jądro zostało dostosowane, aby uniknąć konieczności dotykania X11. Bummer, ale dość uczciwy: jeśli jądro nie chce już wspierać jakiegoś interfejsu API przestrzeni użytkownika, właściwą rzeczą do zrobienia jest zorganizowanie wdzięcznego powrotu, gdy przestrzeń użytkownika uważa, że nie jest dostępna w sposób łatwy do zarządzania.
Jednak *sposób*, aby to zrobić, polega po prostu na sprawdzeniu `current->comm[0]==’X’` i wyłączeniu go tylko w tym przypadku. Oznacza to, że *nie* chodzi po prostu o to, że jądro nie chce już obsługiwać konkretnego interfejsu API w przestrzeni użytkownika, ale raczej jest to jądro, które teoretycznie nie chce obsługiwać serwera xorg, ale w rzeczywistości okazuje się, że są to wszystkie procesy, które zaczynają się od „X”.
Granie w gry z current->comm w ten sposób jest oczywiście złe i jest dość szokujące, że kiedykolwiek zostało to popełnione.
zatwierdź do tego jądra z pierwszym sprawdzeniem znaku „X” został wykonany we wrześniu 2019 r. Argument w tym zatwierdzeniu jądra Linuxa w tamtym czasie brzmiał:
Modesetting ddx ma całkowicie zepsuty pomysł na to, jak działa atomic:
-nie wyłącza starych złączy, zakładając, że zostaną automatycznie wyłączone, jak w przypadku starszego setcrtc
-zakłada, że ASYNC_FLIP jest podłączony przez dla atomowego ioctl
-ani jednego wywołania TEST_ONLY[Innymi słowy] implementacja jest tłumaczeniem 1:1 starszych ioctl na atomowy, co jest a) zepsute b) bez sensu.
Mamy już błędy zarówno w i915, jak i amdgpu-DC, które uniemożliwiają nam włączenie zgrabnych funkcji.
Jeśli komukolwiek zależy na atomic w X, możemy łatwo dodać nowy poziom atomic (req->value==2), aby X odzyskał błyszczące zabawki.
Ponieważ te uszkodzone wersje-modesetting są już dostępne, tak naprawdę nie ma innego sposobu na wydostanie się z tego powiązania.
Dobrą wiadomością jest to, że od tego czasu po stronie przestrzeni użytkownika w 2019 r. Kod ustawień trybu xf86-video-modeetting został domyślnie wyłączony i domyślnie wyłączył obsługę atomową. Tak więc technicznie, jeśli uruchamiasz zaktualizowany stos X.Org w ciągu ostatnich trzech lat, to hackowanie jądra nie jest już konieczne, ponieważ przestrzeń użytkownika właśnie wtedy unika atomowego API.
Zobaczymy, czy Linusowi Torvaldsowi nic nie szkodzi usunięcie tego hacka, ponieważ w końcu jest to sprzeczne z jego zasadą „nie łamania przestrzeni użytkownika”, a następnie cofnie system, jeśli będzie trzymał się przestarzałego stosu serwera X.Org i chce działać z przyszłą wersją jądra. Zobaczymy, ale zaskakujące było to, że krytyka tego brudnego kodu zajęła trzy lata.