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


65

スクリプトを読み取る権限がない場合、スクリプトを実行することは可能ですか?ルートモードでスクリプトを作成し、他のユーザーにこのスクリプトを実行させたいが、読み取らせたくない。私がやったchmod許可が拒否されました:しかし、ユーザーモードでは、私が言うのメッセージを見て、読み取りおよび書き込みますが、実行できるように禁止します。


回答:


68

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


2
はい、でも彼の場合、解決策はありますか?
オリビエポンス

13
1つの可能性は、スクリプトを埋め込み、インタープリターを明示的に呼び出す単純なCプログラムを持つことです。Cプログラムには、実行するための読み取り権限は必要ありません。
アルケージュ

1
厳密に言えば、カーネルは、この場合には区別せず、それがされます実際にはシェル(実行可能ファイルがバイナリであるかのように同じ方法)を実行します。ただし、シェルは入力ファイル(スクリプトファイルの内容)を読み取れないため、すぐにクラッシュします。
ジョゼフ

34

これはバイナリに対してのみ可能です。

$ 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


非常に興味深い(hk​​trace)。
fthinker

1
シェルスクリプトをバイナリ形式に変換することは可能ですか?
ashim

4
実際、あなたはそれを防ぐことができると思います。現在のLinuxカーネルバージョンはプロセスをダンプ不可に設定します。つまり、ユーザーがバイナリの読み取りを許可されていない場合、通常のユーザーはそれを追跡できなくなります。
thejh

6

これは、少なくともLinuxでは不可能です(他のUnicesで許可されている場合があります)。それについて考えてください。スクリプトを実行するとき、シェルは何をすべきかを知るためにそれを読む必要があります。


3
確かにそれは可能です。OpenBSDでは、読み取り許可なしで任意のスクリプトを実行できます。内部では、インタープリターが使用する複製ファイル記述子を作成することでこれを行います。
エラドマン

@eradman私はそれを(例、説明、および私のコメントとともに)答えに入れました。
mosvy

3

あなたは、と思うことができます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が所有するように変更し、setuid許可を与えることを唯一の目的とする別のスクリプトを作成します。(他の全員による書き込み不可の状態に付随する。)

myscript-nonroot関数は誰でも読み取り可能であるため、読み取りと実行が可能であり、実際にスクリプトを実行する2行を取得するまでに(bash myscript)ルートとして実行されていますラッパーファイルが同じユーザーによって所有されている限り、問題ではありません。)


4755の意味?私はこれが初めてなので、それが何を意味するのか知りたいです。755の部分を理解しています。ありがとう
Kevdog777

2
4セットにsetuidビット。manpagezのchmod manページのModesセクションを参照してください
-quodlibetor

わかりませんが、まだよくわかりませんが、755少し理解するには少し時間がかかりました。
Kevdog777

うん、実際にchmod 755は0775 8進数と同じです。その周りに多くの混乱があります。これページ(manpagez.com/man/1/chmodは)私は...理解できないawfullとunneded水平スクロールがある
erm3nda

2

前の声明には半分の真実があります。スクリプトは、ユーザーが読めないようにセットアップできますが、それでも実行可能です。このプロセスは少し引き出されていますが、/ etc / sudoerで例外を作成することで実行できます。これにより、ユーザーはパスワードの入力を求められることなく、自分で一時的にスクリプトを実行できます。この方法:-他のディストリビューションのsetuidパッチを回避します。-すべてのユーザーにsudo権限を付与せずに、特定のスクリプトに対して一時的に昇格された権限を付与できます。

この投稿の指示に従ってください: ファイルのアクセス許可のみ実行


1

この状況では、NOPASSWDオプションを指定してsudoを使用したため、ユーザーはスクリプトを読み取れなくても実行できます。


0

OpenBSDで動作します

@eradmanのコメントですでに述べたように、これはOpenBSDで可能です。

ルートとして:

hzy# cat <<'EOT' >/tmp/foo; chmod 001 /tmp/foo
#! /bin/sh
: this is secret
echo done
EOT

通常のユーザーとして:

hzy$ cat /tmp/foo
cat: /tmp/foo: Permission denied
hzy$ /tmp/foo
done

これ/dev/fd/3は、インタプリタに(またはスクリプトに対するオープンfdが何であれ)渡すことで機能します。このトリックはLinuxでは機能しません。Linuxでは、開かれたときにfd /dev/fd/Nを返す特殊文字デバイスではなくdup(2)、元のファイル/歯科への「魔法の」シンボリックリンクがあり、ファイルを最初から開きます[1]。それは可能性がフリー/ NetBSDのまたはSolarisで実装します...

しかし、それはそれがクラックされているものではありません

基本的にx(実行)許可を与えることrは、シバンを持つファイル(読み取り)にも与えることを意味します[2]:

hzy$ cat /tmp/foo
cat: /tmp/foo: Permission denied
hzy$ ktrace -ti /tmp/foo
done
hzy$ kdump | tail -n8
 70154 sh       GIO   fd 10 read 38 bytes
       "#! /bin/sh
        : this is secret
        echo done
       "
 70154 sh       GIO   fd 1 wrote 5 bytes
       "done

ktrace唯一の方法ではありません。インタープリターがperlまたはなどの動的にリンクされた実行可能ファイルである場合、関数をオーバーライドpythonするLD_PRELOADedハックをread(2)代わりに使用できます。

いいえ、setuidに設定しても、通常のユーザーがそのコンテンツを見るのを防ぐことはできません。彼女は単にそれをの下ptrace(2)で実行することができ、setuidビットは無視されます:

ルートとして:

hzyS# cat <<'EOT' >/tmp/bar; chmod 4001 /tmp/bar
#! /bin/sh
: this is secret
id
EOT

通常のユーザーとして:

hzyS$ ktrace -ti /tmp/bar
uid=1001(duns) euid=0(root) gid=1001(duns) groups=1001(duns)
hzyS$ kdump
    ... nothing, the kernel disabled the ktrace ...
hzyS$ cc -Wall -xc - -o pt <<'EOT'
#include <unistd.h>
#include <sys/types.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <signal.h>

int main(int ac, char **av){
        int s; pid_t pid;
        if((pid = fork()) == 0){
                ptrace(PT_TRACE_ME, 0, 0, 0);
                execvp(av[1], av + 1);
        }
        while(wait(&s) > 0 && WIFSTOPPED(s)){
                s = WSTOPSIG(s);
                ptrace(PT_CONTINUE, pid, (caddr_t)1, s == SIGTRAP ? 0 : s);
        }
}
EOT
hzyS$ ./pt ktrace -ti /tmp/bar
uid=1001(duns) gid=1001(duns) groups=1001(duns)
hzyS$ kdump | tail -5
 29543 sh       GIO   fd 10 read 31 bytes
       "#! /bin/sh
        : this is secret
        id
       "

(これが最もわかりやすい方法ではない場合はごめんなさい)

[1]これはLinuxでを使用してエミュレートできますbinfmt_miscが、インタープリターを変更するか、ラッパーを使用する必要があります。最後の部分を参照この回答を例えば故意に途方もなく安全でない作られました。

[2]または一般的に、execve()を返さないファイルENOEXEC


-2

はい、rootユーザーであれば、読み取り権限なしでファイルを実行できます

# echo "echo hello" > test
# chmod 100 test
# ll test
---x------ 1 root root 10 Nov 29 12:13 test
# ./test
hello

ただし、他のユーザーでログインすると、このファイルを実行できません

$ ./test
-bash: ./test: Permission denied

3
これは実際には質問に答えません。なぜなら、rootは許可なくてもファイルを読み取ることができるからです。
wjandrea

-5

スクリプトを判読可能かつ実行可能にするために、3つの主要なオプションがあります。

最初のオプション

opensslコマンドを使用して、手動で暗号化します。また、将来、スクリプトを実行する場合は、opensslを手動で再度実行し、復号化するためのパスワードを提供する必要があります。

opensslによる暗号化:

cat yourscript.sh | openssl aes-128-cbc -a -salt -k yourpassword> yourscript.enc

opensslによる復号化:

猫yourscript.enc | openssl aes-128-cbc -a -d -salt -k yourpassword> yourscript.dec

yourscript.decは、元のスクリプトyourscript.shと同じになります

2番目のオプション

www.Enscryption.comなどのサイトを使用して、スクリプトを自動的に暗号化し、スクリプトの暗号化されたバージョンを実行可能にします。このサイトは、opensslの暗号化機能と他の難読化方法の両方を使用して、侵入者がスクリプトをこじ開けたり、隠したい秘密を明らかにすることを非常に困難にします。このサイトでは、シェルスクリプトとコマンドラインperl、python、rubyスクリプトを暗号化できます。私もPHPだと思います。

第三のオプション

shcなどのツールを使用します。2012年以降は更新されていないようですが、過去に使用しました。OSがコンパイルに使用したものと異なる場合、使用する各OSのスクリプトをコンパイルする必要があります。

概要:

コードを非表示にすることが非常に重要な場合は、ルートを持つ人なら誰でもアクセスできるので、アクセス許可と所有権のみに依存することが役立ちます。それは事実です。誰かがコードを不正に閲覧することを本当に防止したい場合、opensslコマンドの周りにスクリプトを書くことができます。スクリプトを実行する前にパスワードの入力を求め、パスワードが与えられた後、一時ファイルに書き込まずにスクリプトを実行するようにします。これがあまりにも多くの作業のように思える場合、オプション2と3が目的に十分です。


「shc」リンクは、以前の1ページも指します。このページ/サービスと提携している可能性はありますか?
phk

3
スクリプトを暗号化すると、キーなしでは実行できなくなります。キーを実行するためにユーザーに送信した場合、そのコンテンツを見ることができます。anwersこれは...愚かである
erm3nda
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.