Почему многие Linux дистрибутивы используют setuid вместо возможностей? - PullRequest
1 голос
/ 24 марта 2020

capabilities(7) - отличный способ не дать процессу всех привилегий root, и вместо setuid(2) можно использовать AFAIK. Согласно this и многим другим,

"К сожалению, во многих двоичных файлах установлен бит setuid, в то время как их следует заменить на capabilities."

В качестве простого примера, в Ubuntu,

$ ls -l `which ping`
-rwsr-xr-x 1 root root 44168 May  8  2014 /bin/ping

Как вы знаете, установка suid / guid для файла изменяет эффективный идентификатор пользователя на root. Таким образом, если в программе с поддержкой suid есть изъян, непривилегированный пользователь может выйти из нее и стать эквивалентом root пользователя.

Мой вопрос: почему во многих дистрибутивах Linux все еще используется setuid метод при настройке capabilities можно использовать вместо этого с меньшими проблемами безопасности?

1 Ответ

1 голос
/ 24 марта 2020

Это может не дать причину, по которой некоторые парни где-то решили так или иначе, но некоторые инструменты и интерфейсы аудита могут еще не знать о возможностях.

Примером является 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);
        }
...