O sentido geral da observação de @rui-f-ribeiro está correto, mas os detalhes não são. Detalhes são importantes. O Ubuntu usa esses pacotes:
O utilitário ping redefine as permissões em uma função chamada limit_capabilities
, compartilhada por ping e ping6. O pedaço de código relevante se parece com isto:
if (prctl(PR_SET_KEEPCAPS, 1) < 0) {
perror("ping: prctl");
exit(-1);
}
if (setuid(getuid()) < 0) {
perror("setuid");
exit(-1);
}
if (prctl(PR_SET_KEEPCAPS, 0) < 0) {
perror("ping: prctl");
exit(-1);
}
cap_free(cap_p);
cap_free(cap_cur_p);
#endif
uid = getuid();
euid = geteuid();
#ifndef CAPABILITIES
if (seteuid(uid)) {
perror("ping: setuid");
exit(-1);
}
#endif
Isto é (leia o código fonte), ping
realiza várias operações privilegiadas e descarta privilégios - mas pode ser construído para se comportar de diferentes maneiras de acordo com a preferência de cada um.
Curiosamente, as notas do changelog:
iputils (3:20121221-2) unstable; urgency=low
* Enable the CAP_NET_RAW capability and strip the setuid bit on ping and
ping6 binaries if possible.
A história de passwd
é semelhante, com detalhes diferentes. Ele faz parte do conjunto de ferramentas shadow , que pode eliminar privilégios em change_root
:
/* Drop privileges */
if ( (setregid (getgid (), getgid ()) != 0)
|| (setreuid (getuid (), getuid ()) != 0)) {
fprintf (stderr, _("%s: failed to drop privileges (%s)\n"),
Prog, strerror (errno));
exit (EXIT_FAILURE);
}
Mas isso só acontece em um caso especial:
/*
* process_root_flag - chroot if given the --root option
*
* This shall be called before accessing the passwd, group, shadow,
* gshadow, useradd's default, login.defs files (non exhaustive list)
* or authenticating the caller.
*
* The audit, syslog, or locale files shall be open before
*/
No caso normal, ele garante que tem privilégios e não os elimina (porque não há mais nada a fazer que não requeira o privilégio):
if (setuid (0) != 0) {
(void) fputs (_("Cannot change ID to root.\n"), stderr);
SYSLOG ((LOG_ERR, "can't setuid(0)"));
closelog ();
exit (E_NOPERM);
}
A maioria dos utilitários não redefine o comportamento setuid / setgid, presumindo que eles não estejam instalados com essas permissões.