如何设置SUID位以授予root特权?

时间:2020-07-22 03:33:30

标签: c linux sockets

我的问题是超级初学者!在我的C程序中,我想在创建原始套接字之前设置SUID位(root权限),然后在创建完原始套接字后想切换回普通权限。在我以前使用命令sudo ./client运行代码之前,该命令赋予了整个可执行文件root权限。我只想将root权限授予创建套接字的位置,以便我可以仅使用./client来运行代码。

编辑:意识到我必须设置SUID位而不是我希望可执行文件的行为的粘性位。

1 个答案:

答案 0 :(得分:2)

问题的原始版本是将粘性位(S_ISVTX)与SUID或设置的UID位(S_ISUID)混淆。此后已更新。

要在创建原始套接字时使程序以root特权运行,您可以通过按常规方式编译可执行文件来创建可执行文件,然后让root拥有可执行文件(chown root ./client)的所有权并进行设置权限(chmod 4555 ./client)。请注意,权限是经过仔细选择的,并且不允许组或其他任何人写入程序(修改可执行文件)。所有者root没有写许可这一事实并不能阻止root写入文件-尽管root不想经常更改它。通常,root会将程序复制到普通用户无法进行更改的某个目录。可能是/usr/local/bin,也可能在其他地方。

请注意,权限是在可执行文件而不是源代码上设置的(请参阅问题的original version),并且必须在程序运行之前设置。

在程序内部,在创建原始套接字之后,可以通过执行root来删除setuid(getuid())特权,从而避免代码中的许多安全问题。这会将有效UID改回为实际UID。请注意,setuid()的POSIX规范 说:

如果进程具有适当的特权,则setuid()应将调用进程的真实用户ID,有效用户ID和保存的设置用户ID设置为 uid

>

SUID为root的程序具有“适当的特权”;没有回头路了。使用seteuid() (如最初建议的那样)不如使用setuid()安全。

相关问题