Критическая уязвимость в libinput позволяет локальному пользователю получить root-доступ через подделку виртуального устройства ввода

vulnerability

В библиотеке libinput, отвечающей за работу с устройствами ввода в оконных системах Wayland и X.Org Server, обнаружена опасная уязвимость. Она позволяет непривилегированному пользователю, имеющему возможность создавать виртуальные устройства ввода, выполнить произвольный код с правами суперпользователя. Проблема уже устранена в свежих версиях - 1.31.3 и 1.30.4. Но пока пользователи не обновили систему, атакующий может получить полный контроль над компьютером.

Как работает атака

Суть уязвимости кроется в обработчике libinput-device-group. Этот вспомогательный скрипт запускается подсистемой udev при подключении нового устройства. Он формирует для udev строку вида LIBINPUT_DEVICE_GROUP=... и передаёт её в качестве атрибута. Проблема в том, что скрипт не проверяет содержимое некоторых атрибутов устройства - в частности, поля phys, которое указывает физический путь. Злоумышленник может внедрить в него символ перевода строки (\n) и дополнительные пары ключ=значение.

На практике это выглядит так: атакующий локально подключает поддельное устройство ввода, созданное через интерфейсы uinput или uhid. В команде UI_SET_PHYS он прописывает строку вида:
""poc\n<ВТОРОЙ_КЛЮЧ>=<значение>"". Когда udev обрабатывает вывод libinput-device-group, он видит две строки после подстановки - и вторая воспринимается как новое свойство. Самое опасное, что среди таких свойств есть REMOVE_CMD - команда, которая выполняется с правами root после отключения устройства. Достаточно указать в ней любую произвольную команду, и она исполнится от имени суперпользователя.

Вот почему уязвимость считается критической. Локальный пользователь без привилегий может не просто подменить атрибуты, а напрямую запустить вредоносный код, скажем, создать нового пользователя с root-доступом или отключить защиту.

Кто в зоне риска

Для эксплуатации атакующему нужен доступ к файлу /dev/uinput или /dev/uhid. В обычной конфигурации такие права есть только у root. Однако в некоторых дистрибутивах существуют udev-правила, расширяющие доступ - например, для нормальной работы игровых контроллеров или приложений для удалённого управления. Разработчики уязвимости указали, что в Fedora такие правила устанавливаются вместе с пакетами steam-devices, antimicrox и kdeconnectd. Если любой из них присутствует в системе, то любой пользователь, вошедший в сеанс, может создавать виртуальные устройства через uinput.

Пока что прототип эксплоита уже опубликован. Это значит, что злоумышленники могут адаптировать его для реальной атаки. Пока уязвимость не получила номер CVE (официальный идентификатор в реестре), но заявка отправлена. Спешить с выводами не стоит: скорее всего, номер присвоят в ближайшее время, но сам факт отсутствия CVE на момент публикации не снижает опасности.

Что уже сделано

Исправление кроется в исходном коде libinput. Теперь символы перевода строки, возврата каретки и другие управляющие знаки в поле phys отбрасываются или кодируются перед выводом. Разработчики также добавили регрессионный тест, который проверяет, что подставная строка не может породить несколько записей для udev. Патч включён в версии 1.31.3 и 1.30.4. Все более старые сборки (до 1.31.2 и 1.30.3 включительно) подвержены риску.

Рекомендуется как можно скорее обновить пакет libinput в системе до актуальной версии. В большинстве дистрибутивов обновление уже готовится или выпущено. Кроме того, стоит проверить, установлены ли в системе пакеты steam-devices, antimicrox или kdeconnectd. Если они не нужны, лучше удалить их - это снизит поверхность атаки.

Технические детали для понимания

Для тех, кто не знаком с внутренним устройством Linux, поясним ключевые элементы. udev - это подсистема, которая управляет устройствами в системе: при подключении мыши или клавиатуры она создаёт файл в /dev и запускает правила. libinput - библиотека, которая обрабатывает события ввода от графических серверов Wayland и X.Org. uinput и uhid - это интерфейсы ядра, позволяющие пользовательским программам эмулировать физические устройства ввода. Первый используется для обычных устройств (клавиатур, мышей), второй - для HID-устройств (например, джойстиков). Доступ к этим интерфейсам обычно ограничен.

Уязвимость использует цепочку: злоумышленник через uinput задаёт вредоносную строку phys → ядро передаёт её в sysfs → запускается udev-правило, которое вызывает libinput-device-group → тот выводит многострочное значение → udev импортирует вторую строку как свойство → при отключении устройства выполняется REMOVE_CMD с root-правами. Всё происходит без каких-либо дополнительных запросов.

Выводы

Этот случай напоминает, как важно проверять входные данные даже во вспомогательных утилитах. Казалось бы, локальный доступ к uinput - редкая опция, но в игровых дистрибутивах она встречается всё чаще. Уязвимость libinput показывает, что даже безобидные настройки могут открыть дверь для эскалации привилегий. Пользователям Fedora и других дистрибутивов, где установлены пакеты для геймеров, стоит быть особенно внимательными. Обновите libinput и, если возможно, ограничьте доступ к /dev/uinput для обычных пользователей. Пока же остаётся следить за выходом официального бюллетеня с CVE и применять исправления.

Ссылки

Комментарии: 0