在Linux或其他现代操作系统中,每个进程的内存都是受保护的,这样一个进程中的任意写操作不会导致其他进程崩溃。现在假设我们有一块被进程A和进程B共享的内存。现在假设由于软件错误,进程A无意中向该内存区域写入了一些内容。如果进程A和进程B都对该内存具有完全的写访问权限,那么有没有什么方法能够保护它免受此类攻击的影响呢?
shm_open
时,可以将O_RDONLY
标志传递给模式参数。mprotect
将特定页面标记为(例如)只读。您需要两个进程之间的合作和信任才能做到这一点,B没有办法使用mprotect
阻止A写入它。mmap
将某些内容(例如在/dev/shm
中)映射到文件权限使得其中一个进程不可能写入。例如,如果您拥有由用户producer和组consumer拥有并将文件权限设置为0640的/dev/shm/myprocess
,然后通过以该UID和GID运行的进程映射它,则可以防止第二个进程写入它。您可以在每次写入时使用简单的校验和。因此,当一个进程在读取操作时检测到错误的校验和时,这是另一个进程失败的迹象。
O_RDONLY
标志。然而,还有其他解决方案。不久后我会再次更新。 - Flexo/dev/shm
中的“文件”的权限是不可移植的。相反,您应该在使用shm_open
和O_CREAT
创建共享内存对象时指定所需的模式(权限)。或者,只需使用普通文件系统中的文件而不是shm_open
来获取共享内存即可。 - R.. GitHub STOP HELPING ICE