ファイルが実行可能でない場合exec、Linuxカーネルのsyscallは失敗しEACCESます
あなたができる間、あなたがそれsh myprog.shをする./myprog.shときから、プログラムを実行できないようにしようとすると動作しません:
- Bashはexecシステムコールを使用します
./myprog.sh
- シバンは、https://stackoverflow.com/questions/2429511/why-do-people-write-the-usr-bin-env-python-shebang-onで
exec説明されているように、Linuxカーネルのシステムコールによって直接解釈されます-最初の行/ 40938801#40938801
- Linuxカーネルは、実行許可なしでファイルの実行を拒否します
これは次の方法で確認できます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で見つけることができます