Eu tenho um arquivo executável com o conjunto de bits setuid, o arquivo é de propriedade de root: root. Esse executável é usado para permitir que um processo não privilegiado altere determinadas partes da configuração do sistema. Alterar arquivos de configuração pertencentes ao root, por exemplo, / etc / network / interfaces, funciona bem. Então o bit setuid parece funcionar corretamente.
No entanto, quando o executável chama systemctl ou timedatectl, a autenticação interativa interrompe o processo:
==== AUTENTICANDO PARA org.freedesktop.systemd1.manage-units === A autenticação é necessária para reiniciar o 'networking.service'.
O arquivo executável é chamado sem qualquer interação do usuário pelo backend de um frontend de usuário baseado na web. Portanto, é possível inserir uma senha.
Por que a autenticação é necessária para chamar systemctl quando o bit setuid está obviamente configurado corretamente e a chamada para systemctl deve estar acontecendo com permissões de root?
getfacl nos retornos executáveis:
# owner: root
# group: root
# flags: s--
user::r-x
group::r-x
other::r-x
O executável reside no sistema de arquivos raiz, que é montado com opções "errors = remount-ro". O setuid não é ignorado, pois altera o conteúdo dos arquivos de configuração de propriedade do root.