공유 메모리 블록을 생성 한 프로세스를 제외한 모든 프로세스에 대해 쓰기 금지 된 공유 메모리 블록을 Windows 플랫폼에서 생성 할 수있는 가능성을 찾고 있습니다.윈도우 보호 공유 메모리
공정 (1)는 공유 메모리 블록을 생성하는 버퍼를 변경할 수 있어야한다 :
상세히 I는 다음의 필요가있다. 프로세스 (2)는 생성 된 공유 메모리 블록을 열고 읽을 수 있어야하지만 내용을 수정할 수있는 권한이 없어야합니다. 이것은 보안/안전상의 이유로 중요합니다. 다음 판독 프로세스 쓰기 권한있다 MapViewOfFile()와 함께 현재
I 해결책하여 CreateFileMapping을 (사용하여 공유 메모리 블록을 생성 있음) (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)에서 공유 메모리 블록을 생성하기 전에 알려진 메모리 내용에 의존하는 공유 메모리 블록을 만드는 영혼도 만족 스럽습니다 (프로세스 1에서 수정되지 않음) 나중에).
어떤 힌트 나 의견을 보내 주셔서 감사합니다.
위의 SetSecurityInfo() 기반 솔루션은 문제를 완전히 해결하지 못합니다.이 호출과 섹션/매핑 생성 간의 경쟁 조건이 있습니다. – Bukes
@Bukes : 'SetSecurityInfo()'솔루션으로 문제가 해결되지 않습니다 * all *, 프로세스 # 2는'WriteProcessMemory (PROCESS1_HANDLE, ...)'을 사용하여 공유 섹션에 접근 할 수있다. 이러한 방법은 사고를 예방할뿐입니다. 필수 보안의 경우 OS 지원 사용자 (사용자 및 그룹 구성원)를 사용해야합니다. –
@Ben 디스크 파일을 사용할 수있는 가능성에 대해서도 생각했지만 디스크에 대한 액세스를 피하는 해결책을 찾고 싶습니다. – user3208346