2009-02-10 2 views
5

Началось с this question, а затем с this question и теперь привело к настоящему. :)Как запустить программу под Windows с ограниченным временем памяти/ЦП?

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

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

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

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

ответ

0

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

+0

Виртуализация была бы приятной, но я не уверен, как ее использовать в этом сценарии. Прежде всего, будет много представлений , поэтому тестирование должно быть как можно короче. Большинство тестовых прогонов будет ограничено ~ 1 секундой на каждый тестовый пример, и будет около 10 тестовых случаев. –

+0

Кроме того, если я запускаю всю виртуальную машину (или даже вывожу ее из спать), я все же должен поместить ограничения/измерения только на один процесс в нем, а не на всю виртуальную машину. По существу мы вернемся на первый шаг. –

+0

Также обратите внимание, что измерения должны быть довольно точными. Миллисекунды предпочтительнее , centiseconds будет приемлемым. Deciseconds будет crappy. Подумайте об этом, CPU _cycles_ будет лучшим.: P –

5

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

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

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

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

Для захвата консольного вывода, проверьте Создание Child Process with Redirected Input Output.

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

+0

Yup, что я знаю. За исключением времени простоя, но я полагаю, что я мог бы это контролировать. Есть ли у вас идеи об отдыхе? –

+0

Работа решает часть проблемы. Но вредоносный код все еще может сходить с ума в Job. –

+0

Предельный контекст безопасности также хорош, вот что я и пытался использовать. Хотя я должен признать - с небольшим успехом. Почему-то я не могу найти правильный ACL для использования. Будет ли образец спросить? –

0
  • Ограничить доступную память до некоторого X МБ (заданного в качестве параметра); Использование VMWare или аналогичных виртуальных сред
  • Ограничить доступное время выполнения до нескольких миллисекунд (заданных в качестве параметра). Обратите внимание, что это время ядра + время пользователя, но не время простоя. С другой стороны, время ожидания также должно быть ограничено, так что программа не может «Сон»() бесконечно.
  • По завершении отчета о завершении программы время CPU, которое оно фактически потратило; Построить код программы. (Hook on CPU power
  • Если программа вылетает из строя, сообщите о какой-либо информации о сбое (чем больше, тем лучше, но не переходите за борт со следами стека и т. П.). Сборка кода программы.)
  • Предпочтительно захватить весь вывод программы и сообщает, что тоже,. сборки в коде программы (LogFile)
  • программа должна использовать только текущий каталог, а также, возможно, некоторые обязательные .dlls от SYSTEM32 (например, kernel.dll, user32.dll и т. д.). Ограничьте доступ ко всему остальному как можно больше. Доступ к вещам вроде regist ry и network не требуется (если этого не требует обязательный .DLL). Чем меньше доступ, тем лучше. Построить код программы. (Если ваша программа не будет использовать регистр, она не будет использоваться.
+0

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

Смежные вопросы