Linux共享内存仅允许读访问

时间:2016-01-25 21:02:16

标签: c++ linux shared-memory

我有一个父进程,它分配共享内存并写入它。 它还启动仅读取共享内存的子进程。但是,我无法控制这些子进程的见解。它们是由其他程序员编写的。这些子进程不应该写在共享内存上。所以我想知道我是否可以允许它们读取权限,但不能写入权限。

但是对于shmget,您只能指定一般权限,而无法区分读取和写入访问权。

我还考虑过切换到shm_open& mmap似乎您可以使用O_RDONLY打开共享内存,强制在PROT_READ调用中使用mmap(只读访问权限)。是否有可能在父进程中使用shm_open创建两个文件描述符:一个使用O_RDONLY,一个使用O_RDWR,然后将O_RDONLY一个传递给子进程,然后可以将它映射到他们的过程空间?当然,孩子们不应该使用shm_open来自行打开共享内存,因为这样可以让他们使用O_RDWR打开它。

或者我的概念错了吗?这是我想要的甚至可能吗?

1 个答案:

答案 0 :(得分:2)

" [T]他的孩子不应该拥有自己打开共享内存的权限。意味着这是一个安全边界,因此共享内存可能不合适。共享内存涉及各种奇怪的同步问题,你真的希望所有用户能够很好地相互协作。

shm_open()只是一个辅助函数,用于在" / dev / shm"中生成集合点文件的名称。和open()它。然后,您自己前往ftruncate()mmap()。如果您在只读文件描述符上请求mmap(),则PROT_WRITE调用将失败,从而为您提供更好的控制权。

因此,您可以在父级中执行shm_open(..., O_RDWR),并在关闭句柄之前为父级设置可写映射,然后shm_open(..., O_RDONLY)以获取将通过的只读文件句柄给孩子们,然后是shm_unlink(),这样孩子就不能重新打开文件。然后,孩子们将这个只读文件句柄用于他们自己的映射。

如果孩子在父母完成shm_open()之后要执行读写shm_unlink(),它将获得一个新的会合文件,因此不会影响父或其他孩子的映射。但是,当父级创建新映射时,确定的攻击者可以尝试利用竞争条件。这些儿童过程多么不值得信任?

您没有说这些子进程是否是单独的可执行文件。如果是,您将希望使用fcntl()将fd复制到未标记为close-on-exec的众所周知的fd编号,以便孩子在启动时可以找到它。

但是,如果您不信任子进程,我建议您重新考虑对共享内存的需求,并考虑通过管道或套接字对发送消息。