windows - 受保护的共享内存

use*_*346 5 c++ windows protected readonly shared-memory

我正在寻找一种在 Windows 平台上创建共享内存块的可能性,该共享内存块对除创建共享内存块的进程之外的所有进程都进行写保护。

详细来说,我需要以下内容:

进程(1)必须创建一个共享内存块并且应该能够修改缓冲区。进程(2)应该能够打开并读取创建的共享内存块,但不得具有修改内容的权限。出于安全原因,这一点很重要。

目前,我有一个使用 CreateFileMapping() 和 MapViewOfFile() 创建共享内存块的解决方案,然后该解决方案在进程 (1) 和 (2) 中具有读写权限,如下所示:

HANDLE handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, highSize, lowSize, L"uniquename");
void* sharedMemory = MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
// now we can modify sharedMemory...
Run Code Online (Sandbox Code Playgroud)

这两行代码可以应用于两个进程,因为第一个进程创建共享内存块,第二个进程只是打开共享内存。但是,显然,由于在创建内存块期间提供的访问值(PAGE_READWRITE 和 FILE_MAP_ALL_ACCESS),第二个进程将具有写入权限。

我需要通过使用访问值 PAGE_READONLY 和 FILE_MAP_READ 在进程(1)中创建共享内存块,但显然我不允许初始化/设置/修改进程(1)中的内存块,这是一个无用的内存缓冲区。

据我所知,安全属性的定义无法解决问题,因为我的问题不依赖于用户或组。

我什至对这样的解决方案感到满意,该解决方案在进程(1)中创建共享内存块,依赖于创建共享内存块之前已知的内存内容(并且之后不会在进程(1)中修改)。

Ben*_*igt 2

您信任进程 #2 吗FILE_MAP_READ?这将防止意外覆盖,例如野指针破坏共享内存。

如果您试图防止恶意覆盖,那么您需要使用操作系统提供的安全主体,并使用较少的凭据在不同的会话中运行进程#2。如果进程 #2 在与进程 #1 相同的安全凭证下运行,则它可以执行进程 #1 可以执行的任何操作(例如,通过将代码注入进程 #1)。

(在 Windows 上,用户是安全主体,而进程不是。用户不是唯一的限制级别,例如 Vista 中的用户访问控制以及更高版本创建与具有或不具有管理员组成员身份的管理用户相对应的令牌)

既然您说进程 #1 不需要持续写入访问,只需一次,您可以创建映射,将其映射为写入,然后使用调整 ACL,SetSecurityInfo以便将来的访问无法写入。

另一种可能性是映射一个磁盘文件,并使用FILE_SHARE_READ(但不是FILE_SHARE_WRITE)第一个进程的访问来打开它。

但这些都不能阻止进程 #2 强制进程 #1 代表其进行更改。只有使用单独的令牌才能防止强制。