Запуск процесса с минимально возможными привилегиями в winapi - PullRequest
8 голосов
/ 26 сентября 2010

Я пишу что-то похожее на http://ideone.com/. В настоящее время я запускаю пользовательские процессы с вызовом CreateProcess.Я убиваю процесс, если он длится дольше указанного времени, но я не знаю, как запретить права на чтение / запись файловой системы / создание прав на процесс и т. Д. Для созданного процесса.Данный исполняемый файл может быть буквально любым, и мне нужно разрешить только stdin / stdout.Также было бы замечательно, если бы я мог установить набор рабочей памяти.

Я прочитал много статей о msdn, таких как Функция CreateProcessAsUser , Функция CreateProcessWithLogonW и т. Д., Но язапутаться очень быстро (вероятно, потому что мои знания по win32 чрезвычайно ограничены).Достаточно ли просто вызвать CreateProcessAsUser и создать специального пользователя с этими ограниченными правами (и как создать такого пользователя).

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

Кроме того, если вы знаете какой-то похожий проект с открытым исходным кодом, это было бы здорово.

Спасибо.

=================================================================

Редактировать: Привет еще раз:) Я все еще застрял с этим.У меня не было достаточно времени, чтобы поработать над этим, но я думаю, что snemarch post очень полезен.Если у кого-то есть нестандартное решение, это было бы здорово.Я напишу, если я сделаю что-нибудь со ссылками snemarch.

Ответы [ 3 ]

6 голосов
/ 27 сентября 2010

Взгляните на OpenProcessToken и AdjustTokenPrivileges - это позволяет точно настроить (в некоторой степени) разрешения вашего процесса.Вы можете использовать SaferCreateLevel для некоторых стандартных прав, таких как SAFER_LEVELID_UNTRUSTED.

5 голосов
/ 27 сентября 2010

Рассмотрим запуск пользовательского процесса внутри объекта задания .Дочерние процессы, созданные пользовательским процессом, тоже окажутся внутри одного и того же объекта задания.Вы можете применить определенные ограничения к тому, сколько ресурсов может использовать задание, как оно может взаимодействовать с графическим интерфейсом и т. Д. (См. Функцию SetInformationJobObject ).Вы можете убить все процессы внутри объекта задания одним ударом.

3 голосов
/ 30 сентября 2010

У нас есть кусок кода для этого, хотя я не могу опубликовать его: (

Создайте токен ограниченного доступа на основе токена доступа для этого процесса. Затем создайте новый процесс для приложения с этим токеном доступа.

Был комментарий с кодом - Более подробную информацию можно найти в статье MSDN, которая называется "Безопасный просмотр Интернета и чтение электронной почты в качестве администратора". Однако, как обычно, MS сломала сеть и статьи больше нет.

Обнаружены связанные поиски. Приложение "DropMyRights", связанное с блогом, ссылающимся на эту статью , которое может делать то, что вы хотите, предлагает источник, но опять же, эти ссылки на странице блога не работают.

вы можете посмотреть на такие функции, как OpenProcessToken GetTokenInformation CreateRestrictedToken

и привилегии типа SE_CHANGE_NOTIFY_NAME

...