Системный вызов exec
ядра Linux завершается с ошибкой EACCES
если файл не является исполняемым
Хотя вы можете сделать sh myprog.sh
, попытка запустить программу как ./myprog.sh
не может работать, так как когда вы это делаете:
Это можно проверить с помощью 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 упоминает, что в:
Функции exec, за исключением fexecve(), должны завершиться ошибкой, если:
[EACCES] Отказано в разрешении на поиск для каталога, указанного в префиксе пути нового файла образа процесса, или новый файл образа процесса запрещает разрешение на выполнение.
Дополнительную информацию можно найти по адресу: https://security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the