Утилита keyexec не работает из desktop файлов в systemd дистрибутивах

Добрый день!

Мы используем keyexec в связке с xfreerdp в Ubuntu-based дистрибутиве уже более 6 лет.
В новой версии дистрибутива Ubuntu 20.04 столкнулись с проблемой, что keyexec работает только будучи запущенным из терминала. Если запускать его с ярлыка, вылетает с ошибкой id_key not found (если в desktop файле указать Teminal=true то и keyexec работает)

При исследовании характера проблемы, обнаружилось, что gnome-terminal выполняется отдельно от nemo-desktop (в другом “потоке”)

cinnamon-sessio─┬─agent───2*[{agent}]
				<cut>
                ├─nemo-desktop───3*[{nemo-desktop}]
				<cut>

systemd─┬─(sd-pam)
        ├─dbus-daemon
		<cut>
        ├─gnome-terminal-─┬─bash
		<cut>

Я не владею терминологией и знаниями по управлению ключами в ядре, но всё выглядит так, будто потомки cinnamon-session не имеют доступа к связке ключей пользователя root, хотя потомки systemd (sd-pam) имеют.

В процессе серфинга натолкнулся на такую “проблему”

Из чего сделал вывод, что systemd начиная с версии 233, изменил подход к работе с ключами. Вот что Поттеринг пишет:

Note that systemd these days sets up a per-service session keyring, that is not linked up to @us or anything else, the keychains are kept separate on purpose. If you want to link them up, then you need to do that manually now.

Дальнейшее обсуждение “проблемы”

Предполагаю, что требуются исправления в пакетах pam_keystore и keyexec, чтобы или линковать ключ в нужное “пространство” или/и выставлять на него необходимые права.

Кстати, пример из старой документации так-же не работает, если явно не слинковать связки:

root@cinnamon:~# keyctl request user seamus                                         
request_key: Required key not available                                                                                                                                  
root@cinnamon:~# keyctl link @us @s     
root@cinnamon:~# keyctl request user seamus
662447047
root@cinnamon:~# 

Я понимаю, что Калька не использует systemd, но мне очень хотелось бы получить помощь в устранении этой проблемы.

Кстати, модуль pam_keyinit реализует другую функциональность в отличии от pam_keystore?

Спасибо, что не помогли.

В общем, мне удалось починить keyexec для правильной работы с systemd версии 233 и выше.
Хватило двух вызовов следующих функций в нужных местах:

keyctl_link(KEY_SPEC_USER_SESSION_KEYRING, KEY_SPEC_SESSION_KEYRING);
...
keyctl_unlink(KEY_SPEC_USER_SESSION_KEYRING, KEY_SPEC_SESSION_KEYRING);

Разбираясь в коде, даже не будучи C-программистом, мне было жутко стыдно за неряшливость его автора. Я сделал для себя вывод, что в вашей компании нет человека, который бы им занялся и отполировал. :man_shrugging:

Так-же, утилита подвержена атакам race condition. Злоумышленник, имея доступ к рабочему месту, может перехватить пароль до того как он будет затёрт в связке ключей пользователя.

Доброго дня вам.

1 Like