这可能无法解释为什么某些地方的某些家伙会以某种方式决定,但某些审计工具和接口可能还不知道功能。
一个例子是proc_connector netlink 接口和基于它的程序(如forkstat
):有一个进程更改其凭据的事件,但不是它更改其功能的事件。
FWIW,您可能无法在类似 Debian 的发行版上获得例如 anet_raw+ep
ping(8)
而不是 setuid 的原因是因为这取决于安装之前已经存在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);
}