Как отключить безопасность именованных каналов?

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

Сначала я позвонил

pipe = CreateNamedPipeA(MY_PIPE_NAME, PIPE_ACCESS_DUPLEX,
        PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, maxClients,
                     pipeChunkSize, pipeChunkSize, 0, nullptr); 

т.е. оставить пропуск № SECURITY_ATTRIBUTES. Обычно это работает — отсутствие безопасности означает отсутствие безопасности. Судя по всему, это уже не относится к именованным пипсам. Звонивший пытался

CreateFileA(MY_PIPE_NAME, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

и получил обратно GetLastError=5, доступ запрещен. Тестирование показало, что это произошло из-за сбоя в системе безопасности; точно такая же строка будет успешной, если исполняемый файл клиента будет запущен из тестовой среды в том же сеансе пользовательского интерфейса, что и сервер.

Логичным решением было бы установить DACL на SECURITY_WORLD_SID_AUTHORITY, KEY_ALL_ACCESS (S-1-1-0) в SECURITY_ATTRIBUTES, используемом для CreateNamedPipeA. Это не решило проблему.

Единственным понижением безопасности, оставшимся от «каждый может делать все», было бы «никакой безопасности». Что мне нужно сделать в CreateNamedPipe, чтобы CreateFileA никогда не выдавало отказ в доступе?

Безопасность здесь совершенно неуместна. PIPE_TYPE_MESSAGE и pipeChunkSize уже означают, что сервер защищен от переполнения буфера мошенническими клиентами.


person MSalters    schedule 18.01.2016    source источник


Ответы (1)


Когда я хочу, чтобы канал был доступен для всех (например, он размещен в службе, и я не могу предсказать, какой учетной записи он понадобится), я добавляю NULL-DACL SD:

static SECURITY_ATTRIBUTES g_sa = {0};

g_sa.nLength = sizeof(g_sa);
g_hsa = GlobalAlloc (GHND,SECURITY_DESCRIPTOR_MIN_LENGTH);
g_sa.lpSecurityDescriptor = GlobalLock(g_hsa);
g_sa.bInheritHandle = TRUE;

if (InitializeSecurityDescriptor (g_sa.lpSecurityDescriptor, 1))
{
   if (SetSecurityDescriptorDacl (g_sa.lpSecurityDescriptor, TRUE,NULL,FALSE))
   {
      DebugMessage ("security descriptor DACL set OK\n");

где &g_sa добавляется в качестве параметра для CreateNamedPipe. Конечно, это беспроигрышная территория, но если вы хотите, чтобы каждый мог получить к ней доступ, у вас не так много выбора.

person Bob Moore    schedule 18.01.2016