Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C unixsuid位问题_C_Unix - Fatal编程技术网

C unixsuid位问题

C unixsuid位问题,c,unix,C,Unix,我用c语言写了一个程序,可以做一些计算,然后创建一个文件夹。该文件夹的所有者是根用户。与其他用户一起,我正在尝试运行此c应用程序。我有一个错误: mkdir: lol: Permission denied 好的,我知道这个错误没有问题,因为我没有权限,但我在互联网上读到,如果我在文件上设置suid位,那么这个文件将以所有者权限运行。 我使用了以下命令: chmod +s filename 但它不起作用…:(有什么想法吗 编辑: 因此,首先,我的Unix发行版是Mac OS X 10.5.8。

我用c语言写了一个程序,可以做一些计算,然后创建一个文件夹。该文件夹的所有者是根用户。与其他用户一起,我正在尝试运行此c应用程序。我有一个错误:

mkdir: lol: Permission denied
好的,我知道这个错误没有问题,因为我没有权限,但我在互联网上读到,如果我在文件上设置suid位,那么这个文件将以所有者权限运行。 我使用了以下命令:

chmod +s filename
但它不起作用…:(有什么想法吗

编辑:

因此,首先,我的Unix发行版是Mac OS X 10.5.8。我的文件名是a.out,因为我使用命令从ic.c编译它:
gcc ic.c

我正在以root用户身份运行chmod命令。

尝试以root用户身份运行chmod


我过去曾被这件事咬过一口:(

好吧,你不能说“文件名”是什么。你只能在一个可执行文件上使用suid。特别是你不能在shell脚本上设置它-它必须是一个真正的机器代码可执行文件。在现代的unix中,像一些可怕的Linux发行版一样,你可能根本无法设置它,而不经历更多你可能喜欢的麻烦。

这不是很清楚的r从您的问题中可以看出“filename”指的是什么——可执行文件, 或要在其中创建文件的目录?要执行所需操作,需要使用 可执行文件上的
chmod+s
命令,因此它将以root权限运行。目标目录上的
chmod+s
不会向非root用户打开文件创建权限

不过,整个概念让我觉得有点安全风险,不是更好吗 如果root用户只为这个应用程序在某处创建一个目录,那么chmod它775或777分别向“group”或“world”授予写权限

编辑:我看到您确实在尝试chmod可执行文件,并且正在运行 chmod命令是root。但是root是否拥有可执行文件?您可能需要一个“chown” 除了chmod+s命令之外,还可以使用setuidroot命令(作为root),以确保它运行setuidroot
生成可执行文件的不是setuid。

我认为您还需要将程序中的setuid(0);设置为root。仅设置s位是不够的

我同意所有其他人的观点,做所有这些事情都是非常危险的

编辑

Jonathan Leffler的评论是正确的。
setuid(0);
在这种情况下可能不需要。ie在
/etc
下创建文件的必要步骤

在_etc.c下创建_文件 ……你最好也清理一下

sudo rm a.out
sudo rm /etc/so-su-test.txt
你使用了命令

chmod +s filename
用于发出该命令的语法不正确。正确的语法为

chmod [ugoa]+s filename
可以使用字母u、g、o和a的任意组合

正如您所知,Unix存储有关每个文件夹/文件的权限的信息。每个文件都有读、写、执行、粘贴和其他附加权限。对于单个文件,所有者、组和其他所有人都有不同的权限集。因此,虽然文件的所有者可以读、写和执行文件,所有者组中的所有其他用户可能只能读取该文件,而其他所有人可能根本无法访问该文件

发出chmod命令时,您需要指定要更改权限的用户集。为此,请使用字母u、g、o和a的组合。“u”更改文件所有者的权限,“g”更改所有者组中所有用户的权限,“o”更改所有者组外所有其他用户的权限,“a”更改所有三组用户的权限卢比

示例:

chmod ga-r confidential.txt
将使其仅允许文件所有者读取“confidential.txt”。所有其他用户,包括所有者组中的用户,将无法读取“confidential.txt”

chmod ga rwx really_confidential.txt
将使该文件的所有者以外的任何人都无法读取、写入或执行“really_confidential.txt”。换句话说,您将从除所有者之外的所有用户中删除读取、写入或执行“really_confidential.txt”的功能

chmod u+s filename
仅为该文件的所有者将粘性位添加到“filename”


编辑:哦,是的,由于文件归root所有,请确保在发出的命令之前加上“sudo”。但看起来您已经知道了这一点。

语法不正确。命令必须像chmod u+s filename一样锁定
chmod向导可以帮助您理解chmod的语法

您是否以root身份运行
chmod
?root是否是二进制文件的所有者?不过,请重新思考您的问题,问问自己是否真的需要setuid位。是的,我以root身份运行chmod。因此,首先,我的Unix发行版是Mac OS X 10.5.8。我的文件名是a.out,因为我在我的书中使用命令:gcc ic.cSorry Mac OS!=UNIX从ic.c编译了它。我能给你的任何帮助到此为止。@Infinity刚刚意识到这听起来有点粗鲁-不是故意的,只是Mac OS离UNIX有很长很长的路要走,我知道这一点。Mac OS在这个级别上基本上是FreeBSD…实际上它是一个重新设计的版本al Unix不同于Linux。但是,是的,它在某些方面是非常不寻常的,尤其是在链接器方面。无论如何,就基本安全语义而言,它非常忠实于POSIX。作为一个只需使用终端窗口来
ps
就可以停止进程的人(Yahoo Messenger)然后对它使用
kill
命令…我可以确认MacOS X是UNIX。它在文件系统中的一些非常奇怪的地方放了一些东西。但是它是UNIX。所以我在可执行文件上设置了+s位。还使用了setuid(0)源代码中的命令。并且正在按我所希望的方式工作。顺便说一句,我正在尝试复制一个安全漏洞,因为我需要将它呈现给某人。再次感谢!是的,根用户拥有可执行文件。Y
chmod +s filename
chmod [ugoa]+s filename