Создание необработанного сокета в 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 ответов


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

  1. активация бита SUID для файла с помощью команды chmod +s file и установите его владельца в root С chown root.root file. Это запустит ваш скрипт как root, независимо от эффективного пользователя, который его выполнил. Конечно, это может быть опасно, если у вашего сценария есть какой-то недостаток.
  2. установка возможности 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, но в интернете могут быть решения, которые могут обойти это ограничение.