La execsyscall del kernel de Linux falla EACCESsi el archivo no es ejecutable
Si bien puede hacerlo sh myprog.sh, tratar de ejecutar el programa como ./myprog.shno puede funcionar, ya que cuando lo hace:
Esto se puede verificar con 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);
}
y myprog.sh:
#!/bin/sh
echo worked
Si myprog.shno es ejecutable, mainfalla con:
execve: Permission denied
13
13
Probado en Ubuntu 17,10, gcc -std=c99.
POSIX 7 menciona que en:
Las funciones ejecutivas, excepto fexecve (), fallarán si:
[EACCES] Se denegó el permiso de búsqueda para un directorio que figura en el prefijo de ruta del nuevo archivo de imagen de proceso, o el nuevo archivo de imagen de proceso niega el permiso de ejecución.
Se pueden encontrar más razones en: https://security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the