回答:
問題は、スクリプトが実行されているものではないが、インタプリタ(ということでbash
、perl
、python
、など)。そして、インタプリタはスクリプトを読む必要があります。これはls
、インタープリターが行うように、プログラムがカーネルに直接ロードされるという点で、のような「通常の」プログラムとは異なります。カーネル自体がプログラムファイルを読み込んでいるので、読み込みアクセスを心配する必要はありません。通常のファイルを読み取る必要があるため、インタプリタはスクリプトファイルを読み取る必要があります。
これはバイナリに対してのみ可能です。
$ 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
。
あなたは、と思うことができます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
)ルートとして実行されていますラッパーファイルが同じユーザーによって所有されている限り、問題ではありません。)
755
少し理解するには少し時間がかかりました。
chmod 755
は0775 8進数と同じです。その周りに多くの混乱があります。これページ(manpagez.com/man/1/chmodは)私は...理解できないawfullとunneded水平スクロールがある
前の声明には半分の真実があります。スクリプトは、ユーザーが読めないようにセットアップできますが、それでも実行可能です。このプロセスは少し引き出されていますが、/ etc / sudoerで例外を作成することで実行できます。これにより、ユーザーはパスワードの入力を求められることなく、自分で一時的にスクリプトを実行できます。この方法:-他のディストリビューションのsetuidパッチを回避します。-すべてのユーザーにsudo権限を付与せずに、特定のスクリプトに対して一時的に昇格された権限を付与できます。
この投稿の指示に従ってください: ファイルのアクセス許可のみ実行
@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_PRELOAD
edハックを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
。
はい、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つの主要なオプションがあります。
最初のオプション
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が目的に十分です。