2016-01-18 7 views
0

Я пытаюсь создать именованный канал между двумя процессами 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 уже означают, что сервер защищен от переполнения буфера клиентами-изгоями.

ответ

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. Конечно, это глухая территория, но если вы хотите, чтобы никого, чтобы иметь к нему доступ, у вас нет большого выбора.