2015-12-21 4 views
0

Сейчас я много делаю.Создание защищенной песочницы Lua ..?

local env = { 
    print = print, 
} 

setfenv (FUNC, окр) , а затем с помощью метаметоды для блокировки propertys по инстанциям, но это действительно неэффективна и имеет множество обходных путей. Я googled это и все, что я нахожу, то же самое как это: unworking.

+1

В чем «обход» вы имеете в виду? Песочница означает, что скрипт может получить доступ только к тому материалу, который вы явно разрешаете. Учитывая код, который вы показываете, 'func' будет иметь доступ только к' print' и любым параметрам, с которыми вы его вызываете. –

+0

«Скажем, я хотел также предоставить доступ к getfenv().«Если вы не хотите, чтобы люди ходили в ваш дом, вы не даете им ключи. То же самое происходит: если вы не хотите, чтобы люди выходили из песочницы, * не * дайте им инструменты так что любая хорошая песочница помешает вам использовать 'getfenv'. –

+0

@Nicol Но лучшая песочница позволит доступ к песочнице для * ничего *. Когда я думаю о песочнице, я думаю, что это мой собственный мир, Я могу сделать что-то безопасно, без доступа к «родительской среде». Например, getfenv (2) будет ошибочно, потому что «родительская среда» не существует. (Ну, но это не видно изнутри песочницы.) – warspyking

ответ

3

В Lua 5.1 песочница довольно проста. Если у вас есть сценарий Lua в файле где-то, и вы хотите, чтобы предотвратить его доступ к любым функциям или что-нибудь, кроме параметров, вы предоставляете, вы делаете это:

local script = --Load the script via whatever means. DO NOT RUN IT YET! 
setfenv(script, {}) 

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

Очевидно, что вы можете поставить все, что вам нравится в этом столе; эта таблица будет содержать любые доступные вам глобальные материалы. Вероятно, вы должны дать Lua-скриптам доступ к базовым библиотечным функциям Lua; большинство из них - чистые функции, которые не могут сделать ничего неприятного.

Вот список Lua стандартных вещей библиотеки, которые вы не должен предоставить пользователю доступ к, если вы хотите, чтобы сохранить целостность вашей песочнице:

  • getfenv. Имеются веские основания для того, чтобы пользователь мог использовать setfenv, чтобы он мог создавать собственные мини-песочницы в своей песочнице. Но вы не можете разрешить доступ к среде любых функций, которые вы помещаете в песочницу, если вы хотите сохранить целостность песочницы.
  • getmetatable: Те же рассуждения, что и выше; настройка метаданных в порядке. Хотя вредоносный код может разорвать объект, если он изменит его метатебель, но вредоносный код может разрушить всю вашу систему, просто выполняя бесконечный цикл.
  • всегоdebug библиотека. В библиотеке отладки можно использовать всевозможные придирки.

Вам также, по-видимому, необходимо решить this problem that Lua 5.1 has with loading bytecode from within a Lua script. Это можно использовать для разрыва песочницы. К сожалению, у Lua 5.1 на самом деле нет хороших инструментов для этого. В Lua 5.2+ вы можете инкапсулировать load и loadfile, чтобы вы внутренне передавали «t» в качестве параметра режима независимо от того, что пользователь предоставляет. Но с Lua 5.1 вам нужно каким-то образом инкапсулировать load et.al. так что вы можете сказать, когда данные являются текстом, а когда нет. Вероятно, вы можете найти код, который использует Lua, чтобы отличить байт-код от текста, читая источник Lua.

Или вы можете просто отрицать load и его друзей в целом.

Если вы хотите, чтобы пользователь не выполнял уродливые вещи в системе, то запретите библиотеки os и io.

+1

Возможно, стоит упомянуть в разделе «не обязательно предоставлять доступ», в котором также необходимо отключить «loadstring» или по крайней мере загружать байт-код с помощью «loadstring»: https://gist.github.com/corsix/6575486 –

+0

@PaulKulchenko: Спасибо за примечание. Я предполагаю, что LuaJIT не имеет этой специфической проблемы из-за использования другого формата байт-кода (хотя может быть возможно использовать байт-код LuaJIT для разрыва песочницы). –

+1

@NicolBolas Вы имеете в виду вот это? https://www.corsix.org/content/malicious-luajit-bytecode ;-) Нет загруженных библиотек. (За исключением jit (для компиляции jit), но в коде он не ссылается/не используется). Для любого вида песочницы следует избегать загрузки всех байт-кодов. – nobody