Eu tenho um arquivo (s|g)uid gravável mundialmente:
ls -lh suid_bin.sh
-rwsr-srwx 1 root root 168 mai 23 16:46 suid_bin.sh
conectado com uma conta de usuário não root. Eu uso o vi (ou outro editor) para modificar "suid_bin.sh". Depois de salvar o novo conteúdo, os bits (s|g)uid são desativados:
ls -lh suid_bin.sh
-rwxr-xrwx 1 root root 168 mai 23 16:46 suid_bin.sh
Por que? Existe uma maneira de manter os bits (s|g)uid após a modificação?
Responder1
As permissões Unix permitem gravar em um arquivo se acidentalmente alguém definir um bit gravável de grupo ou mundial no arquivo setuid, mas não permitem a alteração de proprietários e IDs de grupo em tais arquivos por estranhos.
Portanto, após a modificação, o kernel descarta os bits setuid/setgid do arquivo para garantir que nenhum código malicioso foi gravado no arquivo.
O usuário root, é claro, pode restaurar o bit setuid, mas o usuário comum, se ele, por engano de alguém, obtiver acesso de gravação ao executável privilegiado, não será capaz de explorá-lo.
E, conhecendo partes do kernel nessa área, não tenho certeza se você pode desabilitar isso sem editar o código-fonte do kernel e recompilar.
Observe que os scripts setuid no Linux não ganham status setuid após a execução porque na verdade o kernel inicia o interpretador de script, sem status setuid, com o caminho completo para o script como seu último argumento analisado, e então o interpretador lê o script como um arquivo comum. Mas isso pode variar em outros sistemas Unix.