Existuje několik přístupů, některé z nich většinou bezpečné, jiné vůbec.
Nebezpečný způsob
Nechte libovolné použití spustit mount
, např. prostřednictvím sudo. Můžete jim také dát kořen; je to to samé. Uživatel mohl připojit souborový systém se suid kořenovou kopií bash
—spuštění, které okamžitě poskytne root (pravděpodobně bez jakéhokoli protokolování, kromě skutečnosti, že mount
byl spuštěn).
Alternativně by uživatel mohl připojit svůj vlastní souborový systém nad /etc
, obsahující jeho/její vlastní kopii /etc/shadow
nebo /etc/sudoers
, pak získejte root buď s su
nebo sudo
. Nebo možná bind-mount (mount --bind
) přes jeden z těchto dvou souborů. Nebo nový soubor do /etc/sudoers.d
.
Podobné útoky by bylo možné odrazit přes /etc/pam.d
a na mnoha dalších místech.
Pamatujte, že souborové systémy nemusí být ani na zařízení, -o loop
připojí soubor, který je ve vlastnictví (a tedy upravitelný) uživatelem.
Většinou bezpečný způsob:udisky nebo podobné
Různá desktopová prostředí již ve skutečnosti vytvořila řešení, která uživatelům umožňují připojit vyměnitelná média. Fungují tak, že se připojují do podadresáře /media
pouze a vypnutím podpory set-user/group-id prostřednictvím voleb jádra. Možnosti zde zahrnují udisks
, udisks2
, pmount
, usbmount
,
Pokud musíte, můžete napsat svůj vlastní skript, který udělá něco podobného, a vyvolat ho pomocí sudo – ale musíte být při psaní tohoto skriptu opravdu opatrní, abyste neopustili root exploity. Pokud nechcete, aby si vaši uživatelé museli pamatovat sudo, můžete ve skriptu provést něco takového:
#!/bin/bash
if [ $UID -ne 0 ]; then # or `id -u`
exec sudo -- "$0" "[email protected]"
fi
# rest of script goes here
Budeme jednou zabezpečeni:uživatelské jmenné prostory
Linuxové jmenné prostory jsou velmi lehkou formou virtualizace (konkrétněji kontejnery). Zejména u uživatelských jmenných prostorů jakýkoli uživatel v systému může vytvořit své vlastní prostředí, ve kterém je root. To by jim umožnilo připojit souborové systémy, kromě toho, že to bylo explicitně zablokováno, s výjimkou několika virtuálních souborových systémů. Nakonec budou pravděpodobně povoleny souborové systémy FUSE, ale nejnovější záplaty, které jsem našel, nepokrývají bloková zařízení, pouze věci jako sshfs.
Dále, mnoho jader distribucí má (z bezpečnostních důvodů) nastaveno tak, že neumožňují neprivilegovaným uživatelům používat uživatelské jmenné prostory; například Debian má kernel.unprivileged_userns_clone
to je výchozí hodnota 0. Ostatní distribuce mají podobná nastavení, i když často s mírně odlišnými názvy.
Nejlepší dokumentací, kterou znám o uživatelských jmenných prostorech, je článek LWN Jmenné prostory v provozu, část 5:Uživatelské jmenné prostory.
Prozatím bych zvolil udisks2.
Můžete to udělat, ale musíte upravit záznam v /etc/fstab
odpovídající souborovému systému, který chcete připojit, přidáním příznaku user
k tomuto vstupu. Neprivilegovaní uživatelé by jej pak mohli připojit.
Viz man mount
pro více podrobností.
Zde je wiki pro konfiguraci polkitu pravidla pro udisks/udisks2 za účelem připojení oddílů podle skupiny uživatelů bez oprávnění root (např. uživatelů).
Uložte níže uvedený kód do /etc/polkit-1/rules.d/50-udisks.rules
polkit.addRule(function(action, subject) {
var YES = polkit.Result.YES;
var permission = {
// only required for udisks1:
"org.freedesktop.udisks.filesystem-mount": YES,
"org.freedesktop.udisks.filesystem-mount-system-internal": YES,
"org.freedesktop.udisks.luks-unlock": YES,
"org.freedesktop.udisks.drive-eject": YES,
"org.freedesktop.udisks.drive-detach": YES,
// only required for udisks2:
"org.freedesktop.udisks2.filesystem-mount": YES,
"org.freedesktop.udisks2.filesystem-mount-system": YES,
"org.freedesktop.udisks2.encrypted-unlock": YES,
"org.freedesktop.udisks2.eject-media": YES,
"org.freedesktop.udisks2.power-off-drive": YES,
// required for udisks2 if using udiskie from another seat (e.g. systemd):
"org.freedesktop.udisks2.filesystem-mount-other-seat": YES,
"org.freedesktop.udisks2.encrypted-unlock-other-seat": YES,
"org.freedesktop.udisks2.eject-media-other-seat": YES,
"org.freedesktop.udisks2.power-off-drive-other-seat": YES
};
if (subject.isInGroup("users")) {
return permission[action.id];
}
});
Předpokládejme, že jste ve skupině "users" a pomocí následujícího příkazu připojte oddíl (není třeba sudo).
# udisks2
udisksctl mount --block-device /dev/sda1
# udisks
udisks --mount /dev/sda1