Система 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] У дозволі на пошук відмовлено в каталозі, вказаному в префіксі шляху нового файлу образу процесу, або новий файл зображення процесу відхиляє дозвіл на виконання.
Подальше обґрунтування можна знайти на веб-сторінці : /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the