web-dev-qa-db-ja.com

虐待suidプログラム

Setuidバイナリについていくつか質問があります。 ftp、gdb、findなどの危険なプログラム(Sudoでこのプログラムの使用を許可すると、プログラムから脱出してルートシェルを取得することが可能)が存在することを私は知っています。たとえば、root権限でSudo ftpを作成できる場合は、!/ bin/bashと入力して、ルートシェルを取得できます。

だから私は、彼らがsuidビットを持っていれば、このバイナリでも同じ問題だと思っていました。だから私は自分のコンピューターで試してみましたが、ここに問題があります。私はsuidを/ usr/bin/netkit-ftpに配置しました(/ usr/bin/ftpは/ usr/bin/netkit-ftpへのシンボリックリンクです)。これがls -l /usr/bin/netkit-ftpの結果です

-rwsr-xr-x 1 root root 96968 déc.   6  2016 /usr/bin/netkit-ftp

次に、ftpを使用して!whoamiと入力しようとしました。そして結果はrootではありません(それは私の現在のユーザー名です)。

理由がわかりませんか?バイナリ/ usr/bin/netkit-ftpがsuidビットを取得した場合、root権限で実行されることになっています。 (それで、なぜ私のwhoamiは私にrootを返さないのですか?)

心から:)

1
madem

各プロセスには、少なくとも2つのUIDセット(通常は3つ以上)があります。それらの1つは「実際の」UIDであり、これはどのユーザーがプロセスを所有するかを決定します。もう1つは「有効な」UIDであり、プロセスが持つ権限を決定します。 Linuxの説明は credentials(7) にあります。

'setuid'プログラムが起動すると、その「有効な」UIDのみが変更されるため、新しい特権がありますが、whoが起動したことはわかります。 (これにより、Sudoはsetuidですが、あなたが誰であるかを知ることができます。)

例:

$ Sudo cp /bin/id /bin/test-id
$ Sudo chmod u+s,g+s /bin/test-id

$ ls -la /bin/test-id
-rwsr-sr-x 1 root root 42K Jan  4 11:59 /bin/test-id*

$ /bin/test-id
uid=1000(grawity) gid=1000(grawity) euid=0(root) egid=0(root) groups=1000(grawity),3(sys),4(adm),10(wheel),100(users)

このような新しく開始されたプログラムには、すでにroot権限があります。たとえば、setuidビットをcatまたはlessに指定すると、すべてのユーザーがrootのみのファイルを読み取ることができます。

プログラムはこの状態を2つの方向に変更できます。両方のUIDをEUIDに変更できます(完全に「ルートになる」)、または両方を実際に変更できますUID(特権を削除して「通常の」ユーザーに戻る)。 Sudoが前者を実行すると思いますが、多くのプログラムが後者を実行していることもよくあります。

bashシェルも後者を実行することに注意してください。setuidビットを/bin/bashに渡そうとすると、setuid特権が放棄されます。起動、unless-p(-privileged)オプションで起動された場合。これはbashの flags.c および Shell.c で確認できます。

ftp!を使用する場合、提供されたコマンドは直接実行されないため、これは重要です。実際にはシェルを介して実行され、シェルに適用されることは!-コマンドにも適用されます。つまり、ftpによって開始されたshプロセスは、実際にはsetuidを継承します期待どおりの状態(euid = 0)ですが、提供されたコマンドを実行する前にそれを放棄します。

(これは、!/bin/bashを入力すると、実際には* 2 *シェルプロセスが実行されることを意味します。最初のプロセスは正しいeuidを持っていますが、2番目のプロセスを開始する前に特権を削除します。)

ftpに最初のシェルとして他のものを使用するように指示することで、これをテスト(およびバイパス)できます。

$ ls -l /bin/id /bin/test-ftp
-rwxr-xr-x 1 root root  42K Aug 19 12:54 /bin/id*
-rwsr-sr-x 1 root root 137K Jan  4 12:08 /bin/test-ftp*

$ Shell=/bin/id /bin/test-ftp
ftp> !
uid=1000(grawity) gid=1000(grawity) euid=0(root) egid=0(root) groups=0(root),3(sys),4(adm),10(wheel),100(users)
ftp>

(注:すべてのプログラムが$ Shellを参照するわけではありません。一部のプログラムは、常に/ bin/shを使用するか、シェルをまったく使用しません。)

1
user1686