Po wczorajszej opublikowanej przez nas informacji na temat wykrytych błędów zeroday w wielu aplikacjach i systemach podczas zawodów Tianfu Cup mamy kolejny błąd – tym razem w kernelu Linux (specjalnie nie piszemy „w jądrze”, żeby aż tak bardzo nie bolało :)). Badacze nazwali go „prostym błędem blokowania kernela Linux”, który wykorzystali w jądrze 4.19.0.13-amd64 Debiana Bustera. Błąd uszkodzenia pamięci jądra Linux powoduje całkowite naruszenie systemu
Błąd w Kernelu Linux
Przypominamy, że podobny błąd https://www.mcafee.com/blogs/other-blogs/mcafee-labs/linux-kernel-vulnerability-can-lead-to-privilege-escalation-analyzing-cve-2017-1000112/ ujawniony został w 2017 roku przez badaczy MacAfee. Powodował on uszkodzenie pamięci w ramach odciążania fragmentacji UDP (UFO) kernela Linux, który umożliwiał nieautoryzowanym osobom uzyskanie lokalnych eskalacji uprawnień. Błąd dotyczył ścieżek kodu IPv4 i IPv6 z jądrem w wersji 4.8.0 Ubuntu xenial i został naprawiony w Commit 85f1bd9.
Wykrycie nowej podatności zawdzięczamy zespołowi Google Project Zero. który udostępnił szczegóły podobnego, ale znacznie prostszego błędu, który może spowodować całkowite naruszenie systemu. Badacze nazwali to „prostym błędem blokowania kernala Linux”, który wykorzystali w jądrze 4.19.0.13-amd64 systemu Debian Buster.
Źródło problemu
Według wpisu na blogu Project Zero błąd znajdował się w module obsługi ioctl – tiocspgrp. Element pgrp po stronie terminala (real_tty) został zmodyfikowany, aby go wykorzystać, podczas gdy licznik odwołań do starych i nowych grup procesów został odpowiednio dostosowany za pomocą put_pid i get_pid.
Mbr>
Blokada jest ustawiona na tty, która w zależności od deskryptora pliku przekazanego przez badaczy do ioctl() może być dowolnym końcem pary pseudoterminali. Tak więc nazwali ioctl TIOCSPGRP po obu stronach pseudoterminalu, aby wyścigi danych między równoczesnymi dostępami do elementu pgrp, powodując przekrzywienie zliczania referencji przez kilka wyścigów.
Dla niewtajemniczonych wyjaśniamy, że wyścig danych (z ang. data-race) ma miejsce, gdy:
- dwa lub więcej wątków w jednym procesie jednocześnie uzyskuje dostęp do tej samej lokalizacji pamięci, oraz
- co najmniej jeden z dostępów służy do pisania i
- wątki nie używają żadnych wyłącznych blokad do kontroli dostępu do tej pamięci.
Jann Horn z Google Project Zero stwierdził, że refcount starego pid struktury wykazał spadek o 1 za dużo w obu przypadkach, podczas gdy A lub B zostały zwiększone o 1 za dużo. Zespół publikuje również dowód koncepcji, który jest dostępny tutaj.