我在想 - 有没有任何已知的技术来控制从授权程序以外的任何地方访问共享内存对象?
例如,假设我创建了一个共享内存段,用于程序P,由Q访问,并使其成为读写。我可以使用Q访问它,因为我已经给它(Q)执行此操作所需的权限(作为具有组的特定用户运行等)。
但是,我猜测有些人可能会从程序R中访问这个共享内存 - 只需附加到它并修改它。要阻止这种情况,你可以让内存段只读 - 但是现在程序R仍然可以读取内存中的内容。
我的问题是部分 -
有没有办法,
a)只允许Q访问共享内存吗?
b)想一下读者是否是由Q以外的人完成的 - 是谁做的? [这甚至可能吗?]对于奖励积分,这可以跨平台完成吗? [可能不是,但没有伤害尝试:)]在什么情况下恶意程序可以附加到共享内存?我认为一种方法是,如果用户能够利用OS漏洞并成为启动该程序的用户。还有其他人吗?
答案 0 :(得分:9)
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.giu = 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的漏洞都将允许访问任何共享内存区域。