Eu estava lendo a man
página do chown
. Não entendo por que S_ISUID
o S_ISGID
modo deve ser desmarcado quando a função retorna com êxito.
Responder1
Acho que você está apontando para isso na página de manual:
Quando o proprietário ou grupo de um arquivo executável é alterado por um usuário sem privilégios, os bits de modo S_ISUID e S_ISGID são apagados.
Então, por que eles foram liberados agora? Você vê que eles só são liberados no caso de umexecutávelarquivo. Porque quando um dos bits (SUID/SGID) é definido, o usuário sem privilégios pode executar o arquivo como o novo proprietário do arquivo. Isso seria uma enorme violação de segurança.
Responder2
Acho que você leu errado man 2 chown
:vocênão precisa limpar S_ISUID
e S_ISGID
, eles serão limpos automaticamente quando você usar essa função como um usuário sem privilégios. Se o seu programa estiver rodando, root
o comportamento (no Linux) depende da versão do kernel.
Se você precisar dos bits definidos, basta reaplicá-los (assumindo que a conta que tenta defini-los tenha privilégios para fazê-lo).
Na página de manual:
When the owner or group of an executable file are changed by an
unprivileged user the S_ISUID and S_ISGID mode bits are cleared.
POSIX does not specify whether this also should happen when root does
the chown(); the Linux behavior depends on the kernel version. In
case of a non-group-executable file (i.e., one for which the S_IXGRP
bit is not set) the S_ISGID bit indicates mandatory locking, and is
not cleared by a chown().