6

我想知道 - 除了授权程序之外,是否有任何已知的技术可以控制从任何地方对共享内存对象的访问?

例如,假设我创建了一个共享内存段供程序 P 使用,供 Q 访问,然后我将其设为读写。我可以使用 Q 访问它,因为我已经为它 (Q) 提供了这样做所需的权限(作为具有组的特定用户运行等)。

但是,我猜在某些情况下,有人可能会从程序 R 访问这个共享内存——只需附加到它并修改它。为了阻止这种情况,您可以将内存段设为只读 - 但现在程序 R 仍然可以读取内存中的内容。

我的问题是部分 -

  1. 有没有办法,

    a) 只允许 Q 访问共享内存?

    b) 计算阅读是否由 Q 以外的其他人完成 - 以及是谁做的?[这甚至可能吗?] 对于奖励积分,这可以跨平台完成吗?[可能不是,但尝试没有害处:)]

  2. 在什么情况下流氓程序可以附加到共享内存?我认为一种方法是用户是否能够利用操作系统漏洞并成为启动程序的用户。还有其他人吗?

4

1 回答 1

12

POSIX 共享内存与文件具有相同的权限系统 - 如果您运行ipcs,您将看到系统上共享内存段的权限:

$ ipcs -m
IPC status from <running system> as of Tue Jul 14 23:21:25 BST 2009
T     ID     KEY        MODE       OWNER    GROUP
Shared Memory:
m  65536 0x07021999 --rw-r--r--     root    wheel
m  65537 0x60022006 --rw-r--r--     root    wheel

在回答问题 1a) 时,您可以使用正常的 UNIX 权限系统来仅允许来自某个用户和/或组的访问。这可以通过以下方式控制shmctl

struct ipc_perm perms;
perms.uid = 100;
perms.gid = 200;
perms.mode = 0660; // Allow read/write only by 
                   // uid '100' or members of group '200'
shmctl(shmid, IPC_SET, &perms);

对于 1b),我认为不存在任何用于共享内存访问的审核接口。

关于您的第二个问题,任何以 shm 所有者/组身份运行或以 root 身份运行的进程都可以访问您的内存——这与访问任何其他资源没有什么不同。Root 可以随时访问 *ix 系统上的任何内容;因此,任何将用户升级为 root 的漏洞都将允许访问任何共享内存区域。

于 2009-07-14T22:22:44.520 回答