Это может не дать причину, по которой некоторые парни где-то решили так или иначе, но некоторые инструменты и интерфейсы аудита могут еще не знать о возможностях.
Примером является proc_connector интерфейс netlink и программы на его основе (например, forkstat
): существуют события для процесса, изменяющего свои учетные данные, но не для его изменения его возможностей.
FWIW, причина, по которой you может не получить, например, net_raw+ep
ping(8)
вместо setuid в дистрибутиве, подобном Debian, заключается в том, что это зависит от утилиты setcap(8)
из libcap2-bin
пакет уже существует до вы устанавливаете ping
. С iputils-ping.postinst
:
if command -v setcap > /dev/null; then
if setcap cap_net_raw+ep /bin/ping; then
chmod u-s /bin/ping
else
echo "Setcap failed on /bin/ping, falling back to setuid" >&2
chmod u+s /bin/ping
fi
else
echo "Setcap is not installed, falling back to setuid" >&2
chmod u+s /bin/ping
fi
Также обратите внимание, что ping
сам по себе откажется от любых привилегий setuid и переключится на использование возможностей на Linux при запуске, так что ваши опасения по поводу этого могут быть немного преувеличены. От ping.c
:
int
main(int argc, char **argv)
{
struct addrinfo hints = { .ai_family = AF_UNSPEC, .ai_protocol = IPPROTO
_UDP, .ai_socktype = SOCK_DGRAM, .ai_flags = getaddrinfo_flags };
struct addrinfo *result, *ai;
int status;
int ch;
socket_st sock4 = { .fd = -1 };
socket_st sock6 = { .fd = -1 };
char *target;
limit_capabilities();
От ping_common.c
void limit_capabilities(void)
{
...
if (setuid(getuid()) < 0) {
perror("setuid");
exit(-1);
}