пятница, 13 сентября 2019 г.

linux: команда ping и административные привилегии

Заинтересовал исходный код команды ping. Быстро нашелся работающий пример, но насторожило, что работает этот пример только с правами администратора.

Выяснилось, что дело в конструкции socket(AF_INET, SOCK_RAW, IPPROTO_ICMP). Оказывается, непривилегированным пользователям не позволено открывать raw-сокеты. Сделано это, как я понял, из соображений безопасности: raw-сокеты относятся к третьему уровню модели OSI, и могут ничего не знать о портах и прочих прелестях TCP, UDP и т.д., отдавая обработку IP-пакетов целиком на откуп программисту.

Однако возникает закономерный вопрос: команда ping же как-то работает без sudo. Подобное поведение возможно благодаря хитрым правам, розданным файлу /bin/ping. Если у нас есть файл /home/huh-muh/myprog, и мы хотим сделать его таким же крутым, этого можно достигнуть двумя путями.

1. Выполнить последовательность команд:
# chown root:root /home/huh-muh/myprog
# chgrp u+s /home/huh-muh/myprog

2. Либо воспользовавшись capabilites:
#filecap /home/huh-muh/myprog net_raw net_admin

или

#setcap cap_net_raw,cap_net_admin=eip /home/huh-muh/myprog

Посмотреть, какие права даны программе, можно командой:

#getcap /home/huh-muh/myprog