我正在尝试创建一个以提升的特权运行的x86 Linux程序,但也可能在子进程中运行潜在的不安全代码,并通过共享内存与其进行通信,这主要是出于性能方面的考虑。我的想法如下:
mmap
和MAP_SHARED|MAP_ANONYMOUS
分配内存setuid
,然后加载用户提供的代码。之后访问共享内存的陷阱是什么?显然,子进程可以提供无效的数据并随时对其进行更改,但是它实际上会以其他方式损害父进程吗,例如阻止内存访问,甚至杀死它或其他类似方法?
或者使用例如memcpy()?
原子操作安全吗? sem_timedwait?
将信号量放入内存中是一个坏主意;同样,您不能信任他们,这意味着,您不能信任他们。信号量,互斥量,condvars ...仅在高度信任的情况下起作用。消息传递更好,但不需要共享内存。
我能想到的最糟糕的情况是轻微的拒绝服务攻击。在I / O期间,页面通常不可访问。如果您的孩子为自己制作了许多副本,并设法连续控制共享页面,则可能会严重干扰父母的执行进度。
有些人比我的想像力更狡猾。
如果发现错误或更好的地方,请纠正我!
将只读映射用于单向通信
[本文第3.3节指出,共享内存可以由具有读/写访问权限的进程A创建,并且可以将进程B限制为只读访问权限。
如果根进程希望将数据发送到子进程,而该子进程包含不能由子进程操纵的易碎数据结构,则可以使用只读映射。
但是我不确定以上内容是否仅适用于SELinux,如何实际执行或者是否只能通过mmap完成。
这里有类似的内容:
Shared Memory when it's for read only
同步问题
“共享内存涉及各种各样的奇数同步问题。]
很遗憾,没有更多细节。
pkeys-内存保护键
仅适用于Intel Skylake
2011 LWN文章比较各种IPC机制