В библиотеке 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 и применять исправления.
Ссылки
- https://gitlab.freedesktop.org/libinput/libinput/-/work_items/1296
- https://lore.freedesktop.org/wayland-devel/aiDRA35Gggyi5mTY@quokka/
- https://gitlab.freedesktop.org/libinput/libinput/-/commit/76f0d8a7f57e2868882864b4611281f12f704b55