Есть ли способ избежать этой проблемы безопасности в Lua? - PullRequest
6 голосов
/ 28 ноября 2008

Я просто работал над локализуемым решением Lua для строк, когда я придумал этот хак, проблема в том, что я не знаю, как избежать его взлома :) Поэтому мне было интересно, если кто-нибудь, сделал что-то подобное и или знает, как защитить от такого рода атак. (в коде пользователя)

Так как мы можем сделать это:

=("foo"):upper() -->output: FOO

Его можно взломать так:

getmetatable("foo").__index.upper = function() print("bye bye sucker");os.exit() end
=("foo"):upper() -->output: bye bye sucker (application quits)
-- or this way
=string.upper("bar") -->output: bye bye sucker (application quits)

Есть идеи?

Ответы [ 6 ]

8 голосов
/ 28 ноября 2008

В первую очередь выполняйте ненадежный код только в изолированной среде - как говорили другие авторы. За исключением загрузки кусков байт-кода, Lua разрешает все остальные проблемы с песочницей. (И проблемы с байт-кодом быстро исправляются при обнаружении.)

См. Lua Live Demo для примера песочницы. Источники доступны здесь .

Ваша конкретная проблема с метатаблицами решается путем установки поля __metatable:

Если вы установите поле __metatable в метатаблице, getmetatable вернет значение этого поля, тогда как setmetatable вызовет ошибку.

- Роберто Иерусалимский, Программирование на Lua 1-е издание, 13,3 - Библиотечно-определенные метаметоды

Например:

> mt = { __metatable = true }                                                   
> t = {}
> setmetatable(t, mt)
> setmetatable(t, mt)
stdin:1: cannot change a protected metatable
stack traceback:
 [C]: in function 'setmetatable'
 stdin:1: in main chunk
 [C]: ? 

Итак, все, что вам нужно сделать, это:

getmetatable("").__metatable = true
6 голосов
/ 28 ноября 2008

Если ваш хакер имеет возможность добавлять код, и вам нужно разрешить этому коду вызывать такие вещи, как os.exit, тогда вам все равно не повезло.

Вы можете ограничить функции, которые может вызывать их код. Это зависит от того, что вы все еще хотите, чтобы пользовательский код мог выполнять. Смотрите документ для setfenv и Google для "песочница lua"

2 голосов
/ 28 ноября 2008

Эта проблема безопасности обычно иллюстрируется этим предложением, сказанным Префектом Форда в блестящих книгах Руководство автостопом по Галактике : Скорее, оно связано с тем, чтобы быть на другом сторона этого герметичного люка

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

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

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

2 голосов
/ 28 ноября 2008

Я не уверен, почему у вас есть проблема, так как вы, вероятно, уже знаете о песочницах: вы можете удалить опасные функции, такие как io.exit, и вы можете убедиться, что переопределенными функциями являются только те, которые находятся в глобальной таблице пользователя, т.е. , функции Lua, используемые внутри вашего приложения, останутся без изменений.
В любом случае, если хакер может вызвать os.exit напрямую, то его проблема заключается в том, что он может выстрелить себе в ногу, применяя невинную функцию, которую он будет использовать позже.
Кроме того, это проблема только в том случае, если вы запускаете пользовательские функции на вашем сервере, например: если хакер уничтожает свою систему, то это его проблема!
Теперь существует также проблема распространения опасного кода: вы можете ограничить возможности пользовательских сценариев. В конце концов, это то, что браузеры делают с JavaScript.

1 голос
/ 11 декабря 2008

Я не вижу возможности переопределить upper как проблему. Проблема в том, чтобы видеть os.exit.

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

Создание Lua-состояний выполняется так быстро и просто, это не вызовет никаких проблем.

Другая вещь, о которой вы можете опасаться, это вечные петли. Создание «сторожевого таймера», который убивает скрипт, скажем, после 10000 инструкций, занимает около 10 строк кода на языке Си. Я могу прислать вам образец, если вам нужно.

0 голосов
/ 28 ноября 2008

У меня нет решения (я не использую Lua, я просто интересуюсь им издалека), но то, что вы ищете, называется «песочницей». Google для Lua sandbox , я нашел несколько, казалось бы, интересных страниц. Например: http://lua -users.org / wiki / SandBoxes .

...