LINUX.ORG.RU

Безопасная VM


0

0

Нужен встраеваемый язык с виртуальной машиной. Главное требование - безопасность - т.е. нужны гарантии, что исполняемый в VM код не сможет вызвать никаких внешних функций, кроме жестко заданного списка. Т.е. хочется без опасений запускать в ВМ код полученный от кого угодно, и быть уверенным что максимум что оно сделает - сожрет CPU. Никакого доступа к файловой системе, другим процессам, сокетам и т.д. Второе что нужно - возможность контроля ресурсов, используемых VM. Т.е. возможность синхронно выполнить не более N инструкций при том, что максимальное время выполнения каждой инструкции должно быть известно (либо выполняться не более N мсек), после чего VM отдает управление. Также с памятью - есть предел, при достижении которого VM можно прибить.

Если кратно, то хочется примерно следующее: дать возможность кому угодно залить мне любой код, и иметь гарантию что он не сможет сделать ничего лишнего и не будет жрать больше процессора, чем я укажу.

Наконец, нужно уметь сериализацию кода и данных, загруженных в VM в переносимую форму. Т.е. мне залили код, он повыполнялся у меня, я потом взял, и сбросил состояние VM в файл, который продолжил бы выполнять уже на другой машине (возможно другой архитектуры).

lua, например, отвечает заданным критериям? Никаких особых требований к самому языку нет.

anonymous

вряд ли можно гарантировать безопасность

lua подойдёт

dimon555 ★★★★★
()

В PHP есть такая штука - песочница (sandbox), появилась в PHP 5.
Собираешь PHP в поддержкой sandbox, настраиваешь что позволено делать в песочнице, что нет. И можешь в ней запускать сторонний код.

xintrea
()

Есть вещь под названием tcl safe interpreter, ей перекрыты все внешние функции.

Насчёт ограничения на количество инструкций не понял. По сохранению состояния vm и переносу в другое место вроде бы пролёт.

gaa ★★
()

Системы виртуализации вроде OpenVZ, Xen, наверное, подойдут. Из плюсов: можно заливать любой код. Из минусов: требуют настройки.

mo3r
()

Еще по поводу песочниц. Можно сделать песочницу вообще для любого интерпретируемого языка. Просто надо интерпретатор вызывать из-под программы apparmor.

Вот по-русски пример, что можно через нее сделать.

http://habrahabr.ru/blogs/linux/36746/

xintrea
()

dosbox ёпт

anonymous
()
Ответ на: комментарий от Legioner

Насчет JVM и тем более всяких Xen, dosbox и прочих эмуляторов - слишком тяжело. Проект ближе к играм, так что нужно что-то максимально легкое, управляемое и встраеваемое.

Собственно, есть идея написать свою VM, сваять парсер на базе ansi C и делать что хочется, но велосипеды - плохо и существующие языки все-таки
обладают различными приятными возможностями из коробки.

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

Lua - пожалуй, может даже Python.

> Насчёт ограничения на количество инструкций не понял.


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

> По сохранению состояния vm и переносу в другое место вроде бы пролёт.


Тогда TCL не подходит.

Кто может сказать что у Lua с выполнением кусочками и сохранением/переносом состояния?

anonymous
()
Ответ на: комментарий от anonymous

>Кто может сказать что у Lua с выполнением кусочками и сохранением/переносом состояния?

там для этого есть coroutine, если я правильно понимаю

можно ещё crobots глянуть, вроде автор свой компилятор с-ый использует

dimon555 ★★★★★
()
Ответ на: комментарий от anonymous

>> Насчёт ограничения на количество инструкций не понял.

> Ну дали мне код с бесконечным циклом.

> - Я не хочу вызвать run_vm() и не вернуться оттуда.

> - Я не хочу выносить run_vm() в отдельный поток, потому это ничего не даст

> - А хочу я выполнять процесс внутри vm маленькими кусочкам, чтобы это не мешало остальной работе, которую выполняет моя софтина.


Можно запустить интерпретатор в другом потоке(не процессе).

gaa ★★
()
Ответ на: комментарий от gaa

> там для этого есть coroutine, если я правильно понимаю

Если я правильно понимаю, coroutine - это для изнутри. А мне нужно снаружи.

За Vx86, crobots и luacluster спасибо, посмотрю.

> Можно запустить интерпретатор в другом потоке(не процессе).

Сказал же блин что это ничего не даст.

anonymous
()
Ответ на: комментарий от Legioner

> Почему?

Потому что во-первых, контроля за пожираемым CPU time никакого нет - будет в VM бесконечный цикл - будет жрать 100% CPU. pthread_suspend я из другого потока дергать не собираюсь. Во-вторых, в каждый момент времени VM будет в непонятном состоянии - и что мне прикажете делать, если мне надо взять и сохранить состояние VM, а ее поток остановлен на середине выполнения операции? В общем, будет _совсем_ неуправляемая VM с которой вообще нихрена не сделаешь, зато в отдельном потоке. И кстати, все это требует от VM быть thread safe, что есть лишний оверхед на синхронизацию.

anonymous
()
Ответ на: комментарий от anonymous

За ссылки по lua спасибо. Выглядит не идеально, но поэкспериментировать стоит.

anonymous
()

пеши dsl ручками и получешь все что тебе надо.

подобрезать scheme или юзать lua (хотя не думаю что там все безопасно будет)

anonymous
()
Ответ на: комментарий от anonymous

> пеши dsl ручками и получешь все что тебе надо

Дык в том то и фишка что domain там как такого нету - нужен вполне себе общего назначения язык. К тому же рядом с чужим кодом неизвестно откуда будет свой код, которому можно читать файлы и общаться с внешним миром - если писать еще и библиотеку с нуля, можно убиться, два разных языка использовать некруто. В общем буду ковырять lua.

anonymous
()
Ответ на: комментарий от anonymous

> Итак, PHP - просто смешно

Чем же он вас так насмешил?


> AppArmor не в кассу вообще, потому что только под Linux (или нет?)

Напомню, что вы находитесь на ресурсе, посвященному Linux. Он назвается linux.org.ru.


> и мне нужна именно VM, для полностью переносимого кодп, причем кодом будут в основном скрипты максимум из несколько сотен строк.

С каких пор код PHP стал непериносим с платформы на платформу? А когда PHP перестал быть скриптовым языком, что-то я момент упустил?


Вообще мне кажется, что вы собрались писать какую-то игру, в которой пользователи задают поведение объектов программно. Ну типа "битва роботов", и т. д.

Ну так вот, если у вас в качестве скриптового языка, доступного игрокам, будет какая-то экзотика типа lua или там самодельный недоязык, то проект обречен на провал. Никто в нынешних условиях перегрузкой инфой не будет изучать и разбираться в еще одном языке программирования. Подумайте о потенциальных участниках вашего игрового проекта, сколько из них могут осилить (или уже осилили) PHP синтаксис, сколько из них являются "вебпрограммерами" которые написали одну домашнюю страничку, ничего кроме малой части PHP не знают, но считают себя _программистами_, но при этом достаточно увлеченные люди? Сколько таких людей, которые прикоснулись к "программированию"? Да дохрена. И это ваша потенциальная аудитория. Не "гики", которых 2%, а быдлокодеры, которых хоть жопой ешь. Которые могут побездельничать 7 из 8 рабочих часов, и которые смогут отдать свое время вашему проекту, просиживая с ним штаны. И вот на такую аудиторию и нужно расчитывать. Посему, выбор языка, максимально простого в освоении - главный стратегический вопрос. PHP будет хорошо. Питон или lua - плохо. Самодельный недоязык - просто смешно.

xintrea
()
Ответ на: комментарий от xintrea

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

Для ограничения времени выполнения можно немного поправить исходники в нужном месте, там ничего сложного нет, тупо цикл for для выполнения байт-кода, засунуть туда свой колбэк

anonymous
()
Ответ на: комментарий от xintrea

>> Итак, PHP - просто смешно
> Чем же он вас так насмешил?

Бгг, патстулом :)))))

anonymous
()
Ответ на: комментарий от Legioner

>В WoW именно lua, что не мешает ему иметь огромадного числа вполне качественных аддонов.

У WoW изначально - огромная аудитория. И поэтому тех долей процента юзеров, способных писать на экзотике, хватает на создание аддонов :)

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

>Потому что во-первых, контроля за пожираемым CPU time никакого нет - будет в VM бесконечный цикл - будет жрать 100% CPU.

Интересно, какие готовые решения позволяют этот момент предусмотреть?

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>Интересно, какие готовые решения позволяют этот момент предусмотреть?

думается мне, что это операционная система ;)

а на lua зря народ наезжает, там синтаксис простой и идеом мало, вот правда += по-моему нету

dimon555 ★★★★★
()

guile (scheme)

anonymous
()
Ответ на: комментарий от anonymous

> поднимай защиту на уровень выше. типа selinux, иначе вероятность _дырок_ будет большая.

Бред. Во-первых, это неоправданно тяжело для данной задачи, во-вторых, надо думать SeLinux есть только в Linux, в-третьих, я ясно написал что мне нужна VM.

> Напомню, что вы находитесь на ресурсе, посвященному Linux. Он назвается linux.org.ru.

Я думал линупсоиды гордятся портабельным кодом. Отдыхайте, тут есть много людей поумнее вас, которые не будут советовать завязываться на костыли, присутствующие только в одной ОС.

> будет какая-то экзотика типа lua или там самодельный недоязык, то проект обречен на провал

Давайте не будем мне рассказывать о целевой аудитории моего проекта и его будующем. Я сказал `ближе к играм', а не игра. Давай, если предлагаешь PHP, расскажи что он умеет из того что я называл и как.

> guile (scheme)

Можно пару аргументов?

anonymous
()
Ответ на: комментарий от anonymous

> поднимай защиту на уровень выше. типа selinux, иначе вероятность _дырок_ будет большая.

Бред. Во-первых, это неоправданно тяжело для данной задачи, во-вторых, надо думать SeLinux есть только в Linux, в-третьих, я ясно написал что мне нужна VM.

> Напомню, что вы находитесь на ресурсе, посвященному Linux. Он назвается linux.org.ru.

Я думал линупсоиды гордятся портабельным кодом. Отдыхайте, тут есть много людей поумнее вас, которые не будут советовать завязываться на костыли, присутствующие только в одной ОС.

> будет какая-то экзотика типа lua или там самодельный недоязык, то проект обречен на провал

Давайте не будем мне рассказывать о целевой аудитории моего проекта и его будующем. Я сказал `ближе к играм', а не игра. Давай, если предлагаешь PHP, расскажи что он умеет из того что я называл и как.

> guile (scheme)

Можно пару аргументов?

anonymous
()
Ответ на: комментарий от ELF

> язык - javascript, vm - браузер

А перечитать тред и головой подумать не?

anonymous
()
Ответ на: комментарий от anonymous

>> guile (scheme)

>Можно пару аргументов?

Скачиваем архив с исходниками guile 1.8, смотрим файл examples/safe/README:

This directory includes examples which show how to create and use safe environments for safe (sand-boxed) execution of Scheme programs.

Чтобы понять особенности механизма, смотрим, как оно это делает:

(use-modules (ice-9 safe))

Соответстсвенно дальше смотрим файл ice-9/safe.scm, а затем ice-9/safe-r5rs.scm

anonymous
()
Ответ на: комментарий от anonymous

Да, и если хотелось аргументов другого рода (не про количество работы необходимой для достижения поставленной задачи), то scheme довольно простой но тем не менее мощный язык. У вас есть какой-то опыт работы с ним? Да, конечно, если вы впервые столкнулись с scheme (или lisp или вообще функциональным программированием) сначала может быть немного непривычно, но это проходит через пару дней изучения и, наоборот, становится невероятно удобно.

Спрашивайте конкретнее -- постараюсь ответить.

anonymous
()
Ответ на: комментарий от anonymous

Да, и ещё: не обращайте внимания на то, что там пример песочницы написан на scheme. Интерпретатор guile можно вызывать программно, у него довольно богатый сишный интерфейс. В том числе, можно определять в программе на си функцию и вызывать её из scheme (да, функцию придётся научить работать с типами данных guile, но это не rocket science); из си можно eval'ить код на scheme, который задан в виде строки (guile его распарсит и выполнит).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.