Um não proprietário não pode ler o arquivo porque setuid e setgid afetam somente as permissões efetivas quando o arquivo é executado ; caso contrário, as permissões de arquivo serão usadas. Veja um exemplo de programa para tentar:
readme.c
#include <stdio.h>
int main(int argc, char **argv) {
FILE *f;
int i;
char c;
if(argc>1) {
f=fopen(argv[1],"rb");
for(i=1; i++<100;) {
c=getc(f);
printf("%x%s", (int)c, i%50?" ":"\n");
}
fclose(f);
}
}
Compile e altere suas permissões como alguém diferente de com quem você deseja testar (usei root
):
# gcc -Wall -o readme readme.c
# chown root:root readme
# chmod ug+s,o-rw readme
Verifique as permissões e tente ler o arquivo como seu usuário de teste:
erik ~ $ ls -la readme
-rwsr-s--x 1 root root 8064 May 4 12:05 readme
erik ~ $ cat readme
cat: readme: Permission denied
Agora, tente executar o programa e leia-o:
erik ~ $ ./readme readme
7f 45 4c 46 2 1 1 0 0 0 0 0 0 0 0 0 3 0 3e 0 1 0 0 0 fffffff0 5 0 0 0 0 0 0 40 0 0 0 0 0 0 0 40 18 0 0 0 0 0 0 0
0 0 0 40 0 38 0 9 0 40 0 1d 0 1c 0 6 0 0 0 4 0 0 0 40 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 fffffff8 1 0
Você verá que não teve problemas, porque as permissões efetivas foram alteradas para um usuário com permissões de leitura.
Por que isso acontece? Várias razões vêm à mente. Primeiro, não há necessidade real de alguém ter permissões de leitura para executar um executável porque o kernel (que carrega o programa) tem permissões completas para fazer qualquer coisa já. Você só precisa ter permissões de leitura se quiser ver o conteúdo do arquivo executável, geralmente para poder copiar o arquivo. É possível, para citar alguns exemplos possíveis, que o executável tenha dados confidenciais que os usuários não devem ver (o que é strongmente desencorajado, mas aconteceu!) Ou o sistema está usando isso como uma defesa em profundidade para impedir que as pessoas encontrem exploits.