Общая память между разными сессиями - PullRequest
0 голосов
/ 03 мая 2019

У меня есть два приложения:

первый: запуск с привилегиями SYSTEM, запущенными сервисом, и второй: работает все еще как SYSTEM, но с более низкими привилегиями (SE_GROUP_INTEGRITY = "S-1-16-4096")

Я хочу, чтобы оба приложения общались через общую память. Обе должны читать и писать.

В моем первом приложении я создаю сопоставление файлов с конкретными SECURITY_ATTRIBUTES, которые я узнал из этого поста: Как разделить память между службами и пользовательскими процессами?

SECURITY_ATTRIBUTES attributes;
ZeroMemory(&attributes, sizeof(attributes));
attributes.nLength = sizeof(attributes);
ConvertStringSecurityDescriptorToSecurityDescriptor(
    L"D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GWR;;;IU)",
    SDDL_REVISION_1,
    &attributes.lpSecurityDescriptor,
    NULL);
HANDLE test = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1024, "Global\\Test");

Все работает, как и ожидалось, но если я тогда попытаюсь открыть сопоставление файлов во втором приложении, оно вылетает с нарушением прав доступа в OpenFileMapping.

HANDLE test = OpenFileMapping(FILE_ALL_ACCESS, FALSE, 1024, "Global\\Test");

1 Ответ

0 голосов
/ 04 мая 2019

если вы хотите разрешить доступ к объекту для кода низкой целостности, вам нужно добавить низкий обязательный уровень (SDDL_ML_LOW) метка целостности (SDDL_MANDATORY_LABEL) к дескриптору безопасности.например

"D:PNO_ACCESS_CONTROLS:(ML;;NW;;;LW)"

, поэтому в общем код следующий:

ULONG CreateSectionWithLowAccess(PHANDLE SectionHandle, ULONG dwMaximumSize, PCWSTR lpName)
{
    SECURITY_ATTRIBUTES sa = { sizeof(sa) };

    if (ConvertStringSecurityDescriptorToSecurityDescriptorW(L"D:PNO_ACCESS_CONTROLS:(ML;;NW;;;LW)", 
        SDDL_REVISION_1, &sa.lpSecurityDescriptor, NULL))
    {
        *SectionHandle = CreateFileMappingW(INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, 0, dwMaximumSize, lpName);

        LocalFree(sa.lpSecurityDescriptor);

        return *SectionHandle ? NOERROR : GetLastError();
    }

    return GetLastError();
}
...