В swhkd (Simple Wayland HotKey Daemon) выявлена серия уязвимостей, вызванных некорректной работой с временными файлами, параметрами командной строки и unix-сокетами. Программа написана на языке Rust и выполняет обработку нажатия горячих клавиш в окружениях на базе протокола Wayland (совместимый на уровне файлов конфигурации аналог процесса sxhkd, применяемого в окружениях на базе X11).
В состав пакета входит непривилегированный процесс swhks, выполняющий действия для горячих клавиш, и фоновый процесс swhkd, выполняемый с правами root и взаимодействующий с устройствами ввода на уровне API uinput. Для организации взаимодействия swhks и swhkd применяется Unix-сокет. При помощи правил Polkit любому локальному пользователю предоставляется возможность запуска с правами root процесса /usr/bin/swhkd и передачи ему произвольных параметров.
Выявленные уязвимости:
- CVE-2022-27815 – сохранение PID процесса в файл с предсказуемым именем и в каталоге, доступном на запись другим пользователям (/tmp/swhkd.pid). Любой пользователь может создать файл /tmp/swhkd.pid и поместить в него pid существующего процесса, что приведёт к невозможности запустить swhkd. При отсутствии защиты от создания символических ссылок в /tmp, уязвимость может применяться для создания или перезаписи файлов в любом системном каталоге (в файл записывается PID) или определения содержимого любого файла в системе (swhkd выводит в stdout всё содержимое PID-файла). Примечательно, что в выпущенном исправлении PID-файл перенесён не в каталог /run, а в каталог /etc (/etc/swhkd/runtime/swhkd_{uid}.pid), где ему тоже не место.
- CVE-2022-27814 – манипулируя параметром командной строки “-c”, применяемом для указания файла конфигурации, можно определить существование в системе любого файла. Например, для проверки /root/.somefile можно запустить “pkexec /usr/bin/swhkd -d -c /root/.somefile” и если файл отсутствует будет выведена ошибка “/root/.somefile doesn’t exist”. Как и в случае с первой уязвимостью исправление проблемы вызывает недоумение – устранение проблемы сводится к тому, что для чтения файла конфигурации теперь запускается внешняя утилита “cat” (‘Command::new(“/bin/cat”).arg(path).output()’).
- CVE-2022-27819 – проблема также связана с использованием опции “-c”, указанный через которую файл конфигурации целиком загружается и разбирается без проверки размера и типа файла. Например, для вызова отказа в обслуживании через исчерпание свободной памяти и создание паразитного ввода/вывода можно указать при запуске блочное устройство (“pkexec /usr/bin/swhkd -d -c /dev/sda”) или символьное устройств, выдающее бесконечный поток данных. Проблема решена сбросом привилегий перед открытием файла, но исправление оказалось не полным, так как сбрасывается только идентификатор пользователя (UID), но идентификатор группы (GID) остаётся прежним.
- CVE-2022-27818 – для создания Unix-сокета используется файл /tmp/swhkd.sock, создаваемый в общедоступном на запись каталоге, что приводит к похожим проблемам, что и первая уязвимость (любой пользователь может создать /tmp/swhkd.sock и генерировать или перехватывать события нажатия клавиш).
- CVE-2022-27817 – события ввода принимаются от всех устройств и во всех сеансах, т.е. пользователь из другого сеанса Wayland или из консоли может перехватить события при нажатии горячих клавиш другими пользователями.
- CVE-2022-27816 – процесс swhks, как и swhkd, использует PID-файл
/tmp/swhks.pid в общедоступном на запись каталоге /tmp. Проблема аналогична первой уязвимости, но не столь опасна, так как swhks выполняется под непривилегированным пользователем.