por que o bit suid não está definido após a modificação do arquivo

por que o bit suid não está definido após a modificação do arquivo

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.

informação relacionada