Предотвращение выхода из песочницы
Блокируйте доступ к библиотеке debug, неправильное использование rawget/rawset и утечки внешних значений.
«Предотвращение выхода из песочницы» — бесплатный урок Lua Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Проблема обхода
Даже при использовании окружения с белым списком изобретательные злоумышленники могут найти способы получить доступ к настоящему глобальному окружению. В этом уроке рассматриваются известные способы обхода и методы их устранения.
Эксплойт метатаблицы строк
В Lua у строк есть общая метатаблица, предоставляющая доступ к библиотеке строк. Код в песочнице может использовать строку, чтобы получить ссылку на string.rep, а затем добраться до других библиотек.
-- Escape vector (before patching):
local s = "hello"
local getenv = s.rep -- reaches string library
-- Fix: use setmetatable on all sandboxed strings (not practical)
-- Better fix: override debug.getmetatable in the sandboxБлокировка через rawget/rawset
Если в песочнице доступны rawget и rawset, код может использовать их для обхода ограничений __index и напрямую читать данные из настоящих таблиц.
-- Fix: exclude rawget, rawset, rawequal, rawlen from the sandbox envДоступ к библиотеке debug
Библиотека debug может читать и изменять любую внешнюю переменную, включая _ENV. Полностью исключите её из песочницы.
Таблица package.loaded
Если доступны require или package, код в песочнице может получить доступ к уже загруженным модулям, включая os и io.
-- Fix: exclude require and package from the sandbox envКорутины и возобновление
Корутина в песочнице, возобновлённая основным процессом, может использоваться для извлечения состояния. Используйте coroutine.wrap осторожно и не возобновляйте корутины песочницы с повышенными привилегиями.
Обход внешних значений
Без библиотеки отладки код в песочнице не может обходить внешние значения. Но если debug.getupvalue случайно доступна, с её помощью можно получить доступ к _G.
__newindex в safeEnv
Добавьте __newindex в метатаблицу окружения песочницы, чтобы код в песочнице не мог создавать новые глобальные имена, скрывающие безопасные.
setmetatable(safeEnv, {
__newindex = function(_, k, v)
-- allow only whitelisted keys or reject
error("Global assignment not allowed: " .. k)
end
})Прокси для библиотеки math
Вместо передачи настоящей таблицы math (у которой общая метатаблица со стандартной библиотекой) создайте поверхностную копию только с нужными функциями.
Автоматическое тестирование обхода защиты
Поддерживайте набор тестов для фаззинга, который проверяет известные способы обхода защиты вашей песочницы. Запускайте его после каждого изменения кода песочницы.
Многоуровневая защита
Идеальных песочниц не бывает. Сочетайте несколько уровней защиты: ограниченное окружение + ограничения на количество инструкций + ограничения памяти + изоляция процессов на уровне ОС (отдельный дочерний процесс или контейнер).
Песочница на уровне ОС
Для максимальной безопасности запускайте Lua в дочернем процессе с ограничениями на уровне ОС: seccomp (Linux), App Sandbox (macOS) или Docker с файловой системой только для чтения.
Вопрос об обходе песочницы
Почему rawget необходимо исключить из песочницы?
Итоги: предотвращение обхода песочницы
Исключите из песочницы debug, rawget/rawset, package, require и load. Защитите окружение песочницы с помощью __newindex. Копируйте таблицы библиотек, а не ссылайтесь на оригиналы. Для максимальной безопасности добавьте изоляцию на уровне ОС.
Часто задаваемые вопросы
Урок «Предотвращение выхода из песочницы» бесплатный?
Да — полный текст урока «Предотвращение выхода из песочницы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Предотвращение выхода из песочницы»?
Блокируйте доступ к библиотеке debug, неправильное использование rawget/rawset и утечки внешних значений. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Предотвращение выхода из песочницы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Модель _ENV в Lua 5.2+
- Создание ограниченной песочницы
- Предотвращение выхода из песочницы
- Ограничения ресурсов и инструментирование