Виртуальная машина песочницы для приложения (концепция) - PullRequest
2 голосов
/ 30 октября 2010

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

Я предполагаю, что:

  • исполняемая программа скомпилирована в формат Portable Executable и находится в машинном коде, не в байт-коде или для CLR,
  • исполняемой программе не разрешается связываться с периферийными устройствами, такими как принтер, сканер, и она не используетлюбой графический пользовательский интерфейс,
  • , основная задача выполняемой программы - обработать некоторые данные, хранящиеся в локальном файле (например, вычисления), и поместить их результаты в другой локальный файл,
  • исполняемая программа не должна бытьспособный напрямую взаимодействовать с операционной системой, каждый запрос должен обрабатываться виртуальной машиной, любой запрос, который может привести к повреждению операционной системы, должен быть заблокирован.

Моя концепция архитектуры виртуальной машины в песочнице иоперация:

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

Что вы думаете: это хорошая концепция?Что бы вы изменили, чтобы улучшить его?

Ответы [ 3 ]

1 голос
/ 30 октября 2010

Имитация всего компьютера выглядит очень медленным способом выполнения нативного кода.Множество операций с загрузкой, поиском, выполнением, хранением и т. Д. Только для одной нативной инструкции.

Я бы попытался выполнить хотя бы несколько блоков кода.Подумайте о следующем коде.

int sum = 0;
for (int i = 0; i < 10; i++)
{
    sum += i;
}

Этот код полностью безопасен для выполнения в вашей виртуальной машине.Просто убедитесь, что вы вводите обратный вызов к коду вашей виртуальной машины.

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

printf("Hello World\n");

будет заменен вызовами в вашу библиотеку

myVM_printf("Hello World\n");

Тогда вы сможете выполнить всю программу на собственной скорости и при этом иметь возможность обрабатывать весь опасный код на вашей виртуальной машине.

1 голос
/ 30 октября 2010

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

0 голосов
/ 30 октября 2010

Похоже, что это может быть достигнуто с помощью существующей песочницы, такой как SELinux или App-V от Microsoft.

Также доступ к периферийным устройствам может быть проблематичным.Что, если периферийным устройством является камера в комнате или микрофон?Что если хакер захочет тратить ваши деньги, печатая бесконечный текст в тексте радуги?

...