2013-12-24 3 views
9

Возможно ли создать исходный сокет без привилегий root? Если нет, может ли скрипт самостоятельно повысить свои привилегии?Создание исходного сокета в Python без привилегий root

Я написал сценарий Python, используя сокеты:

#!/usr/bin/env python 

import socket 
rawSocket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800)) 
print "Worked!" 

Запуск его с привилегиями суперпользователя печатает Worked!. Тем не менее, он дает ошибку при запуске с обычными привилегиями пользователя.

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

ответ

10

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

  1. Активация бит SUID для файла с помощью команды, как chmod +s file и установить его владельца root с chown root.root file. Это запустит ваш скрипт как root, независимо от эффективного пользователя, который его выполнил. Конечно, это может быть опасно, если у вашего скрипта есть некоторые недостатки.
  2. Настройка возможности CAP_NET_RAW для данного файла командой setcap cap_net_raw+ep file. Это даст ему только привилегии, необходимые для открытия сырого сокета и ничего другого.

EDIT:

Как отметил @Netch данные решения не будут работать с любым интерпретируемым языком (как Python). Вам понадобится «взломать», чтобы он работал. Попробуйте googling для «Python SUID», вы должны что-то найти.

+2

Большинство современных систем игнорируют биты suid/sgid на скриптах с любым интерпретатором. Perl непосредственно изобрел «suidperl», чтобы переопределить это в явном требовании. – Netch

+0

Да, это правда. Процесс, выполняемый первым, является интерпретатором, поэтому любой SUID/CAP, установленный в файле, будет проигнорирован. – smeso

+0

Я много раз пробовал Google, и каждый говорит то же самое, о чем вы, ребята, упоминаете. Ну, если нет решения моей проблемы, то ответ заключается в том, что нет никакого решения сделать, используя полностью python. –

5

Для непривилегированного процесса (Python или иначе) не существует способа повысить свои собственные привилегии. Это своего рода краеугольный камень того, что все эти привилегированные/непривилегированные пользователи thinga-ma-jig. В отношении сырых гнезд, от ручной страницы raw (7):

Только процессы с эффективным идентификатором пользователя 0 или возможностями CAP_NET_RAW позволяют открывать сырые сокеты.

Идентификатор пользователя 0 означает корень. См. here for info about raw sockets on linux.

Как указано в ответах/комментариях Фауста, вы не сможете напрямую установить возможности CAP_NET_RAW для вашей программы python, поскольку это сценарий, который выполняется интерпретатором Python, но могут быть решения на сеть, которая может обойти это ограничение.

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