実行のみのファイルについては、誰がインタプリタを実行しますか?

実行のみのファイルについては、誰がインタプリタを実行しますか?

#!/path/to/interpreter現在のユーザーがファイルに対する実行(--x)権限しか持っていない場合、どのユーザーの下でインタプリタ(ファイルの先頭に指定)が実行されますか?

現在、ユーザーはファイルを読み取る権限がないため、そのユーザーにすることはできません。インタプリタに含まれるすべてのコードはrootアクセス権を持っているため、rootにすることはできません。

では、インタプリタプロセスはどのユーザとして実行されますか?

編集:私の質問は、ファイルが指定した通訳者を知るのに十分に読んだと仮定していますが、実際にはそれまで届かないと思います。現在、シェル(通常b / a / sh)がターゲットファイルを実行するために解釈するコマンドは、そのファイルを読み取ろうとしますが失敗します。

ベストアンサー1

ユーザーに実行可能なスクリプトに対する読み取り権限がない場合は、実行してみてください。失敗するCAP_DAC_OVERRIDE、彼女に能力がない場合(たとえば、ルートの場合):

$ cat > yup; chmod 100 yup
#! /bin/sh
echo yup
^D
$ ./yup
/bin/sh: 0: Can't open ./yup

インタプリタは(失敗や成功に関係なく)スクリプトのsetuidビットまたはsetcap拡張属性を無視し、常に現在のユーザとして実行されます.

実行可能なスクリプトは、実行するためにインタプリタが開いて読み取ることができる必要があるという点でバイナリとは異なります。ただし、これは単にインタプリタに引数として渡され、インタプリタはこれをまったく読み取ろうとするのではなく、まったく異なる操作を実行できます。

$ cat > interp; chmod 755 interp
#! /bin/sh
printf 'you said %s\n' "$1"
^D
$ cat > script; chmod 100 script
#! ./interp
nothing to see here
^D
$ ./script
you said ./script

もちろん翻訳者はそれ自体setuidまたはcap_dac_override=ep-setcapバイナリ(またはそのバイナリの引数としてスクリプトパスを渡す)にすることができます。この場合、高い権限で実行され、すべてのファイル権限は無視できます。

Linuxでbinfmt_miscを介して読み取れないSetuidスクリプト

Linuxでは、次のモジュールを使用して実行可能なスクリプトのすべての制限をバイパスすることができます(そしてシステムを損傷する可能性があります;-))binfmt_misc

ルートとして:

# echo ':interp-test:M::#! ./interp::./interp:C' \
    > /proc/sys/fs/binfmt_misc/register

# cat > /tmp/script <<'EOT'; chmod 4001 /tmp/script # just exec + setuid
#! ./interp
id -u
EOT

一般ユーザーとして:

$ echo 'int main(void){ dup2(getauxval(AT_EXECFD), 0); execl("/bin/sh", "sh", "-p", (void*)0); }' |
    cc -include sys/auxv.h -include unistd.h -x c - -o ./interp
$ /tmp/script
0

女皮族に生まれた若いエリート層!

詳細については、次を参照してください。Documentation/admin-guide/binfmt-misc.rstカーネルのソースコードから。

この-pオプションは一部のシェルでエラーを引き起こす可能性があります(オプションは単に削除できます)、最新バージョンではエラーを防ぐためにdashこのオプションが必要です。bash特権を放棄する要求なしで。

おすすめ記事