在没有root权限的Python中创建原始套接字

ρss*_*ρss 10 python sockets linux raw-sockets

是否可以创建没有root权限的原始套接字?如果没有,脚本可以自己提升其权限吗?

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

#!/usr/bin/env python

import socket
rawSocket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
print "Worked!"
Run Code Online (Sandbox Code Playgroud)

以root权限运行它打印Worked!.但是,使用普通用户权限运行时会出错.

我想以普通用户身份执行我的脚本,它应该创建一个原始套接字而不需要任何东西.可能吗?

sme*_*eso 11

正如您所指出的,原始套接字需要比普通用户更高的权限.您可以通过两种方式规避此问题:

  1. 激活该文件的SUID位用以下命令chmod +s file并设置其所有者root使用chown root.root file.这将以root身份运行您的脚本,无论执行它的有效用户如何.当然,如果你的脚本存在一些缺陷,这可能会很危险.
  2. 使用类似命令在给定文件上设置CAP_NET_RAW功能setcap cap_net_raw+ep file.这将只为其提供打开原始套接字所需的权限.

编辑:

正如@Netch指出的那样,给定的解决方案不适用于任何解释语言(如Python).你需要一些"黑客"来使它工作.尝试谷歌搜索 "Python SUID",你应该找到一些东西.

  • 大多数现代系统都会使用任何解释器忽略脚本上的suid/sgid位.Perl直接发明了"suidperl"来在明确的需求案例中覆盖它. (2认同)

msh*_*ldt 6

没有办法让非特权进程(Python或其他)提升自己的权限.这是拥有这整个特权/非特权用户的基石之类的东西.关于原始套接字,从手册页raw(7):

只允许有效用户ID为0或CAP_NET_RAW功能的进程打开原始套接字.

用户ID为0表示root.有关linux上的原始套接字的信息,请参见此处.

正如Faust的回答/评论所指出的,你将无法直接为你的python程序设置CAP_NET_RAW功能,因为它是一个由Python解释器执行的脚本,但是网上可能有解决方案可以绕过这个限制.