Bashのソースコードに実行ビットが必要ないのはなぜですか?

Bashのソースコードに実行ビットが必要ないのはなぜですか?

Bash では、source実行ビットを設定しなくてもスクリプトを実行できます。これは文書化され、予想される動作ですが、実行ビットの使用に違反しませんか?

わかりました、これはsourceサブシェルを生成しません。

答え1

sourceまたは同等ですが、標準指す.スクリプトを実行しませんが、読むコマンドをスクリプトファイルに保存し、現在のシェル環境で1行ずつ実行します。

シェルは実行ビットだけを使用すればよいので、実行ビットを使用することに反対することはありません。読むファイルの内容を読み取る権限です。

実行ビットは実行する場合にのみ必要です。走るスクリプト。このシェルはfork()新しいプロセスを使用します。execve()この関数は、スクリプト内で通常の実行可能ファイルでなければならない新しいプロセスイメージを生成します。

答え2

Bashはインタプリタです。入力を受け取り、必要に応じて行います。実行可能ビットには注意を払う必要はありません。実際、Bashは移植可能で、実行可能なビットの概念なしにオペレーティングシステムとファイルシステムで実行できます。

実行可能ビットの管理はオペレーティングシステムのカーネルです。execたとえば、Linuxカーネルは、操作を実行するときにファイルシステムがオプションでnoexecマウントされていないことを確認し、プログラムファイルの実行可能ビットを確認し、SELinuxやAppArmorなどのセキュリティモジュールによって課されるすべての要件を適用します。 。

実行可能ビットはややランダムなコントロールです。たとえば、Linux x86-64 システムでは、次のようにしてカーネルの実行可能ビットチェックをバイパスできます。/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2インタプリタとして明示的に呼び出される:

cp /bin/ls /tmp/
chmod -x /tmp/ls
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /tmp/ls

ld.soこれはインタプリタであり、実行されるコードがELF形式の機械語コードであることを除いて、BashからBashソースコードを取得するのと多少似ています。

答え3

nonsetuidファイルとnonsetguidファイルの実行可能ビット(他のビットとは異なり)はセキュリティメカニズムではありません。読みやすいもの、間接的に実行できます。 Linuxでは実行できますが、直接読み取ることができないすべてを間接的に読み取ることができます。 (これはset(g)uidではなくxビットが穴であるという概念を破るのに十分です。)安全対策)。

これがより便利です。ビットが設定されている場合はシステムに直接実行し、それ以外の場合は間接的に実行する必要があります(bash the_script;または一部ハッカーは読み取り権限なしで実行可能ファイルのメモリイメージを取得します。)。

非リソースを内部化して実行する場合は、便宜のためにこれを設定できます。

ただし、明らかに多くの共有ライブラリ実装者があなたのアイデアに同意するので、多くのシステムで使用するには、共有ライブラリ(基本的にはシェルインソースケーブルと基本的に同じ)を実行可能としてマークする必要があります。バラより共有ライブラリが実行可能なのはなぜですか?

答え4

オペレーティングシステムでは、シェルスクリプトを含むファイルは単なるデータです。これらのデータファイルの名前をコマンドに渡すか、コマンドラインsourceからbashシェル呼び出しに渡すと、オペレーティングシステムが見るすべては、データを含むファイル名と一致する文字列だけです。

この場合、実行ビットの関連性は何ですか?

関連情報