用挂载命名空间来禁锢进程对文件系统的访问只是第一步。很快开发人员就发现仅靠它还远不能说隔绝了进程。一个容易想到的攻击是利用进程间通信将本不能被进程访问的文件的内容呈现给进程。于是,有了进程间通信命名空间。
Linux内核IPC类对象有三类:消息队列(Message Queue)、信号量(Semaphore)、共享内存(Shared Memory)。进程间通信命名空间的数据结构如下:
其中主要有两类数据成员:一类是ids,用于存储IPC对象的id。msgget、semget、shmget会在进程关联的ipc_namespace实例的ids中查找或创建新成员。另一类是一些资源限制类变量如shm_ctlmax,共享内存最大值。
下面以信号量为例看一下进程间通信对象的创建和寻找,进而了解进程间通信命名空间的作用。
系统调用semget用于获取一个已有的信号量或者创建一个新的信号量。它的功能类似于作用于文件的系统调用open。系统调用semget的函数实现的最后是调用了函数ipcget。(www.xing528.com)
函数ipcget_public会调用函数ipc_findkey去寻找信号量。函数ipc_findkey的输入参数有两个。一个是ids,ids实际上是“&sem_ids(ns)”,sem_ids的实现为:((ns)->ids[IPC_SEM_IDS]),就是结构ipc_namespace中的数组ids的一项。另一个是key。
函数ipcget_new会调用“ops->getnew”,具体在信号量的情况中会调用函数newary。我们看一下:
函数newary大致工作内容是申请一个信号量,然后将此信号量的标识加入ipc_namespace结构的ids中信号量相联系的表项中。
综上,进程间通信的标识存储在进程间通信命名空间中,进程间通信命名空间不同,进程寻找到的进程间通信实例也不同。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。