[英]Is shared memory with an untrusted process safe?
我正在尝试创建一个 x86 Linux 程序,该程序以提升的权限运行,但也可以在子进程中运行潜在不安全的代码并通过共享内存与其通信,主要是出于性能原因。 我的想法是这样的:
mmap
和MAP_SHARED|MAP_ANONYMOUS
分配内存setuid
并随后加载用户提供的代码。之后访问共享内存的陷阱是什么? 显然子进程可以提供无效数据并随时更改它,但它实际上是否会以其他方式损害父进程,例如阻止内存访问,甚至将其杀死或任何类似的东西?
或者使用例如 memcpy() 是否安全?
原子操作安全吗? sem_timedwait?
如果你只将内存用于简单的操作,比如memcpy,孩子不能直接伤害你,但如果你真的不信任他们,分享又有什么意义呢?
将信号量放在内存中是个坏主意; 再说一次,你不能信任他们,也就是说,你不能信任他们。 信号量、互斥体、条件变量……仅在高度信任的情况下工作。 消息传递更好,但不需要共享内存。
我能想象到的最糟糕的情况是轻微的拒绝服务攻击。 在 I/O 期间,页面通常无法访问。 如果您的孩子分叉了自己的许多副本,并设法不断地引导共享页面,则可能会严重破坏父级的执行进度。
有比我更狡猾的想象力的人。
在这个答案中,我将尝试收集我能找到的关于带有敌对进程和对策的共享内存 IPC 的限制的所有信息。
如果您发现错误或更好的东西,请纠正我!
http://selinuxsymposium.org/2007/papers/11-SecureIPC.pdf
在本文的 3.3 节中,共享内存可以由具有读/写访问权限的进程 A 创建,而进程 B 可以被限制为只读访问。
如果根进程想要将数据发送到包含不能由子进程操作的脆弱数据结构的子进程,它可以使用只读映射。
但我不确定以上是否仅适用于 SELinux,如何实际执行或者是否只能使用 mmap 来完成。
类似的东西在这里说明:
“共享内存涉及各种奇怪的同步问题”。
可惜没有更多细节。
https://lwn.net/Articles/466304/
仅限英特尔 Skylake
https://lwn.net/Articles/466304/
https://lwn.net/Articles/347547/
“但是恶意软件不能只感染管道另一端的进程或共享内存吗?是的,如果那里有错误,它可能会感染。关键是编写和分析正确的 IPC 机制比,比如说,一个网络浏览器引擎。努力使 IPC 代码尽可能简单,并让其他人对其进行审查。”
所以 Chromium 正在做某种共享内存 IPC!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.