У меня есть локальный процесс клиент / сервер, для которого я sh предоставляю некоторый контент в общедоступной области общей памяти только для чтения . Я могу успешно создать дескриптор безопасности и область общей памяти на стороне сервера, однако, когда я пытаюсь получить доступ к области общей памяти на стороне клиента, происходит сбой с помощью ACCESS_DENIED (5) , если не предоставлен дескриптором безопасности Доступ на запись для интерактивных пользователей (GW) в дополнение к чтению (GR). Я пытаюсь избежать предоставления доступа на запись интерактивным пользователям, чтобы процесс рутов не смог отследить sh область общей памяти.
Серверная часть предназначена для работы как windows службы и использовать глобальный раздел, но я обнаружил, что с целью устранения этой проблемы не имеет значения, как он работает.
Сторона сервера:
// Error handling removed for brevity
SECURITY_ATTRIBUTES attributes = { 0 };
ZeroMemory(&attributes, sizeof(attributes));
attributes.nLength = sizeof(attributes);
ConvertStringSecurityDescriptorToSecurityDescriptor(
L"D:P(D;;GA;;;BG)(A;;GA;;;SY)(A;;GA;;;BA)(A;;GR;;;IU)",
SDDL_REVISION_1, &attributes.lpSecurityDescriptor, NULL);
DWORD cbMemShare = 1024;
m_hShareMem = CreateFileMappingW(INVALID_HANDLE_VALUE, &attributes, PAGE_READWRITE|SEC_COMMIT, 0, cbMemShare, L"MyMemShare");
Сторона клиента (как интерактивный пользователь):
// succeeds if SD has (A;;GRGW;;;IU), fails on (A;;GR;;;IU)
HANDLE hShareMem = OpenFileMappingW(PAGE_READONLY, 0, L"MyMemShare");
if (hShareMem == NULL)
{
DWORD err = GetLastError();
}
Суть в том, что я не могу найти способ сделать эту память доступной для чтения без возможности ее записи. Сервер должен читать / писать, клиент должен читать. Я исследовал это, но не нашел ничего определенного.
Цените любую проницательность.