【问题标题】:Linux shared memory only allow read accessLinux 共享内存只允许读访问
【发布时间】:2016-01-25 21:02:16
【问题描述】:

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

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

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

还是我理解错了?这是我想要的吗?

【问题讨论】:

    标签: c++ linux shared-memory


    【解决方案1】:

    “[T]he children should not have the permission to open the shared memory on their own”暗示这是一个安全边界,因此共享内存可能不合适。共享内存涉及到各种奇怪的同步问题,您真的希望所有用户都能很好地相互配合。

    shm_open() 只不过是一个辅助函数,用于在“/dev/shm”和open() 中生成集合文件的名称。然后您可以自己访问ftruncate()mmap()。如果您在只读文件描述符上请求PROT_WRITEmmap() 调用将失败,这为您提供了所需的更精细控制。

    所以你可以做的一件事是在父级中shm_open(..., O_RDWR) 并在关闭句柄之前为父级设置一个可写映射,然后shm_open(..., O_RDONLY) 获得一个你将传递给子级的只读文件句柄,然后是shm_unlink(),这样孩子们就不能重新打开文件。然后,孩子们将这个只读文件句柄用于他们自己的映射。

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

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

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

    【讨论】:

    • 好吧,我真的不能相信这些孩子。它们是我的程序用户可以安装的小应用程序(来自外国来源)。但是,这里没有任何安全问题。可能发生的最糟糕的事情是,行为不端的进程通过使共享内存块上的数据无效而导致其他进程出现故障或崩溃。我怀疑有人会故意编写这样的应用程序。我只是想保护应用免受其他应用中的错误。
    • “看看通过管道或套接字对发送消息”我已经将消息队列用于需要更高安全性的小数据。但是我认为它们对大数据块无效?特别是因为您必须将其分别发送到每个进程。无论如何,我想我只是尝试一下您建议的方法。
    猜你喜欢
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2019-03-04
    • 2017-07-28
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多