Как запустить программу под Windows с ограниченным временем памяти / процессора? - PullRequest
5 голосов
/ 10 февраля 2009

Это началось с этого вопроса , затем этого вопроса и теперь привело к настоящему. :)

Задача следующая: создать программу Windows, которая будет запускать другую программу в ограниченной среде. Другой программе нельзя доверять, поэтому она должна быть готова к хакерскому коду. Более конкретно:

  • Ограничить доступную память некоторым X МБ (указанным в качестве параметра);
  • Ограничить доступное время выполнения некоторыми X миллисекундами (задается в качестве параметра). Обратите внимание, что это время ядра + время пользователя, но не время простоя. С другой стороны, время простоя также должно быть ограничено, чтобы программа не могла бесконечно Sleep().
  • По окончании программы сообщайте о затраченном времени процессора, как можно точнее. Миллисекунды были бы хорошими, приемлемые сантисекунды, меньше, чем это было бы не хорошо. Циклы процессора были бы идеальными.
  • Если программа дает сбой, сообщите некоторую информацию о сбое (чем больше, тем лучше, но не переусердствуйте со следами стека и т.п.).
  • Желательно захватить все выходные данные программы и сообщить об этом тоже;
  • Предполагается, что программа использует только текущий каталог плюс некоторые обязательные .DLL из SYSTEM32 (например, kernel.dll, user32.dll и т. Д.). Максимально ограничьте доступ к чему-либо еще. Доступ к таким вещам, как реестр и сеть, не требуется (если это не требуется для обязательных .DLL). Чем меньше доступ, тем лучше.

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

Итак - как бы вы занялись созданием такой программы? Что бы вы использовали? В предыдущих темах (см. Выше) стало ясно, что присоединение в качестве отладчика - плохая идея, хотя, возможно, я просто слишком неуклюж.

Ответы [ 3 ]

5 голосов
/ 10 февраля 2009

Вы в значительной степени строите ту же модель процесса, что и IIS - весело! Я бы использовал те же инструменты, которые использует IIS, он относительно устойчив к взлому и предназначен для разделения вашей системы на множество одновременных заданий.

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

Для мониторинга я бы посмотрел на WMI .

Для трассировки стека при зависании или сбое я снова использовал ADPlus от Microsoft.

Для захвата вывода консоли проверьте Создание Дочернего процесса с перенаправленным вводом.

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

0 голосов
/ 10 февраля 2009
  • Ограничить доступную память некоторым X МБ (указывается в качестве параметра); Использовать VMWare или аналогичные виртуальные среды
  • Ограничить доступное время выполнения некоторыми X миллисекундами (задается в качестве параметра). Обратите внимание, что это время ядра + время пользователя, но не время простоя. С другой стороны, время простоя также должно быть ограничено, чтобы программа не могла бездействовать () бесконечно.
  • По окончании программы сообщать о фактическом затрате времени процессора; Встроить код программы. (Крюк на мощности процессора
  • Если программа дает сбой, сообщите некоторую информацию о сбое (чем больше, тем лучше, но не переусердствуйте со следами стека и тому подобным). Встроить код программы. (Обработка исключений)
  • Желательно захватить все выходные данные программы и сообщить об этом тоже; Встроить код программы (лог-файл).
  • Предполагается, что программа использует только текущий каталог плюс некоторые обязательные .DLL из SYSTEM32 (например, kernel.dll, user32.dll и т. Д.). Максимально ограничьте доступ к чему-либо еще. Доступ к таким вещам, как реестр и сеть, не требуется (если это не требуется для обязательных .DLL). Чем меньше доступ, тем лучше. Встроить код программы. (Если ваша программа не использует регистрацию, она не будет использовать ее.
0 голосов
/ 10 февраля 2009

Решения для виртуализации решают эту проблему. Возможно, вы можете основать свое решение на VMWare (или эквивалентном) и запустить отдельные виртуальные машины (по одной на процесс). Вы получите хорошую изоляцию, контроль над использованием памяти / процессора и отчеты. Затраты на ОС для каждого процесса накладные, но в зависимости от требований вашего проекта это может быть приемлемо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...