Попытка создать область разделяемой памяти только для чтения с помощью CreateFileMapping и пользовательского DACL завершается неудачно в OpenFileMapping - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть локальный процесс клиент / сервер, для которого я 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();
}

Суть в том, что я не могу найти способ сделать эту память доступной для чтения без возможности ее записи. Сервер должен читать / писать, клиент должен читать. Я исследовал это, но не нашел ничего определенного.

Цените любую проницательность.

1 Ответ

1 голос
/ 14 февраля 2020

CreateFileMappingW() и OpenFileMappingW() используют различные наборы определений флагов защиты.

Флаги, поддерживаемые CreateFileMappingW(), перечислены в функции CreateFileMappingW :

flProtect

Задает защиту страницы объекта сопоставления файлов. Все сопоставленные виды объекта должны быть совместимы с этой защитой.

Этот параметр может принимать одно из следующих значений.

PAGE_EXECUTE_READ
PAGE_EXECUTE_READWRITE
PAGE_EXECUTE_WRITECOPY
PAGE_READLY * PAGE_READWRITE
PAGE_WRITECOPY

Приложение может указать один или несколько следующих атрибутов для объекта сопоставления файлов, комбинируя их с одним из предыдущих значений защиты страницы.

SEC_COMMIT
SEC_IMAGE
SEC_IMAGE_NO_EXECUTE
SEC_LARGE_PAGES
SEC_NOCACHE
SEC_RESERVE
SEC_WRITECOMBINE

Флаги, поддерживаемые * 1035M * документацией, поддерживаемыми OpenFileMappingW() * * *, * *1034* * * * * * * * *1034* * * * * * * * * * * * * * * * * * *1034* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '' * * '. *1034* * * * * * * * *1034* * * * * * * * * * * * * * * * * * * * * * * * * 10 * * * * * * * * * * * * 10 * * * * * * * * * * * * * * * * * * 10 * * * * *. :

dwDesiredAccess

Доступ к объекту сопоставления файлов. Этот доступ проверяется по любому дескриптору безопасности в целевом объекте сопоставления файлов. Список значений см. В Безопасность сопоставления файлов и права доступа .

Где документация Безопасность сопоставления файлов и права доступа гласит:

В следующей таблице перечислены права доступа, которые c указаны для объектов сопоставления файлов.

FILE_MAP_ALL_ACCESS
FILE_MAP_EXECUTE
FILE_MAP_READ
FILE_MAP_WRITE

1060 * При звонке OpenFileMappingW() вам нужно использовать FILE_MAP_READ вместо PAGE_READONLY. Если вы посмотрите на цифры c, значения FILE_MAP_READ и PAGE_READONLY:

winbase.h

#define FILE_MAP_READ   4
#define FILE_MAP_WRITE  2

winnt.h

#define PAGE_READONLY       0x02

As Вы можете видеть, что FILE_MAP_READ равно 4, но PAGE_READONLY равно 2, что соответствует значению c, равному FILE_MAP_WRITE. Таким образом, ваш клиент фактически запрашивает доступ на запись к отображению, поэтому дескриптор безопасности должен включать в себя доступ на запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...