Как безопасно сделать IPC с повышением UAC? - PullRequest
9 голосов
/ 22 июня 2011

У меня есть части моей программы, которые требуют административного доступа (настройки, которые влияют на всех пользователей, хранятся в HKLM и ограничены административным доступом).

Я изменил свое программное обеспечение, чтобы указать, что требуется повышение прав:

enter image description here

В ответ я собираюсь запустить свой исполняемый файл, запрашивая повышение прав:

SHELLEXECUTEINFO shExecInfo;
shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shExecInfo.fMask = NULL;
shExecInfo.hwnd = NULL;
shExecInfo.lpVerb = L"runas";
shExecInfo.lpFile = L"myapp.exe";
shExecInfo.lpParameters = NULL;
shExecInfo.lpDirectory = NULL;
shExecInfo.nShow = SW_MAXIMIZE;
shExecInfo.hInstApp = NULL;
ShellExecuteEx(&shExecInfo);

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

myapp.exe /uac 6C844671-E262-46DD-939E-47517F105FB6

(Да, используя GUIDкак имя канала).

Через этот канал я бы сказал моему повышенному клону, какую базу данных, например:

  • к какой базе данных сервера она должна подключаться
  • пользователь должен сказать, что он вносит изменения
  • вещь, которую он должен добавить / отредактировать / удалить

Тогда меня беспокоило, что кто-нибудь может запустить myapp.exe, а затем прокормитьэто все виды запросов -вещи, которые я не хочу делать, потому что i не запустил его, например:

MaliciousProgram.exe :

 ShellExecute("myapp.exe /uac HahaYouDoWhatISayNow")

я помню, что во время бета-тестирования Longhorn было видео на канале 9 или статья, рассказывающая об UAC и об опасностях неправильного выполнения IPC (межпроцессное взаимодействие).

я не хочу изобретать зановоколесо, делая ошибки безопасности, которые уже были решены.Но я не могу найти никакого существующего руководства по " правильному " способу выполнения IPC с повышением UAC.

Что он не принял шаблон для выполнения IPC для связи с порожденным процессом с повышенными правами для временного повышения правдействия?


Редактировать: Объединенные подписчики тегов uac и ipc: 53

1 Ответ

2 голосов
/ 15 августа 2011

Я не верю, что здесь есть проблема безопасности (с некоторыми оговорками, как отмечено ниже). Если пользователь не может поднять, это решение не будет работать в любом случае; если пользователь может поднять и злонамеренно, машина уже взломана. Например, если злонамеренный пользователь хочет внести изменения в HKLM, зачем использовать myapp.exe, когда доступен regedit?

Однако меня смущает упоминание о базе данных сервера; как это согласуется с требованием для повышения? Вообще говоря, повышение прав не требуется для доступа к удаленным ресурсам. (Если myapp.exe или HKLM содержит пароль к базе данных сервера, он не должен.)

Что касается выбора IPC: я не являюсь экспертом в программировании UAC, но при поиске в MSDN я заметил, что повышенные COM-объекты упоминаются несколько раз, например ::

.

http://msdn.microsoft.com/en-us/magazine/cc163486.aspx

см. Также слайды PowerPoint по пятой ссылке в этой статье:

http://msdn.microsoft.com/en-us/library/bb756996.aspx

Однако, если вы недовольны COM (вступайте в клуб!), Тогда использование именованного канала, как вы предлагаете, должно быть столь же эффективным. Однако вы должны принять обычные меры предосторожности, необходимые для именованных каналов - убедитесь, что вы создали серверную часть именованного канала перед запуском процесса с повышенными правами, что вы проверите, существует ли уже канал, и что вы создаете его с соответствующим ACL .

...