C 如何在UNIX/tmp目录中创建一个文件,以便所有用户都可以读写它?

C 如何在UNIX/tmp目录中创建一个文件,以便所有用户都可以读写它?,c,unix,security,C,Unix,Security,我试图在/tmp目录中创建一个文件(在Linux UBUNTU 7.10上工作),该文件对任何用户都具有读/写/执行权限 所以我用的是 open(fileName,O_CREAT|O_RDWR,0777) 函数在user1帐户中创建文件(从C程序),我希望user2能够写入特定文件 但是,当我检查/tmp目录时,使用 ls -l 我看到我没有user2的写访问权限(考虑到user1创建了它,我有user1的写访问权限,但是user2,被认为是“其他人”的人没有任何访问权限) 我曾尝试在打开功

我试图在
/tmp
目录中创建一个文件(在Linux UBUNTU 7.10上工作),该文件对任何用户都具有读/写/执行权限

所以我用的是

open(fileName,O_CREAT|O_RDWR,0777)
函数在
user1
帐户中创建文件(从C程序),我希望
user2
能够写入特定文件

但是,当我检查
/tmp
目录时,使用

ls -l
我看到我没有
user2
写访问权限(考虑到
user1
创建了它,我有
user1
的写访问权限,但是
user2
,被认为是“其他人”的人没有任何访问权限)


我曾尝试在
打开
功能中使用模式
0766
(以及模式的
7
6
),这样我可以获得
user2
的写访问权限,但我仍然没有所需的访问权限。

您必须将umask设置为000。umask上的位将从您选择的权限中删除,默认umask通常为022或002


请注意,默认ACL和SELinux标签之类的内容也可能会影响文件的可读性和可写性。使用getfacl查看ACL,使用ls-Z查看SELinux标签;对于SELinux,您还必须知道哪些策略处于活动状态以及它们具有什么效果。ACL的存在也可以在ls-l上被视为权限后的+字符。

FWIW,使用固定名称在/tmp(或/var/tmp等)中创建任何内容都有安全风险。可以在/tmp中使用指向任何内容的相同名称设置符号链接,如果运行程序的用户具有销毁目标文件的权限,则程序将销毁该文件


在/tmp中以编程方式创建的东西应该随机命名,但最好不要使用该目录,除非您的整个系统是安全的(没有潜在的恶意用户)。

正如CesarB所指出的,Unix将取消进程的umask中设置的位的设置,因此要获得完全访问,您必须临时取消umask的设置

 mode_t oldmask = umask(0);
 fd = open(...);
 oldmask = umask(oldmask);
 assert(oldmask == 0);
(好的;您不必执行断言;它不会触发。)

正如Pistos所指出的,在/tmp中创建文件是一个令人担忧的过程。如果您认为该文件不应该存在,请添加O_exc以防止以下符号链接指向意外位置


最后一点-为什么要使文件可执行?我认为你的目标应该是获得666个许可,而不是777或766个。您当然不应该执行其他人可以随时更改的程序(因此所有者不应该对其他人可以写入的文件拥有执行权限),而且团队成员可能也不会真正感激您的慷慨。其他人可能会在执行文件时得到应得的好处,但这仍然不好。

您唯一能做的就是在创建文件后对其进行chmod:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main() {
  creat("/tmp/foo", 0);
  chmod("/tmp/foo", 0666);
}
#包括
#包括
#包括
int main(){
创建(“/tmp/foo”,0);
chmod(“/tmp/foo”,0666);
}

无论如何,拥有此类文件是不安全的。

我假设您正在尝试执行某些IPC。您是否想过使用其他方法来实现此目的,如使用dbus或som或其他为此目的而设计的系统?

这是我在大学里为安全编程课程所做任务的一部分,因此我正在研究安全问题:)您可能希望使用chmod(2)来设置文件的显式权限,而不是更改您的umask.使用
[f]chmod()
是正确的答案。设置进程范围的
umask
不是线程安全的。这不是您可以做的“唯一”事情。不过这是一种有效的技术。而且,现代POSIX不需要包含,尽管我认为它仍然是合理的。如果从creat()获取值,还可以使用fchmod()获得良好效果。不过,我必须承认,我不再使用create(),而是使用open()的三参数版本。