Я ищу возможность создания блока общей памяти на платформах Windows, защищенного от записи для всех процессов, кроме процесса, который создал блок общей памяти.
Подробно мне нужно следующее:
Процесс (1) должен создать блок совместно используемой памяти и должен иметь возможность изменять буфер.
Процесс (2) должен иметь возможность открывать и читать созданный блок совместно используемой памяти, но не должен иметь разрешения на изменение содержимого. Это важно из соображений безопасности / безопасности.
В настоящее время у меня есть решение создать блок совместно используемой памяти, используя CreateFileMapping () вместе с MapViewOfFile (), который затем имеет разрешение на чтение и запись в process (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) во время создания блока памяти.
Мне нужно создать блок разделяемой памяти в процессе (1), используя значения доступа PAGE_READONLY и FILE_MAP_READ, но очевидно, что мне не разрешено инициализировать / устанавливать / изменять блок памяти в процессе (1), который является бесполезным буфером памяти ,
Насколько мне известно, определение атрибутов безопасности не может решить проблему, поскольку моя проблема не зависит от пользователей или групп.
Я бы даже был рад тому, что в процессе (1) создается блок разделяемой памяти, опирающийся на контент памяти, который известен до создания блока разделяемой памяти (и который впоследствии не будет изменен в процессе (1)).
Большое спасибо за любые подсказки или комментарии.
Доверяете ли вы процессу № 2, чтобы использовать FILE_MAP_READ
? Это предотвратит случайные перезаписи, например, дикие указатели портят общую память.
Если вы пытаетесь защитить от вредоносных перезаписей, вам нужно использовать предоставленные ОС субъекты безопасности и запустить процесс № 2 в другом сеансе с меньшими учетными данными. Если процесс № 2 выполняется с теми же учетными данными, что и процесс № 1, он может выполнить любую операцию, которую может выполнить процесс № 1 (например, путем внедрения кода в процесс № 1).
(В Windows пользователи являются участниками безопасности, а процессы — нет. Пользователи — не единственный уровень ограничений, например, контроль доступа пользователей в Vista и позднее создает токены, соответствующие административному пользователю как с членством в группе «Администраторы», так и без него).
Поскольку вы говорите, что процесс № 1 не требует продолжения доступа для записи, только один раз, вы можете создать отображение, отобразить его для записи, а затем настроить ACL, используя SetSecurityInfo
так что будущие доступы не могут писать.
Другая возможность состоит в том, чтобы вместо этого отобразить файл диска и открыть его с помощью FILE_SHARE_READ
(но нет FILE_SHARE_WRITE
) доступ с первого процесса.
Но ни один из них не препятствует процессу № 2 принудить процесс № 1 вносить изменения от его имени. Только использование отдельных токенов может предотвратить принуждение.
Вы не объясняете, почему вы не можете предоставить разные аргументы в каждом случае, поэтому я предполагаю, что вы не знаете, какой процесс является создателем, пока у вас не откроется файл. В этом случае вы можете попробовать:
HANDLE h = OpenFileMapping(FILE_MAP_READ, /*args*/);
if (h) {
v = MapViewOfFile(h, FILE_MAP_READ, 0, 0, 0);
} else {
h = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, highSize, lowSize, L"uniquename");
if (!h)
FirePhotonTorpedoes();
v = MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
}
CreateFileMapping
Функция позволяет вам установить ACL для объекта сопоставления файлов. Если вы создаете ACL, который разрешает доступ только для чтения, другие процессы не смогут открыть объект сопоставления файлов с доступом для чтения и записи.
Как правило, при создании объекта назначенные вами разрешения не применяются к дескриптору, который вы получаете при создании. Тем не менее, я не проверял это с CreateFileMapping
особенно.
Это только обеспечивает слабую защиту. Вредоносный процесс может изменить разрешения для объекта сопоставления файлов или внедрить код в процесс, создавший объект.