回答:
myscript
次を含むファイルがあるとしましょう:
#!/bin/bash
echo "Hello, World!"
このファイルを実行可能にし、で実行すると./myscript
、カーネルは最初の2バイトが#!
であることがわかります。これは、スクリプトファイルであることを意味します。カーネルは、行の残りをインタープリターとして使用し、ファイルを最初の引数として渡します。だから、それは実行されます:
/bin/bash myscript
bashはファイルを読み取り、含まれているコマンドを実行します。
したがって、bash(またはスクリプトに必要なインタープリター)がスクリプトを「実行」するには、ファイルを読み取ることができれば十分です。
したがって、スクリプトの場合、実行ビットを使用すると、実行が少し便利になります。bashが実行可能である限り、スクリプトファイルを引数として常にbashを実行するか、bashを対話形式で実行し、スクリプトを1行ずつ端末にコピーして、コマンドを実行できます。
「シェルスクリプトの実行」と「shを使用したシェルスクリプトの実行」を混同しないようにしてください。
これは、次のファイルのアクセス許可の影響を受けませんfile.sh
。
sh file.sh
実行中sh
(プログラムに解決/bin/sh
)、file.sh
コードを読み取って実行します。
スクリプト自体を実際に実行すると、ファイルのアクセス許可が有効になります。
./file.sh
ファイル許可は、FATなどの非Linuxファイルシステムではサポートされていないことに注意してください。そのため、を実行してもchmod -x file.sh
、ファイルには以前のアクセス許可が保持されます。
実行許可はファイルシステムによって実施されます。ただし、プログラムはファイルの内容を読み取ることでコードを「実行」することもできます。これにより、「実行」のファイルシステム権限がバイパスされます。
bash
)を呼び出すことで実行できます。これにより、許可を取り消さなければならないことをブロックできますread
。
If you set the executable permission, the script can be run directly by users who have that permission - whether they have it on a group, world or owner basis
しかし、実行可能権限をチェックすることで、さまざまなユーザーに権限がどのように付与されますか?そして、私はあなたの2番目のポイントを得ました。スクリプトの読み取り許可を取り除いて、bashで処理することさえできないようにするということです。右?
sudo chmod g+x myfile.sh
は、ターミナルのようなものを呼び出して、ファイルのグループの実行許可を追加します。ファイル許可のチュートリアルを参照してください。複数のユーザーの権限を同時に管理するには、グループを使用します。たとえば、グループの管理を参照してください。
ファイルが実行可能でない場合exec
、Linuxカーネルのsyscallは失敗しEACCES
ます
あなたが行うことができますがsh myprog.sh
などのプログラムを実行しようと、(単にファイルや解釈をさ読み取る)./myprog.sh
あなたがそれを行うとき以来、ない仕事ができます:
exec
システムコールを使用します./myprog.sh
exec
説明されているように、Linuxカーネルのシステムコールによって直接解釈されます-最初の行/ 40938801#40938801これは次の方法で確認できますmain.c
。
#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *argv[] = {"myprog", NULL};
char *envp[] = {NULL};
int ret;
ret = execve("myprog.sh", argv, envp);
perror("execve");
printf("%d\n", errno);
printf("%d\n", EACCES);
}
およびmyprog.sh
:
#!/bin/sh
echo worked
場合はmyprog.sh
、実行可能ではない、main
と失敗します。
execve: Permission denied
13
13
Ubuntu 17.10でテスト済みgcc -std=c99
。
POSIX 7では次のように言及しています。
次の場合、fexecve()を除くexec関数は失敗します。
[EACCES]新しいプロセスイメージファイルのパスプレフィックスにリストされているディレクトリの検索許可が拒否されているか、新しいプロセスイメージファイルが実行許可を拒否しています。
さらなる根拠は、https://security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-theで見つけることができます