PinTheft — шестата уязвимост от класа Copy Fail, предоставяща права root в Linux

Разкрита е информация за шеста уязвимост (1, 2-3, 4, 5), което позволява на непривилегирован локален потребител да получи права root, презаписвайки данни в страницовия кеш. Уязвимостта е получила кодовото име PinTheft. Достъпен е прототип на експлойт. CVE-идентификатор все още не е присвоен. Поправката в момента е налична само под формата на пач, който е публикуван на 5 май и на 11 май е приет в клона netdev, но не е включен в коригиращите версии на ядрото.

Уязвимостта присъства в реализацията на мрежовия протокол RDS (Reliable Datagram Sockets), предназначен за високо скоростен обмен на съобщения между възлите в клъстера, с минимално забавяне и гарантирана доставка. Атаката е възможна на системи с активна подсистема io_uring (io_uring_disabled=0) и ядро, компилирано с опции CONFIG_RDS, CONFIG_RDS_TCP и CONFIG_IO_URING. За работа на експлойта в системата трябва да има достъпен за четене изпълним файл с флага SUID-root.

За автоматично зареждане на ядрения модул rds_tcp, експлойтът изисква изпращане на данни чрез RDS, използвайки транспорта SO_RDS_TRANSPORT=2. Забелязва се, че сред тестваните дистрибуции на Linux в конфигурация по подразбиране, ядреният модул rds се предоставя само в Arch Linux. За блокиране на уязвимостта, можете да блокирате автоматичното зареждане на ядрени модули rds и rds_tcp: rmmod rds_tcp rds printf 'install rds /bin/false\ninstall rds_tcp /bin/false\n' > /etc/modprobe.d/pintheft.conf

Уязвимостта е предизвикана от грешка в реализацията на механизма zerocopy в функцията rds_message_zcopy_from_user(), която извършва директна промяна на данните в страницовия кеш за избягване на излишна буферификация. При сбой не е извършено почистване на полето rm->data.op_nents, поради което е извършено двойно освобождаване на буфера (double-free). Появяването на некоректна стойност в брояча на референции е успяло да бъде експлоатирано за презаписване на данни в страницовия кеш, благодарение на манипулацията с указателя на фиксирания буфер io_uring.

В останалото механизмът на експлоатация е типичен за всички уязвимости от този клас — атакуващият успява да запише файл на програмата с флаг suid root в страницовия кеш, след което влага код за стартиране на /usr/bin/sh в ELF-заглавието. След тази манипулация стартирането на програмата води до зареждане в паметта не на оригиналния изпълним файл от хранилището, а на изменена копие от страницовия кеш. За разлика от предишните експлойти, новият вариант е адаптиран само за атака върху утилитата „su“, но може да се прилага и при наличие в системата на такива suid-програми, като mount, passwd, chsh, newgrp, umount и pkexec.

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster