Создание необработанного сокета в Python без привилегий root
можно ли создать необработанный сокет без привилегий root? Если нет, то может ли сценарий сам повысить свои привилегии?
Я написал скрипт Python, используя необработанный сокет:
#!/usr/bin/env python
import socket
rawSocket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
print "Worked!"
запуск его с правами root печатает Worked!
. Однако он дает ошибку при запуске с обычными правами пользователя.
Я хочу выполнить свой скрипт как обычный пользователь, и он должен создать необработанный сокет, ничего не спрашивая. Возможно ли это?
2 ответов
как вы отметили, необработанные сокеты требуют более высоких привилегий, чем у обычного пользователя. Вы можете обойти эту проблему двумя способами:
- активация бита SUID для файла с помощью команды
chmod +s file
и установите его владельца вroot
Сchown root.root file
. Это запустит ваш скрипт как root, независимо от эффективного пользователя, который его выполнил. Конечно, это может быть опасно, если у вашего сценария есть какой-то недостаток. - установка возможности CAP_NET_RAW для данного файла с помощью команду
setcap cap_net_raw+ep file
. Это даст ему только привилегии, необходимые для открытия сырого сокета, и ничего больше.
EDIT:
как указал @Netch, данные решения не будут работать с любым интерпретируемым языком (например, Python). Вам понадобится какой-то" хак", чтобы заставить его работать. Попробуй!--15-->погугли для "Python SUID", вы должны найти что-то.
нет способа для непривилегированного процесса (Python или иначе), чтобы поднять свои привилегии. Это своего рода краеугольный камень того, что все эти привилегированные/непривилегированные пользователи thinga-ma-jig. Что касается RAW-сокетов, с ручной страницы raw (7):
только процессы с эффективным идентификатором пользователя 0 или возможностью CAP_NET_RAW могут открывать необработанные сокеты.
идентификатор пользователя 0 означает root. См.здесь для информации о raw сокетах на в Linux.
Как указано в ответе/комментариях Фауста, вы не сможете напрямую установить возможность CAP_NET_RAW для вашей программы python из-за того, что это скрипт, который выполняется интерпретатором Python, но в интернете могут быть решения, которые могут обойти это ограничение.