答え1
そうではない必要、これが方法です。
ルートディレクトリを変更すると、システムコンポーネントの前提が無効になります。
/bin/su
ユーザーデータベースが/etc/passwd
/ /etc/shadow
(libc
またはリンクされたライブラリ)に/lib
通常のユーザーが変更できない固定場所にあるとします。
/bin/su
同じコマンドを実行できますが、他のコマンドを自由に変更できる別のファイルシステムレイアウトを作成できる場合は、/etc/passwd
useまたはuse(おそらく間接的に)を使用してユーザーを認証してコードを実行できます。libc
su
/etc/passwd
今、このアプローチでは、CAP_CHROOT
所有だけが必要ではありません。また、ファイルシステムのディレクトリへの書き込み権限も必要です(ハードリンクは以下を介してのみ実行できます)。以内に特定のファイルシステムの場合)動的にリンクされたsetuid-root実行可能ファイルが1つ以上あります。
システムにユーザーの書き込み可能領域(または読み取り専用領域)がないシステムパーティションがあることはまれではありません。ファイルシステムのユーザー書き込み可能領域がフラグを使用してマウントされることも一般的ですnosuid
。また、多くのシステムでは、所有していないファイルへのハードリンクを無効にします(fs.protected_hardlinks
例:Linux 3.6+のsysctlを参照)。
ただし、chroot刑務所の内部でsetuid実行可能ファイルをハードリンクする必要はありません。次のようにすることもできます。
chdir("/");
chroot("/tmp/myjail");
execl("bin/su", "su", 0);
これは、プロセスのルートディレクトリが変更されても、そのディレクトリとそこで確認されたディレクトリが利用できなくても、chroot
後で現在の作業ディレクトリを引き続き使用できるためです。/
bin/su
~へ刑務所。絶対パスを介してアクセスされるので、それはまだ刑務所やlibcにあります/bin/su
。ld.so
/etc/passwd
ルート変更目次。現在の作業ディレクトリまたは刑務所の外部のファイルに開いているファイル記述子をそのままにしておくと、刑務所から出ることができるドアが提供されます。