setuid権限でBashスクリプトを作成していますが、動作しません。だからここで私の解決策を見つけました。
今私のスクリプトはうまくいきます(cppを使って書き直しました)。
純粋なBashシェルが機能しない理由の好奇心を満たすために、次のリンクを読んでください。http://www.faqs.org/faqs/unix-faq/faq/part4/section-7.html(この回答を参照してください:https://unix.stackexchange.com/a/2910)。そのサイトで以下を見つけました。
$ echo \#\!\/bin\/sh > /etc/setuid_script
$ chmod 4755 /etc/setuid_script
$ cd /tmp
$ ln /etc/setuid_script -i
$ PATH=.
$ -i
4行目がわかりませんln /etc/setuid_script -i
。
このコマンドは何をしますか?
マニュアルでは、ln
これは-i
「対話型」フラグ(既存のファイルを上書きするかどうかを尋ねるメッセージ)であることを読みました。それでは、なぜ私のシェルをln /etc/setuid_script -i
実行しPATH=.
て実行させるのですか?-i
/bin/sh -i
答え1
このコードは、現在ディレクトリから呼び出されているファイルへのハードリンクをln /etc/setuid_script -i
生成するように設計されています。 GNUツールを使用している場合は、機能するにはこれを行う必要があります-i
。ln -- /etc/setuid_script -i
シェルは、3つの異なる方法で実行するコマンドを取得できます。
- 文字列から。
sh -c "mkdir /tmp/me"
ロゴと共に使用されます-c
。 - ファイルから。使用
sh filename
- 端末では、
sh -i
または を使用しますsh
。
foo
歴史的に「カーネルから始まる」というシェルスクリプトがある場合は、コマンドを読み取る2番目の方法を使用するように指示する#!/bin/sh
ファイル名でこれを呼び出しました。/bin/sh foo
ファイル名を指定すると、-i
カーネルはそれを呼び出して/bin/sh -i
3番目の方法を取得します。
競争条件もあります。これは利用されました。
exec
スクリプトを起動するには、システムコールを実行してください。- カーネルはファイルがSUIDであることを確認し、それに応じてプロセスの権限を設定します。
- カーネルはファイルの最初の数バイトを読み取り、ファイルがどのタイプの実行可能ファイルであるかを確認し、その
#!/bin/sh
ファイルが/bin/shスクリプトだと思います。 - 攻撃者はスクリプトを交換しました。
- カーネルは現在のプロセスを/bin/shに置き換えます。
- /bin/sh はファイル名を開き、コマンドを実行します。
これは古典ですTOCTTOU(使用時間確認)攻撃。ステップ2の確認は、ステップ6(公開呼び出しで)で使用されたファイルとは異なるファイルに対して行われます。
今、両方のバグが一般的に修正されました。
答え2
リンクした文書(http://www.faqs.org/faqs/unix-faq/faq/part4/section-7.html)は(おそらく)UNIXシステムでの動作を説明しておりln
、Linuxシステム(またはより正確にはGNU / Linux)のマニュアルを見てください。 GNUはここで関連部分です。 GNUにはln
あなたが言及したオプションがあります:
-i, --interactive
prompt whether to remove destinations
しかし、これはGNU拡張であり、GNU拡張の一部ではありません。POSIX規格次のオプションフラグのみが定義されます。
-f
Force existing destination pathnames to be removed to allow the link.
-L
For each source_file operand that names a file of type symbolic link, create a (hard) link to the file referenced by the symbolic link.
-P
For each source_file operand that names a file of type symbolic link, create a (hard) link to the symbolic link itself.
-s
Create symbolic links instead of hard links. If the -s option is specified, the -L and -P options shall be silently ignored.
したがって、-i
これは有効なオプションではないため、ln
このコマンドは実際にln /etc/setuid_script -i
指すというハードリンクを生成します。次に、命令は現在のディレクトリにある実行可能ファイルのみを検索するように変数をオーバーライドします。これは現在のディレクトリに指定されたファイルが実行されることを意味し、ハードリンクなのでスクリプトが実行されることを意味します。ただし、これはシェルスクリプトなので、実際のコマンドの実行はです。-i
/etc/setuid_script
PATH=.
PATH
-i
-i
/etc/setuid_script
/bin/sh -i