Создаю c помощью CreateFileMapping область памяти для взаимодействия процессов, как мне открыть доступ к ней только для ОПРЕДЕЛЕННЫХ мной процессов? А то выходит после создания общей именнованной области памяти к ней может любой процесс доступ получить зная ее наименование, а это не есть гуд. Создаю все в win 7 64
Штатными средствами - никак. Если очень надо, то есть два варианта - либо 1) проверяешь в цикле контрольную сумму данных, которые хранишь в этой именованной секции (но это защита только от изменения), либо 2) пишешь драйвер, фильтрующий обращения к секции. Второй вариант на 64-битных системах реализовать (почти) нереально. Да, именно так, потому что подсистема безопасности в NT основывается на том, что субъектом защиты является пользователь, а не процесс. Ну, не всегда это удобно, прямо скажем, в современных реалиях особенно, но уж что есть, то есть. Тут такой вариант можно придумать, не знаю, подойдёт ли. Если процессы, от которых требуется защитить секцию, будут выполняться исключительно под не-админом, тогда можно создать в системе дополнительную учётную запись, специально для твоего софта, с именем и паролем, которые тебе, разумеется, известны, ну и назначать DACL на твою секцию с доступом только этой учётке. Ну и, соответственно, имперсонироваться в эту учётку, когда нужен доступ к секции. Но это всё как вариант, если только, потому что учти, что злонамеренный код может быть внедрён в твой процесс, тогда он также получит доступ к этой секции, и что будешь делать? Процессы/потоки свои защищать тоже? Это, знаешь ли, уже на написание проактивки тянет. Может быть, не стоит заниматься тем, чем твой софт заниматься не должен? Это работа аверов.
Спасибо за ответ. Оставлю пока все по старому, возможно позже для обмена информацией между процессами буду использовать именнованые пайпы, и с ними что то придумаю. Например проверку ключа который должен передать присоединяющейся к нему процесс, если ключ не подходит то удалять пайп а затем заново его создавать. Правда скорее всего упадет общая производительность т.к. пайп помедленнее прямого чтения в память.
Есть еще один мезханизм - Integrity Levels, он позволяет ограничить доступ на запись со стороны процессов с более низким IL. http://msdn.microsoft.com/en-us/library/bb625963.aspx Вообще решение зависит от необходимой модели, и условий атаки. Может просто достаточно генерить случайное имя таким образом, чтобы его знали только нужные процессы.
У всякого обьекта имеется дескриптор безопасности определяющий уровень доступа к обьекту. В данном случае обьект секция. Как и сказал Deyton.
Я уже написал об этом выше, к сожалению, это не спасёт от кода, запущенного от админа, т.к. админские учётки обладают правом становится владельцем (take ownership) любого объекта, после чего возможно изменение DACL. В общем, NT-шная модель безопасности не рассчитана на то, что нужно автору в данном случае.
Заставили переписывать программу с нуля, пока ограничеваю доступ на чтение через шифрование файла по общему ключу, на запись через регулярную проверку crc32. И вот хочу сменить отображаемые файлы на именованные пайпы, ведь насколько я понимаю после того как два процесса соединились по ней третий процесс не как не может прочитать передаваемую инфу? Спрашиваю в связи с тем что бытует мнение будто трубы тоже реализованы через файл мэппинг, и выходит при их создании просто создается такой же отображаемый файл для реализации трубы, с которого может производиться несанкционированное чтение.... Кто знает механизмы реализации пайпов в винде подскажите, это так? И какие потери в производительности мне светят при переходе с отобрж-х файлов к пайпам?
LPC вроде как лучше именованных пайпов так как позволяет узнать PID клиентского процесса, что важно для данной задачи.