2014-09-27 84 views
2

我正在为学生代码执行加强沙盒。我认为我很满意学生们不能共享文件系统或信号上的数据,因为我发现明确的规则规定了这些数据,并且他们作为不同的非特权用户执行。然而,当我创建共享内存(或更一般的IPC - 队列或信号量)时,我很难查看文档来确定哪些内容可以看到。如果你创建共享内存,任何人都可以在同一台机器上打开它,或者有办法控制它吗?控制位于创建内存的程序中,还是由系统管理员限制?谁可以在Linux共享共享内存?

回答

1

同一个ipc命名空间中的任何进程都可以看到并(可能)访问由同一个ipc命名空间中的其他进程创建的ipc对象。每个ipc对象具有与文件系统对象相同的用户/组/其他rwx权限 - 请参见svipc(7)手册页。

通过使用带有CLONE_NEWIPC标志的clone(2)系统调用,可以创建一个新的ipc名称空间。您可以使用unshare(1)程序通过此或某些其他CLONE标志对另一个程序执行克隆+执行程序。

+0

如果我使用fork()而不是clone(),您认为我可以使用unshare()而不使用CLONE_NEWIPC吗? (这是一个很棒的函数名称,让我的问题看起来有点愚蠢) – daveagp 2014-09-27 19:45:57

+0

看起来像'unshare'只是用适当的标志调用clone + exec,所以它应该完全按照你想要的来做...... – 2014-09-27 19:57:34

+0

是的,它似乎做的伎俩。手册警告:“unshare()没有实现可以反转CLONE_SIGHAND,CLONE_THREAD或CLONE_VM的效果的标志”,但是这些标志看起来都与我的情况无关。谢谢! – daveagp 2014-09-27 20:50:24