繁体   English   中英

具有不受信任进程的共享内存安全吗?

[英]Is shared memory with an untrusted process safe?

我正在尝试创建一个 x86 Linux 程序,该程序以提升的权限运行,但也可以在子进程中运行潜在不安全的代码并通过共享内存与其通信,主要是出于性能原因。 我的想法是这样的:

  • 根进程使用mmapMAP_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 来完成。

类似的东西在这里说明:

只读时的共享内存

同步问题

Linux 共享内存只允许读访问

“共享内存涉及各种奇怪的同步问题”。

可惜没有更多细节。

pkeys - 内存保护密钥

https://lwn.net/Articles/466304/

仅限英特尔 Skylake

2011 年 LWN 文章比较各种 IPC 机制

https://lwn.net/Articles/466304/

关于 Chromium 与 seccomp 沙箱通信的 LWN 文章

https://lwn.net/Articles/347547/

Chromium 沙盒常见问题解答

https://chromium.googlesource.com/chromium/src/+/master/docs/design/sandbox_faq.md#But-can_t-malware-just-infect-the-process-at-the-other-end-of-管道或共享内存

“但是恶意软件不能只感染管道另一端的进程或共享内存吗?是的,如果那里有错误,它可能会感染。关键是编写和分析正确的 IPC 机制比,比如说,一个网络浏览器引擎。努力使 IPC 代码尽可能简单,并让其他人对其进行审查。”

所以 Chromium 正在做某种共享内存 IPC!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM