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.

Categories: IT Info