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

C 如何设置SUID位以授予root权限?,c,linux,sockets,C,Linux,Sockets,我的问题是超级初学者!在我的C程序中,我想在创建原始套接字之前设置SUID位(root权限),然后在创建之后切换回正常权限。以前,我使用命令sudo./client运行代码,该命令授予整个可执行根目录权限。我只想将root权限授予创建套接字的位置,这样我就可以简单地使用/client运行代码 编辑:意识到我必须设置SUID位,而不是粘性位来决定可执行文件的行为。问题的原始版本将粘性位(S_ISVTX)与SUID或set UID位(S_ISUID)混淆。自那时以来,它一直在更新 要使程序在创建原始

我的问题是超级初学者!在我的C程序中,我想在创建原始套接字之前设置SUID位(root权限),然后在创建之后切换回正常权限。以前,我使用命令
sudo./client
运行代码,该命令授予整个可执行根目录权限。我只想将root权限授予创建套接字的位置,这样我就可以简单地使用
/client
运行代码


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

问题的原始版本将粘性位(
S_ISVTX
)与SUID或set UID位(
S_ISUID
)混淆。自那时以来,它一直在更新

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

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

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

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

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

安全问题的原始版本将粘性位(
S_ISVTX
)与SUID或set UID位(
S_ISUID
)混淆。自那时以来,它一直在更新

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

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

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

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

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

创建原始套接字时,粘性位会给您带来什么好处?@JonathanLeffler创建原始套接字需要root权限。这就是为什么我要设置粘性位?另外,我不想使用
sudo./client
运行该文件。有解决方法吗?粘性位与根权限有什么关系?你在考虑SUID(set-UID)位吗?这将适用于该计划。更改源代码的权限也不会有帮助。您必须设置可执行文件的权限。只有root用户才能将程序SUID转换为root用户,root用户必须拥有该程序并设置SUID位。在程序执行之前必须做的所有事情。@JonathanLeffler那么我如何让root拥有可执行文件并设置SUID位呢?使用
chown
chmod
程序。请编辑标题和问题以反映您的实际查询。创建原始套接字时,粘性位会给您带来什么好处?@JonathanLeffler创建原始套接字需要root权限。这就是为什么我要设置粘性位?另外,我不想使用
sudo./client
运行该文件。有解决方法吗?粘性位与根权限有什么关系?你在考虑SUID(set-UID)位吗?这将适用于该计划。更改源代码的权限也不会有帮助。您必须设置可执行文件的权限。只有root用户才能将程序SUID转换为root用户,root用户必须拥有该程序并设置SUID位。在程序执行之前必须做的一切。@JonathanLeffler那么我如何让root拥有可执行文件并设置