限制子进程对共享内存和消息队列的访问

时间:2017-09-06 15:53:36

标签: c++ boost boost-interprocess

我正在编写一个服务器,它将接受在运行时使用Boost.DLL加载的不受信任的动态库模块(DLL,SO / DSO)。

我想在一个单独的进程中运行不受信任的模块,该进程只能访问相关的共享内存(有时是只读)和进程间队列。

Process layout

Boost允许permissions对象与共享内存关联。

似乎可能有办法创建流程on windowsLinux,然后调整权限。

如何创建

的流程

或许这本质上太冒险了?

1 个答案:

答案 0 :(得分:2)

首先,来自文档:

  

Boost.Interprocess提供的命名资源必须处理创建文件时也存在的与平台相关的权限问题。如果程序员想要在用户之间共享共享内存,内存映射文件或命名同步机制(互斥,信号量等等),则必须指定这些权限。遗憾的是,传统的UNIX和Windows权限非常不同,Boost.Interprocess不会尝试标准化权限,但不会忽略它们。

     

所有命名资源创建函数都使用可以使用平台相关权限配置的可选权限对象。

请注意,如果您这样做,那么您必须立即了解特定于平台的所需权限:

  

由于每个机制都可以通过不同的机制进行模拟(信号量可能使用映射文件或本机信号量实现),因此当命名资源的实现发生更改时,权限类型可能会有所不同(例如:在Windows互斥锁中需要同步权限,但是不是文件的情况)。为了避免这种情况,Boost.Interprocess [通常为¹,红色。] 依赖于类似文件的权限,需要文件读写 - 删除权限才能打开命名同步机制(互斥,信号量等)以及对共享内存的适当读取或读写删除权限。这种方法有两个优点:它与UNIX哲学类似,程序员不需要知道命名资源是如何实现的。

传递权限对象时

¹

你的另一个问题:

  • 无权开始使用(例如,在Windows上使用AdjustTokenPrivileges?),但
  • 然后,
  • 被授予对共享内存映射文件的读访问权限(例如,在构建共享内存段时设置权限?)

没有。 permissions对象赋予调用进程权限。 permissions对象限制访问其他进程。我这样下注,只在permissionscreate_only上指定open_or_create才有意义。

我想象的是Windows / Linux上的常用路径:

  • 启动作为特定用户帐户运行的服务器
  • 您使用同一帐户启动客户
  • 您创建的IPC对象只能从创建它们的帐户(所有者)
  • 访问

我打赌Windows会允许更细粒度的控制,因为它的访问控制列表(未经过测试):它们应该允许您指定有权访问的其他/不同帐户。

在Linux上,很有可能实现这种控制,需要额外的系统调用(例如,更改共享对象的所有者/组和/或将客户端用户帐户添加为主要/次要组)

总结:_I将专注于授予对特定收件人的访问权限,而不是“在没有任何权限的情况下启动收件人”。后者是不切实际的(进程可能甚至不能“没有任何权限”),并且在运行时提升权限比使用静态分配/管理权限要困难得多。更不用说它在运行中添加权限本身就不那么安全了。