【发布时间】:2013-12-08 22:05:18
【问题描述】:
我有一个简单的代码,比如:
sockaddr_un address;
address.sun_family = AF_UNIX;
strcpy(address.sun_path, path);
unlink(path);
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
bind(fd, (sockaddr*)(&address), sizeof(address));
listen(fd, 100);
我想原子地创建具有特定权限的 Unix 域套接字文件,例如:0777。该手册没有说明关于umask 或其他任何内容的套接字文件权限。即使umask 确实影响了套接字文件,那么它也不是一种原子方式——在多线程程序中。
我希望,有一种方法可以在不使用 umask() 调用同步的情况下实现我的目标。
【问题讨论】:
-
为什么要关心?事后设置权限从未对我造成问题。这并不是说有进程坐在那里等待非法突袭你的套接字——如果有的话,你的问题比套接字权限要大得多。
-
@cHao:可能有进程正在侦听
inotify,并且可能会在我的进程设置正确权限之前尝试连接到套接字——这是一个“好”的进程,但它会失败。我的问题更多是理论上的问题,即尝试为某些特定情况找到解决方法。 -
@cHao:听说过多用户系统吗?像unix?就像这个问题的关键词之一?如果应用不处理等待非法突袭其套接字的进程,则应用严重损坏。
-
@cHao:如果没有恶意用户获得 root 访问权限并且内核不包含任何权限提升安全漏洞,您可以确定内核没有受到危害,这正是我的观点。通过不信任在同一台机器上以其他用户身份运行的进程,您可以防止恶意进程获得 root 访问权限。
-
@cHao:最后一部分很好——在bind()和listen()之间设置权限就足够了。
标签: c sockets unix unix-socket umask