いくつかの方法があり、ほとんど安全なものもあれば、まったく安全でないものもあります。
安全でない方法
mount
を実行してみましょう 、たとえば、sudoを介して。それらにルートを与えることもできます。それは同じことです。ユーザーは bash
の suid ルート コピーを使用してファイル システムをマウントできます。 —即座にルートを取得する実行 (mount
実行されました)。
または、ユーザーは自分のファイルシステムを /etc
の上にマウントすることもできます 、 /etc/shadow
の自分のコピーを含む または /etc/sudoers
、次に su
のいずれかでルートを取得します または sudo
.あるいはバインドマウント (mount --bind
) これらの 2 つのファイルの 1 つに。または /etc/sudoers.d
に新しいファイル .
/etc/pam.d
以上で同様の攻撃が行われる可能性があります
-o loop
のように、ファイルシステムがデバイス上にある必要さえないことを思い出してください。 ユーザーが所有する (したがって変更可能な) ファイルをマウントします。
最も安全な方法:udisks など
さまざまなデスクトップ環境では、ユーザーがリムーバブル メディアをマウントできるように、実際にこれに対するソリューションが既に構築されています。 /media
のサブディレクトリにマウントすることで機能します カーネルオプションを介して set-user/group-id サポートをオフにすることによってのみ。ここのオプションには udisks
が含まれます 、 udisks2
、 pmount
、 usbmount
、
必要に応じて、独自のスクリプトを作成して同様のことを行い、sudo を介して呼び出すこともできますが、root のエクスプロイトを残さないように、このスクリプトの作成には細心の注意を払う必要があります。ユーザーに sudo を覚えさせたくない場合は、スクリプトで次のようにすることができます:
#!/bin/bash
if [ $UID -ne 0 ]; then # or `id -u`
exec sudo -- "$0" "[email protected]"
fi
# rest of script goes here
いつか安全になる方法:ユーザー名前空間
Linux 名前空間は、仮想化 (より具体的にはコンテナー) の非常に軽量な形式です。特に、ユーザー名前空間では、any システム上のユーザーは、ルートである独自の環境を作成できます。これにより、いくつかの仮想ファイルシステムを除いて明示的にブロックされているファイルシステムを除いて、ファイルシステムをマウントできるようになります。最終的には、FUSE ファイルシステムが許可される可能性がありますが、私が見つけた最新のパッチはブロック デバイスをカバーしておらず、sshfs のようなものだけをカバーしています。
さらに、多くのディストリビューション カーネルは、(セキュリティ上の理由から) 非特権ユーザーがユーザー名前空間を使用することを許可しないようにデフォルト設定されています。たとえば、Debian には kernel.unprivileged_userns_clone
があります デフォルトは 0 です。他のディストリビューションにも同様の設定がありますが、名前がわずかに異なることがよくあります。
ユーザー名前空間について私が知っている最良のドキュメントは、LWN の記事 Namespaces in operation, part 5:User namespaces. です。
今のところ、udisks2 を使用します。
できますが、/etc/fstab
のエントリを変更する必要があります マウントするファイルシステムに対応し、フラグ user
を追加します このエントリに。非特権ユーザーがマウントできるようになります。
man mount
を参照 詳細については
polkit を構成するための wiki は次のとおりです。 udisks/udisks2 のルール 非ルート (ユーザーなど) グループでパーティションをマウントするため。
以下のコードを /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];
}
});
あなたが「users」グループに属していると仮定し、次のコマンドを使用してパーティションをマウントします (sudo は必要ありません)。
# udisks2
udisksctl mount --block-device /dev/sda1
# udisks
udisks --mount /dev/sda1