sudo
バイナリが有効になっているため、起動時にルートに昇格しますsetuid
。ただし、/bin/login
正しい権限を付与しsudo
て root 以外のユーザーから実行しようとすると、次のエラーが発生します。
No utmp entry. You must exec "login" from the lowest level "sh"
最初の質問は、このエラーはどういう意味ですか? 2番目の質問は、sudo login
同じユーザーとして実行するとなぜ機能するのですか?です。 aを使用してrootに昇格する以外に、setuuid
他の機能は何ですかsudo
?実行して終了dash
する簡単なスクリプトを作成しましたが、権限のないユーザーのユーザー名が返されました。~/root
whoami
$ ls -l ./root /usr/bin/sudo
-rwsr-xr-x 1 root root 29 Jul 15 02:40 ./root
-rwsr-xr-x 1 root root 157760 Jan 10 2016 /usr/bin/sudo
$ ./root
unprivileged user
だから、3つの質問があります。
- どのエラーが発生しますか
login
? - なぜ
login
一緒に働くのですsudo
か? - 単純な実行スクリプト
whoami
が機能しないのはなぜですか?
答え1
どのエラーが発生しますか
login
?
ソースコードを検索すると、次のようなフレーズを見るlogin
ことができます。
amroot = (getuid () == 0);
[...]
utent = get_current_utmp ();
/*
* Be picky if run by normal users (possible if installed setuid
* root), but not if run by root. This way it still allows logins
* even if your getty is broken, or if something corrupts utmp,
* but users must "exec login" which will use the existing utmp
* entry (will not overwrite remote hostname). --marekm
*/
if (!amroot && (NULL == utent)) {
(void) puts (_("No utmp entry. You must exec \"login\" from the lowest level \"sh\""));
exit (1);
}
興味深い部分は最後のif節です。getuid()
このエラーメッセージは、がゼロではなくutmpエントリがない場合に発生します。getuid()
返品実際のユーザーID呼び出しプロセス。呼び出し時にsetuidフラグを設定すると、login
実際のuidと有効なuidが異なります。login
ソースコードの断片の注釈が示すように、この場合は「トリッキー」な作業を行う必要があります。失敗し、言及されたエラーが発生します。
なぜ
login
一緒に働くのですsudo
か?
sudo
setuid ビット自体がセットされているので、euid と ruid は異なります。ただし、sudoはバイナリを実行し、実用login
的で効果的なuidをターゲットユーザーに設定します。その後、再び失敗しません。
単純な実行スクリプト
whoami
が機能しないのはなぜですか?
#!
スクリプトにshebang行()があるようです。何が起こるかは次のとおりです。カーネルは実行可能ファイル(あなたのテキストファイル)を開き、テキスト文書ではなくスクリプト名を最初の引数として使用してshebang行(または)#!
に指定されたインタプリタを呼び出します。ほとんどの UNIX および Linux オペレーティングシステムはセキュリティ上の問題であるため、スクリプトの設定時に setuid ビットを無視します。/bin/bash
/bin/sh
setuidを設定するスクリプトを想像してください。その後、攻撃者はそのスクリプトへのシンボリックリンクを作成し、そのスクリプトを呼び出してから、通訳者がシンボリックリンクの背後にあるスクリプトを開く前に自分のスクリプトへのシンボリックリンクを変更する可能性があります(これは邪悪なスクリプトです)。