доступ к необработанным сокетам как обычный пользователь на Linux 2.4 - PullRequest
10 голосов
/ 19 марта 2012

Во встроенной системе (ядро 2.4) мне нужен доступ к необработанному сокету к интерфейсу eth0 из процесса , а не , работающего от имени пользователя root.

Я попытался решить эту проблему, установив возможность CAP_NET_RAW из командной строки и программно используя cap_set_proc (), но оба безуспешно. Кажется, у меня нет разрешения на это, в программе я получаю ошибку EPERM, в командной строке

Не удалось установить ограничение на процесс `1586 ': (операция не разрешена)

Есть ли более простой способ сделать то, что я хочу? Если нет, какие шаги необходимы для успешной установки возможности CAP_NET_RAW?

РЕДАКТИРОВАТЬ: У меня есть доступ с правами root, но запуск процесса на постоянной основе от имени root не вариант. Версия libcap - 1.10, двоичного файла setcap нет, но есть setpcaps.

РЕДАКТИРОВАТЬ - отвечая Георгию Скопцову:

Если я вас правильно понял, вы предлагаете запустить процесс с помощью setuid, затем установить возможность CAP_NET_RAW и затем отбросить привилегии. Я попробовал это с помощью следующего кода, но, похоже, он не работает, хотя команда caps не возвращает ошибок. С закомментированным seteuid (), raw доступ работает, но только если процесс запущен от имени пользователя root:

cap_t caps = cap_get_proc();
cap_value_t cap_list[1];
cap_list[0] = CAP_NET_RAW;
if (cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1)
{
    printf("cap_set_flag error");
}
if (cap_set_proc(caps) == -1)
{
    printf("cap_set_proc error");
}

if (seteuid(getuid()) != 0) 
{
    printf("seteuid error");
}

function_that_needs_raw_access();

Спасибо за вашу помощь. Chris

Ответы [ 4 ]

8 голосов
/ 19 марта 2012

Как правило, вам необходимы права доступа root для получения необработанных пакетов на интерфейсе. Это ограничение является мерой безопасности, поскольку процесс, который получает необработанные пакеты, получает доступ к сообщениям всех других процессов и пользователей, использующих этот интерфейс.

Однако, если у вас есть доступ к root на компьютере, вы можете использовать флаг setuid , чтобы предоставить привилегии root для вашего процесса , даже если процесс выполняется как пользователь без полномочий root .

Во-первых, убедитесь, что эта возможность успешно установлена ​​при запуске процесса от имени пользователя root. Тогда используйте

sudo chown root process
sudo chmod ugo+s process 

, чтобы установить root как владельца процесса и установить флаг setuid. Затем убедитесь, что возможность установлена, когда процесс запущен другими пользователями. Поскольку теперь этот процесс будет иметь все привилегии суперпользователя, вы должны соблюдать меры предосторожности и отбросить привилегии, как только ваш код больше не требует этого (после включения CAP_NET_RAW).

Вы можете следовать этому методу , чтобы убедиться, что вы правильно их отбрасываете.

3 голосов
/ 05 ноября 2016

Вы можете дать исполняемой программе возможность использовать привилегию CAP_NET_RAW, не предоставляя ей других привилегий root.

$ setcap cap_net_raw=pe *program*

Вы не можете дать эту привилегию, не имея этой привилегии. Конечно, root может дать эту привилегию программам.

3 голосов
/ 19 марта 2012

Процесс должен быть запущен от имени пользователя root или иметь возможности CAP_NET_RAW для исполняемого файла.

Чтобы установить CAP_NET_RAW, вам нужно запустить команду setcap от имени пользователя root.После установки вы можете запустить исполняемый файл от имени другого пользователя, и у него будет доступ к перехвату необработанных пакетов.

Если у вас все равно нет корневого доступа, и вы не можете получить кого-либо с корневым доступом для установки CAP_NET_RAW илиsetuid root в исполняемом файле, вы не сможете выполнять захват пакетов как пользователь без полномочий root.

0 голосов
/ 14 сентября 2017

TL; DR IMHO не поддерживается в ядре <3.0. </strong>

Была дискуссия о поддержке в списке рассылки ядра netdev: https://lwn.net/Articles/420800/ и https://lwn.net/Articles/420801/.

И включил его в коммит c319b4d76b9e583a5d88d6bf190e079c4e43213d , выпущено в ядре 3.0:

commit c319b4d76b9e583a5d88d6bf190e079c4e43213d
Author: Vasiliy Kulikov <segoon@openwall.com>
Date:   Fri May 13 10:01:00 2011 +0000

    net: ipv4: add IPPROTO_ICMP socket kind

Follows: v2.6.39-rc2
Precedes: v3.0-rc1

Выполнение ping без CAP_NET_RAW (т.е. без возможности настройки или без set-uid) было реализовано для проверки связи в ревизии 87dbb3a5db657d5eae6934707beaf0507980a1c3 , выпущено в iputils s20150815 *

commit 87dbb3a5db657d5eae6934707beaf0507980a1c3
Author: Nikos Mavrogiannopoulos <nmav@redhat.com>
Date:   Fri May 29 11:01:00 2015 +0200

    This patch allows running ping and ping6 without root privileges on
    kernels that support it. Almost identical to Lorenzo
    Colitti's original patch except:
    ...

Follows: s20140519
Precedes: s20150815
...