在不需要root权限的情况下,使用Python创建原始套接字

14

是否可能在没有root权限的情况下创建原始套接字?如果不行,脚本能否自己提升权限?

我编写了一个使用原始套接字的Python脚本:

#!/usr/bin/env python

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

以Root权限运行将打印Worked!。但是,使用普通用户权限运行时会出现错误。

我想以普通用户身份执行脚本,并且它应该创建一个原始套接字而不需要请求任何内容。这可能吗?

3个回答

13

正如您所述,原始套接字需要比普通用户更高的特权。

您可以通过以下两种方式规避此问题:

  1. 通过类似于 chmod +s file 的命令激活文件的SUID位,并使用 chown root.root file 命令将其所有者设置为 root。这将以root身份运行您的脚本,而不管执行它的有效用户是谁。当然,如果您的脚本有缺陷,这可能很危险。
  2. 使用类似于 setcap cap_net_raw+ep file 的命令在给定文件上设置CAP_NET_RAW功能。这将仅赋予它打开原始套接字所需的权限,而不赋予其他任何权限。

编辑:

正如@Netch指出的那样,给定的解决方案将无法与任何解释性语言(例如Python)一起使用。您需要一些“黑客”来使其工作。尝试搜索“Python SUID”,您应该能够找到一些有用的东西。


2
大多数现代系统会忽略带有任何解释器的脚本上的suid/sgid位。Perl直接发明了"suidperl"来在显式的require情况下覆盖此行为。 - Netch
是的,这是真的。首先执行的是解释器,因此文件上设置的任何SUID/CAP都将被忽略。 - smeso
我尝试了很多次谷歌搜索,每个人都说的和你们提到的一样。如果没有解决我的问题的方法,那么答案就是,完全使用Python无法解决我的问题。 - ρss
我能想到的唯一方法就是用C语言编写一个小程序,启用SUID位并使用它来执行你的脚本。但是,你应该进行一些检查以避免恶意用户以root身份执行任意代码。 - smeso

11
没有一种方法可以让非特权进程(Python或其他)提升自己的权限。这是拥有特权/非特权用户的基石。关于原始套接字,从手册页raw(7)中可知:
只有具有有效用户ID为0或CAP_NET_RAW功能的进程才允许打开原始套接字。
用户ID为0表示root。有关Linux上原始套接字的信息,请参见此处
正如Faust的回答/评论所指出的那样,由于Python解释器执行脚本,因此您将无法直接为Python程序设置CAP_NET_RAW功能,但可能会在网络上找到可以解决此限制的解决方案。

0

你也可以选择另一种方式,通过sudoers文件设置应用程序,然后通过sudo运行它

或者我的首选选项是使用Nuitka编译它,然后它就像任何其他可执行文件一样运行,并且可以分配为root用户运行等级


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接