スクリプトは実行可能ですが、読み取ることはできませんか?

スクリプトは実行可能ですが、読み取ることはできませんか?

スクリプトを読み取る権限がなくてもスクリプトを実行できますか?ルートモードでは、他のユーザーが実行を読み取ることを禁止するスクリプトを作成しました。読み取りと書き込みを無効にしましたが、chmod実行は許可しましたが、ユーザーモードでは権限が拒否されましたというメッセージが表示されます。

答え1

問題は、実行中のスクリプトではなくインタプリタ(bashperlなどpython)ということです。通訳者はスクリプトを読む必要があります。lsこれは、プログラムがインタプリタのようにカーネルに直接ロードされるという点で、「通常の」プログラムとは異なります。カーネル自体がプログラムファイルを読み込んでいるので、読み取りアクセスを心配する必要はありません。インタプリタは、通常のファイルを読み取るのと同じようにスクリプトファイルを読み取る必要があります。

答え2

これはバイナリファイルでのみ機能します。

$ chown foo:foo bar
$ chmod 701 bar

権限のないユーザーとして:

$ ls -lha bar
-rwx-----x 1 foo foo 7.0K 2012-03-15 03:06 bar

$ cat bar
cat: bar: Permission denied

$ ./bar
baz

これで問題が発生します。既存の方法ではファイルを読み取ることはできませんが、実際にファイルを読み取ることを防ぐことはできません。実際、これは挑戦です。http://smashthestack.org/(レベル13)。hktraceを使用できるよく知られたユーティリティがありますptrace

答え3

以前の声明は半分だけです。ユーザーが読み取ることはできませんが、実行を続行できるようにスクリプトを設定できます。プロセスは少し長くなりますが、/etc/sudoerに例外を設定して、ユーザーがパスワードを入力するように求めるメッセージを表示せずにスクリプトを一時的に実行できるようにすることで完了できます。この方法は次のとおりです。 - 他のディストリビューションのsetuidパッチをバイパスします。 - ユーザーにすべてのものに対するsudo権限を付与せずに、特定のスクリプトに対して昇格された権限を一時的に付与できます。

この文書の指示に従ってください。 ファイル権限は実行のみ可能

答え4

私はあなたがこれを行うことができると思いますsetuid

しかし、そうすることはできません。ほとんどのディストリビューションでは、setuid大きなセキュリティホールがあるため(明らかに)無効にしたからです。私の場合は無効になっていて、この答えがうまくいくかどうかは実際にはわかりません。それでも効果があるようでポストします。しなければならない

とにかく、私がしたいことをしたかったし、setuidスクリプトサポートディストリビューションがあった場合は、次のようにします。

$ chmod 700 myscript
$ cat > myscript-nonroot
#!/bin/sh
bash myscript
^D
$ sudo chown root:root myscript-nonroot
$ sudo chmod 4755 myscript-nonroot # make SURE this isn't world-writable!

つまり、root読み取り専用スクリプトを呼び出し、それをroot所有に変更し、setuid権限を付与することが唯一の目的である別のスクリプトを作成します。 (そしてそれに伴う他人の書けない状態。)

myscript-nonroot関数は誰でも読むことができますので、読み込んで実行することができますbash myscript。誰かは関係ありません。 、正しいユーザー)は、同じユーザーがラッパーファイルを所有している限り実行中です。 )

関連情報