O exec
syscall do kernel do Linux falha EACCES
se o arquivo não for executável
Enquanto você pode fazer sh myprog.sh
, tentar executar o programa como ./myprog.sh
não pode funcionar, desde quando você faz isso:
Isso pode ser verificado com 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);
}
e myprog.sh
:
#!/bin/sh
echo worked
Se myprog.sh
não for executável, main
falha com:
execve: Permission denied
13
13
Testado no Ubuntu 17.10 gcc -std=c99
,.
O POSIX 7 menciona que em:
As funções exec, exceto fexecve (), falharão se:
[EACCES] A permissão de pesquisa é negada para um diretório listado no prefixo do caminho do novo arquivo de imagem de processo ou o novo arquivo de imagem de processo nega a permissão de execução.
Uma justificativa adicional pode ser encontrada em: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the