更详细地说,问题是:没有root权限,进程是否有可能读取(不仅写入)另一个进程的内存? (例如,以某种方式阅读/ proc / gcore或/ proc / [PID] / mem。我还不确定他们的许可要求。)
我知道实现了虚拟地址,每个进程都有自己的空间。我做了一个快速搜索,但找不到强有力的保证或黑客的方法。 This article说:
系统中的每个进程都有自己的虚拟地址空间。这些虚拟地址空间彼此完全分离,因此运行一个应用程序的进程不能影响另一个应用程序。此外,硬件虚拟内存机制允许内存区域保护。这可以防止代码和数据被恶意应用程序覆盖。
我不确定“影响”是否也包括“读取”,似乎硬件只能保护内存不被覆盖。
任何人都能深入了解Linux系统的隔离是否得到强烈保证,或者是否可以被黑客入侵,如何做出保证?
提前致谢!
答案 0 :(得分:1)
旁注:据我所知,鉴于其作为安全性问题的重要性,这是一个文献不多的话题。
太长;不读:进程的virtual address space与另一个完全隔离。 Linux内核在kernel mode中运行时可以访问整个内存。它提供了系统调用,这些调用允许一个进程在某些情况下(请参阅下面的 Ptrace访问模式检查)来访问另一个进程的内存。
Linux内核中有一些系统调用可以读取/写入其他进程的内存:
process_vm_readv()和process_vm_writev()(相同的手册页)
这些系统调用在调用进程(“本地进程”)和pid标识的进程(“远程进程”)的地址空间之间传输数据。数据直接在两个进程的地址空间之间移动,而无需通过内核空间。
最后一句话指的是内核模式下发生的事情(内核实际上在两个物理地址之间复制)。用户模式无法访问其他虚拟地址空间。有关技术细节,请查看the implementation patch。
关于所需的权限:
读取或写入另一个进程的权限由ptrace访问模式 PTRACE_MODE_ATTACH_REALCREDS 检查控制;参见ptrace()。
ptrace()系统调用提供了一种方法,通过该方法,一个进程(“示踪剂”)可以观察并控制另一进程(“ tracee”)的执行,并检查并更改示踪剂的内存和寄存器。
有关所需的权限,请参见ptrace()手册页:
Ptrace访问模式检查
内核用户空间API的各个部分(不仅是ptrace()操作)都需要所谓的“ ptrace访问模式”检查,其结果确定是否允许操作(或在某些情况下导致) “读取”操作以返回经过清理的数据)。 这些检查是在一个进程可以检查有关另一进程的敏感信息或在某些情况下修改其状态的情况下进行的。检查基于两个进程的凭据和功能等因素,“目标”进程是否可转储,以及由任何已启用的Linux安全模块(LSM)(例如SELinux,Yama或Smack)以及commoncap LSM(始终调用)执行的检查结果。
相关内容:
CAP_SYS_PTRACE
功能。请参见capabilities手册页。
List以及Linux内核系统调用的所有手册页。