Запуск процесса с минимально возможными привилегиями в winapi

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

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

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

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

Благодарю.

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

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

3 ответа

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

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

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

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

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

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

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

и как SE_CHANGE_NOTIFY_NAME

Другие вопросы по тегам