LINUX.ORG.RU

Песочница для C кода

 


0

3

Привет. Многие вот пишут интерпретаторы разных скриптовых языков или включают готовые в игровые движки для программирования игровой логики, так сказать. А динамически подгружать откомпилированный код на C, ограничевая его права (запрет на системные вызовы, отдельная куча) никто не пробовал? Можно ли это сделать в различных unix-like системах и как?

ограничевая его права (запрет на системные вызовы,

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

отдельная куча)

Просто бесполезно.

tailgunner ★★★★★
()

В хромиуме такое реализовано, в NaCL.
При загрузке кода проводишь его анализ - не делает он ли чего-то плохого. Если делает - реджект. Думаю, опционально можно патчить сисколы налету.

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

Замечательно! Хотелось бы ещё узнать, есть ли подобное для *BSD

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

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

Если можно ограничить на уровне потока, то почему нет?

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

Это же для целого процесса, разве нет?

Да, это для целого. Тред не читай && сразу отвечай.

Deleted
()

1) Перед загрузкой через dlopen посмотреть импорты можно.
2) Если нужно очень секьюрно, а модули пишет third party, то пусть присылают на подпись. Ты их тестируешь, изучаешь, чтобы там не было «вредоносного», подписываешь, отправляешь назад.

invy ★★★★★
()

Хм, ну вообще-то многие пробовали разными способами как некоторые Си-подобные языки к движкам подключать, так и обычный С, но компилять его в специальный байткод, который потом исполнять vm, находящейся в движке. Так например работает q3 движок. С компиляется в байткод, затем исполняется vm.

С учётом современных технологий вроде llvm держать уже чисто vm у себя не нужно, можно брать промежуточный код, делать с ним нужные манипуляции, компилять в нативный и подгружать. Как тот же native client делает.

ixrws ★★★
()

Можно запускать сторонний код в новом процессе, где предварительно вызвать seccomp(2) с нужными настройками и предусмотреть возможность общения с родительским процессом.

Zenom ★★★
()

В Quake3 обычный C-код компилится в байткод с помощью модифицированного lcc и исполняется в виртуальной машине qvm.

Можно выковырять из движка и использовать.

В Quake1 был Quake C, отдельный язык, внешне похожий на C. В составе gmqcc, насколько я помню, даже небольшая виртуальная машина в комплекте с компилятором идёт.

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

Это понятно, но почему нельзя было такие вещи реализовать тупо в коде? В виде DLLки или статически линкуемого модуля?

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
27 ноября 2016 г.
Ответ на: комментарий от I-Love-Microsoft

Это понятно, но почему нельзя было такие вещи реализовать тупо в коде? В виде DLLки или статически линкуемого модуля?

можно, в quake2 как раз так и было.

waker ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

преимущества байткода в quake3:

* 1 раз компилишь байткод, и он работает на всех платформах (типа как java).

* моддеры могут пересобирать игровые dll под все платформы без дополнительных инструментов типа вижуалов (которые тогда очень дорого стоили)

* не уверен, работало ли это, но вероятно было желание перезагружать игровой код без перезапуска движка (как со скриптами).

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

Чтобы игровой код один раз скомпилять и запускать везде. В Q2 игровой код к примеру надо отдельно компилять под разные платформы, это неудобно.

Плюс естественная песочница из коробки. Работа кода полностью ограничена движком.

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