2015-03-04 5 views
1

Мне нужно написать функцию ping для работы в Linux. Язык - C++, поэтому C тоже отлично.Открытие RAW-сокетов в Linux без суперпользователя

Поиск в Интернете и смотреть на исходный код для команды ping, то получается, что я должен создать сокеты:

icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); 

Если я запускаю мое приложение, не будучи суперпользователем, то socket функция возвращает -1 т. Е. Сокет не создан успешно. Если я запускаю его как суперпользователя, все работает нормально.

Теперь команда ping создала сырой сокет, и я могу запустить его без прав суперпользователя.

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

ответ

6

ping Нужна функция cap_net_raw, чтобы сделать это без прав других пользователей суперпользователя, а также ваша программа. Запустите

setcap cap_net_raw+ep your_executable_file 

как пользователь root, а затем обычные пользователи смогут использовать программу.

+0

Спасибо, это сработало! Но, если я попытаюсь отладить его в Eclipse, функция сокета снова вернет -1. Я попытался установить возможности cap_new_raw как для eclipse, так и для gdb, но это не сработает. –

+1

Ах. Да, отладка программ с возможностями (или с установленным битом suid) является проблемой, потому что предоставление непривилегированному пользователю «ptrace» будет довольно большой дырой в безопасности. Возможно, вы можете настроить eclipse для запуска gdb с помощью sudo, что позволит вам отлаживать приложение, погружая голову в кошмар безопасности, предоставляя непривилегированному пользователю возможность запускать suid debugger. Я не думаю, что есть идеальное решение этой проблемы. – Wintermute

+0

Хорошо, я попробую. Благодарю. –

1

Вы можете сделать свою программу командой SUID, предоставив ей эффективные разрешения root, не предоставляя их исполняющему пользователю. Пример и пояснение см. В разделе here.

+0

И до сих пор нет возможности отлаживать SUID-программу из не-root, как и с 'setcap cap_net_raw + ep' – osgx

Смежные вопросы