POSIX 消息队列权限被拒绝问题

POSIX message queues permission denied issue

我有一个 server.c 程序正在使用以下权限初始化消息队列:

#define SERVER "/serverqueue"
...
struct mq_attr attr;
attr.mq_flags = 0;
attr.mq_maxmsg = MAX_MSGS;
attr.mq_msgsize = MAX_MSG_SIZE;
attr.mq_curmsgs = 0;
server = mq_open(SERVER, O_RDWR | O_CREAT, 666, &attr)
...

在第一个运行中,mq_open()成功,程序无错退出。在后续执行中,我在 mq_open() 处收到 Permission denied 错误。为什么会这样?
如果它相关,我没有明确地 closing/unlinking 消息队列描述符,因为 OS 会在程序退出时自动执行,如果我没记错的话

消息队列在进程退出后仍然存在。第二次创建尝试失败的原因是因为您将模式指定为 666,这导致相当奇怪的权限:

$ ls -l /dev/mqueue/serverqueue
--w--wx--T. 1 fw fw 80 Feb 17 13:13 serverqueue

没有读取权限,所以用O_RDWR打开失败。

此外,由于队列名称是共享资源,如果您使用 O_CREAT 而不是 O_CREAT | O_EXCL 创建队列,通常会导致安全漏洞。另一个用户可能已经创建了相同的队列,但具有不同的权限,因此可以访问您尝试对该队列执行的操作。