Linux是否支持进程内存隔离?

4
更详细地说,问题是:在没有 root 权限的情况下,一个进程是否可以读取(而不仅仅是写入)另一个进程的内存?(例如通过以某种方式读取 /proc/gcore 或 /proc/[PID]/mem。我还不确定它们的权限要求。)
我确实理解虚拟地址是如何实现的,每个进程都有自己的空间。我进行了快速搜索,但既没有强有力的保证,也没有黑客方法。这篇文章说:
“系统中的每个进程都有自己的虚拟地址空间。这些虚拟地址空间完全彼此独立,因此运行一个应用程序的进程不能影响其他进程。此外,硬件虚拟内存机制允许对内存区域进行写入保护。这可以保护代码和数据免受恶意应用程序覆盖。”
我不确定“影响”是否也包括“读取”,似乎硬件只保护内存免受被覆盖。
是否有人深入了解 Linux 系统的隔离是否得到了强有力的保证,或者如果可能被黑客攻击,该如何保障?
提前致谢!
1个回答

6

顺便提一下:据我所知,考虑到其作为安全问题的重要性,这是一个文档不足的主题。

简而言之:一个进程的虚拟地址空间与另一个进程完全隔离。Linux内核可以访问整个内存,因为它在内核模式下运行。它提供系统调用,允许一个进程在某些情况下(参见下面的Ptrace访问模式检查),访问另一个进程的内存。


在Linux内核中有系统调用允许读取/写入其他进程的内存:
  • process_vm_readv()process_vm_writev()(同一手册页)

    这些系统调用在调用进程(“本地进程”)的地址空间和由pid标识的进程(“远程进程”)之间传输数据。数据直接在两个进程的地址空间之间移动,而不通过内核空间。

    最后一句是指在内核模式下发生的情况(内核实际上在两个物理地址之间复制)。用户模式无法访问其他虚拟地址空间。有关技术细节,请查看实现补丁

    关于所需权限:

    读取或写入另一个进程的权限由ptrace访问模式PTRACE_MODE_ATTACH_REALCREDS检查控制;请参阅ptrace()

  • ptrace()

    ptrace()系统调用提供了一种方式,使得一个进程(“跟踪器”)可以观察和控制另一个进程(“被跟踪者”),并且可以检查和更改被跟踪者的内存和寄存器

关于所需的权限,根据 ptrace() 手册页面:

Ptrace 访问模式检查

内核用户空间 API 的各个部分(不仅仅是 ptrace() 操作)需要所谓的 "ptrace 访问模式" 检查,其结果决定是否允许操作(或在少数情况下导致 "读取" 操作返回已经过处理的数据)。这些检查是在一个进程可以检查另一个进程的敏感信息或在某些情况下修改另一个进程的状态时执行的。 这些检查基于两个进程的凭据和能力、目标进程是否可转储以及任何启用的 Linux 安全模块(例如 SELinux、Yama 或 Smack)执行的检查的结果以及常见的 LSM(始终被调用)执行的检查结果等因素。

相关内容:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接