gpt4 book ai didi

c++ - Windows - protected 共享内存

转载 作者:可可西里 更新时间:2023-11-01 09:24:46 27 4
gpt4 key购买 nike

我正在寻找在 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...

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

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

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

我什至会对在进程 (1) 中创建共享内存块的解决方案感到满意).

最佳答案

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

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

(在 Windows 上,用户是安全主体,而进程不是。用户不是唯一的限制级别,例如 Vista 中的用户访问控制和后来创建的 token 对应于具有和不具有管理员组成员身份的管理用户)

既然你说进程 #1 不需要继续写访问,只有一次,你可以创建映射,将其映射为写,然后使用 SetSecurityInfo 调整 ACL,这样以后的访问就不能写。

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

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

关于c++ - Windows - protected 共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21196828/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com