/dev/shm/ 中的共享内存段的权限被拒绝

/dev/shm/ 中的共享内存段的权限被拒绝

在 Ubuntu 20.04 中,我遇到了不同用户访问共享内存段的问题。关联文件是使用和标志的组合创建的,并shm_open()放置在中。我有以下示例程序:O_CREATO_RDWR/dev/shm

#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>

int main()
{
        int ret = 0;
        errno = 0;
        ret = shm_open("/testshm", O_CREAT | O_RDWR, 00666);
        fprintf(stderr, "return value %d\n", ret);
        fprintf(stderr, "result %d: %s\n", errno, strerror(errno));

        return 0;
}

当我第一次运行它时,它按预期工作并被/dev/shm/testshm创建:

$ ls -la /dev/shm
total 0
drwxrwxrwt  2 root   root     60 Aug  3 16:34 .
drwxr-xr-x 18 root   root   4580 Aug  3 12:41 ..
-rw-rw-r--  1 krejci krejci    0 Aug  3 14:37 testshm

然后以同一用户身份再次运行程序,一切正常,但是当我尝试以 root 身份运行该程序时,出现“权限被拒绝”的情况:

# id
uid=0(root) gid=0(root) groups=0(root)
# ./test
return value -1
result 13: Permission denied
  • 相同的代码在其他 Linux 发行版以及 Ubuntu 19.10 中运行良好。
  • O_CREAT当后续程序调用中不存在该标志时,它也能正常工作。
  • 我在日志中没有发现任何有用的信息。
  • 禁用 AppArmor 没有帮助

答案1

这是由于 Linux 内核 4.19 版为了增加安全性而做出的改变所致。

您可以通过运行以下命令将内核的行为改回原来的方式:

sudo sysctl fs.protected_regular=0

答案2

发布的代码缺少shm_unlink()共享内存使用完成后要调用的语句

答案3

根据您的指示,我执行了:

./untitled1;  ls -la /dev/shm;  sudo su; ./untitled1  

结果是:

return value 3
result 0: Success
total 0
drwxrwxrwt  2 root    root      60 Aug  7 13:19 .
drwxr-xr-x 20 root    root    4640 Aug  6 13:26 ..
-rw-r--r--  1 richard richard    0 Aug  6 18:17 testshm
[sudo] password for richard: 
root@richard-desktop:/home/richard/Documents/forum#  ./untitled1
return value 3
result 0: Success

注意:我已经升级到 20,如下所示:

uname -a 
Linux richard-desktop 4.15.0-112-generic #113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

相关内容