Несколько дней назад появилась новость о том, что был обнаружен ряд уязвимостей в swhkd (Simple Wayland HotKey Daemon), вызванный неправильной обработкой временных файлов, параметров командной строки и сокетов unix.
Программа написана на Rust и обрабатывает горячие клавиши в средах, основанных на протоколе Wayland (совместимый с конфигурационным файлом аналог процесса sxhkd, используемого в средах на основе X11). Пакет включает в себя непривилегированный процесс swhks, который выполняет действия для горячих клавиш, и фоновый процесс swhkd, который запускается от имени пользователя root и взаимодействует с устройствами ввода на уровне API uinput. Для организации взаимодействия между swhks и swhkd используется сокет Unix.
Правила Polkit позволяют любому локальному пользователю запускать процесс /usr/bin/swhkd от имени пользователя root и передавать ему произвольные параметры.
Интеграция пакета RPM представленный для openSUSE Tumbleweed содержал необычные правила Polkit в файл определения, требующий проверки командой безопасности SUSE.
В результате проверки было выявлено несколько проблем с безопасностью. Отдельные проблемы описаны в подробном отчете ниже.
Из выявленные уязвимости, упоминаются следующие:
CVE-2022-27815
Эта уязвимость позволяет сохранить PID процесса в файл с предсказуемым именем и в доступном для записи каталоге для других пользователей (/tmp/swhkd.pid), при этом любой пользователь может создать файл /tmp/swhkd.pid и поместить в него pid существующего процесса, что сделает невозможным запуск swhkd.
При отсутствии защиты от создания символических ссылок в /tmp, уязвимость может использоваться для создания или перезаписи файлов в любом каталоге в системе (PID записывается в файл) или определять содержимое любого файла в системе (swhkd выводит все содержимое файла PID на стандартный вывод). Следует отметить, что в выпущенном исправлении файл PID был перемещен не в каталог /run, а в каталог /etc (/etc/swhkd/runtime/swhkd_{uid}.pid), где он также не принадлежит .
CVE-2022-27814
Эта уязвимость позволяет вам манипулировать параметром командной строки «-c», чтобы указать файл конфигурации может определить наличие любого файла в системе.
Как и в случае с первой уязвимостью, решение проблемы вызывает недоумение: решение проблемы сводится к тому, что внешняя "кошачья" утилита ('Command::new("/bin/cat").arg(path) теперь запущен для чтения конфигурационного файла.output()').
CVE-2022-27819
Эта проблема это также связано с использованием опции "-c", который загружает и анализирует весь файл конфигурации без проверки размера и типа файла.
Например, чтобы вызвать отказ в обслуживании из-за нехватки свободной памяти и создания случайного ввода-вывода, вы можете указать блочное устройство при запуске («pkexec /usr/bin/swhkd -d -c /dev/sda») или символьное устройство, которое излучает бесконечный поток данных.
Проблема была решена путем сброса привилегий перед открытием файла, но решение не было полным, поскольку сбрасывался только идентификатор пользователя (UID), но идентификатор группы (GID) оставался прежним.
CVE-2022-27818
Эта уязвимость позволяет вам использовать файл /tmp/swhkd.sock для создания сокета Unix, который создается в общедоступном доступном для записи каталоге, вызывая проблемы, аналогичные первой уязвимости (любой пользователь может создать /tmp/swhkd.sock и генерировать или перехватывать события нажатия клавиш).
CVE-2022-27817
В этой уязвимости события ввода поступают со всех устройств и во всех сессиях, то есть пользователь в другом сеансе Wayland или консоли может перехватывать события, когда другие пользователи нажимают горячие клавиши.
CVE-2022-27816
Процесс swhks, как и swhkd, использует файл PID /tmp/swhks.pid в общедоступном для записи каталоге /tmp. Проблема похожа на первую уязвимость, но не так опасна, так как swhks запускается под непривилегированным пользователем.
Наконец, если вам интересно узнать об этом больше, вы можете проконсультироваться с подробности по следующей ссылке.