Opublikowano informacje o szóstej luce (1, 2-3, 4, 5), która umożliwia nieuprzywilejowanemu lokalnemu użytkownikowi uzyskanie praw root poprzez zapis danych w pamięci podręcznej stron. Luka otrzymała kodową nazwę PinTheft. Dostępny jest prototyp eksploitacji. Identyfikator CVE nie został jeszcze przypisany. Poprawka jest obecnie dostępna tylko w postaci łatki, która została opublikowana 5 maja i 11 maja została przyjęta do gałęzi netdev, ale nie została włączona w poprawki jądra.
Luka występuje w implementacji protokołu sieciowego RDS (Reliable Datagram Sockets), przeznaczonego do szybkiej wymiany wiadomości między węzłami w klastrze, z minimalnym opóźnieniem i gwarantowaną dostawą. Atak jest możliwy na systemach z włączonym subsystemem io_uring (io_uring_disabled=0) i jądrem skompilowanym z opcjami CONFIG_RDS, CONFIG_RDS_TCP i CONFIG_IO_URING. Aby eksploit działał, w systemie musiałby być dostępny do odczytu plik wykonywalny z flagą SUID-root.
Aby automatycznie załadować moduł jądra rds_tcp, eksploit żąda przesłania danych przez RDS z użyciem transportu SO_RDS_TRANSPORT=2. Zauważono, że wśród testowanych dystrybucji Linuksa w konfiguracji domyślnej, moduł jądra rds jest dostępny tylko w Arch Linux. Aby zablokować lukę, można zablokować automatyczne ładowanie modułów jądra rds i rds_tcp: rmmod rds_tcp rds printf 'install rds /bin/false\ninstall rds_tcp /bin/false\n' > /etc/modprobe.d/pintheft.conf
Luka została spowodowana błędem w implementacji mechanizmu zerocopy w funkcji rds_message_zcopy_from_user(), która dokonuje bezpośrednich zmian danych w pamięci podręcznej stron w celu wyeliminowania zbędnego buforowania. W przypadku awarii nie oczyszczano pola rm->data.op_nents, co prowadziło do podwójnego zwolnienia bufora (double-free). Możliwość wystąpienia nieprawidłowej wartości w liczniku odniesień została wykorzystana do nadpisania danych w pamięci podręcznej stron, dzięki manipulacji wskaźnikiem na stały bufor io_uring.
W pozostałym zakresie sposób wykorzystania jest typowy dla wszystkich luk tej klasy — atakujący osiąga umieszczenie pliku programu z flagą suid root w pamięci podręcznej stron, po czym podstawia do nagłówka ELF kod do uruchomienia /usr/bin/sh. Po tej manipulacji uruchomienie programu prowadzi do załadowania do pamięci nieoryginalnego pliku wykonywalnego z nośnika, a zmienionej kopii z pamięci podręcznej. W przeciwieństwie do wcześniejszych exploitów, nowa wersja jest dostosowana do ataku wyłącznie na narzędzie „su”, ale może być również stosowana w przypadku obecności w systemie takich programów suid jak mount, passwd, chsh, newgrp, umount i pkexec.
Źródło: opennet.ru
