Есть пара подходов, некоторые из них в основном безопасны, другие совсем нет.
Небезопасный путь
Пусть любое использование запускается mount
, например, через sudo. Вы могли бы также дать им корень; это то же самое. Пользователь может смонтировать файловую систему с suid-корневой копией - bash
runing, которая мгновенно дает root (скорее всего, без какой-либо регистрации, помимо факта, который mount
был запущен).
Кроме того, пользователь может смонтировать свою собственную файловую систему поверх /etc
, содержащую его / ее собственную копию /etc/shadow
или /etc/sudoers
, а затем получить root с помощью либо su
или sudo
. Или, возможно, bind-mount ( mount --bind
) для одного из этих двух файлов. Или новый файл в /etc/sudoers.d
.
Подобные атаки могут быть осуществлены /etc/pam.d
и во многих других местах.
Помните, что файловые системы даже не должны быть на устройстве, они -o loop
будут монтировать файл, который принадлежит (и, следовательно, может быть изменен) пользователем.
Наиболее безопасный способ: удиски или аналогичные
В различных средах рабочего стола уже созданы соответствующие решения, позволяющие пользователям монтировать съемные носители. Они работают, монтируя только в подкаталоге /media
и отключая поддержку set-user / group-id через параметры ядра. Варианты здесь включают udisks
, udisks2
, pmount
, usbmount
,
Если вам необходимо, вы можете написать свой собственный скрипт для выполнения чего-то подобного и вызывать его через sudo, но вы должны быть очень осторожны при написании этого скрипта, чтобы не оставить корневых эксплойтов. Если вы не хотите, чтобы ваши пользователи помнили sudo, вы можете сделать что-то подобное в скрипте:
#!/bin/bash
if [ $UID -ne 0 ]; then # or `id -u`
exec sudo -- "$0" "$@"
fi
# rest of script goes here
Когда-нибудь мы будем в безопасности: пространства имен пользователей
Пространства имен Linux - это очень легкая форма виртуализации (контейнеры, если быть более точным). В частности, с пространствами имен пользователей любой пользователь в системе может создать свою собственную среду, в которой он является пользователем root. Это позволило бы им монтировать файловые системы, за исключением явно заблокированных, за исключением нескольких виртуальных файловых систем. В конце концов, файловые системы FUSE, вероятно, будут разрешены, но самые последние исправления, которые я смог найти , не охватывают блочные устройства, а только такие вещи, как sshfs.
Кроме того, во многих ядрах дистрибутивов (по соображениям безопасности) по умолчанию не разрешено непривилегированным пользователям использовать пространства имен пользователей; например, Debian имеет значение по kernel.unprivileged_userns_clone
умолчанию 0. Другие дистрибутивы имеют аналогичные настройки, хотя часто с немного другими именами.
Лучшая документация, которую я знаю о пространствах имен пользователей, - статья LWN «
Пространства имен в действии», часть 5: Пространства имен пользователей .
Сейчас я бы пошел с udisks2.
gvfs-mount
-d /dev/sdX