💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На работу отведено 85 минут. После завершения можно посмотреть правильные ответы, объяснения и результат по каждой теме.
Вопрос 1 из 30
Что нужно знать о Lua, прежде чем предсказывать результат этого кода? Ответ должен описывать основной механизм раздела «Ограничение окружения».
Lua Lua · Ограничение окружения · разбор 1 Копировать
local env={assert=assert,error=error,ipairs=ipairs,pairs=pairs,
tonumber=tonumber,tostring=tostring,type=type,
math=readonly(math),string=readonly(string),table=safe_table}
local chunk=assert(load(source,"guest","t",env))
Наблюдаемый результат в разделе «Ограничение окружения» опирается на правило: Профилирование песочницы включает стоимость проверок и худшие входы; лимит, который срабатывает только после исчерпания памяти процесса, уже не защищает соседние задачи.
Наблюдаемый результат в разделе «Ограничение окружения» опирается на правило: Сильная изоляция часто требует отдельного процесса или контейнера: внутрипроцессная песочница быстрее, но разделяет адресное пространство и риск аварии нативного расширения.
Наблюдаемый результат в разделе «Ограничение окружения» опирается на правило: Песочница должна выдавать отдельное окружение с белым списком значений; копирование _G с последующим удалением нескольких имён оставляет неожиданные пути к опасным объектам.
Наблюдаемый результат в разделе «Ограничение окружения» опирается на правило: Лимит инструкций через hook, лимит памяти на стороне аллокатора и внешний тайм-аут дополняют друг друга; ни один из них в одиночку не ограничивает все C-функции и ресурсы.
Наблюдаемый результат в разделе «Ограничение окружения» опирается на правило: Из окружения исключают io, os, package, debug, loadfile и непросмотренные userdata; безопасная функция-обёртка должна проверять аргументы и не возвращать привилегированные ссылки.
Вопрос 2 из 30
Какой отказ должен быть воспроизводимым в тесте? Нужен отрицательный сценарий для раздела «Ограничение окружения».
Lua Lua · Ограничение окружения · разбор 2 Копировать
local function reproduce_case()
local env={assert=assert,error=error,ipairs=ipairs,pairs=pairs,
tonumber=tonumber,tostring=tostring,type=type,
math=readonly(math),string=readonly(string),table=safe_table}
local chunk=assert(load(source,"guest","t",env))
end
reproduce_case()
Скрытая граница раздела «Ограничение окружения» проявляется так: Лимит инструкций через hook, лимит памяти на стороне аллокатора и внешний тайм-аут дополняют друг друга; ни один из них в одиночку не ограничивает все C-функции и ресурсы.
Скрытая граница раздела «Ограничение окружения» проявляется так: Профилирование песочницы включает стоимость проверок и худшие входы; лимит, который срабатывает только после исчерпания памяти процесса, уже не защищает соседние задачи.
Скрытая граница раздела «Ограничение окружения» проявляется так: Из окружения исключают io, os, package, debug, loadfile и непросмотренные userdata; безопасная функция-обёртка должна проверять аргументы и не возвращать привилегированные ссылки.
Скрытая граница раздела «Ограничение окружения» проявляется так: Сильная изоляция часто требует отдельного процесса или контейнера: внутрипроцессная песочница быстрее, но разделяет адресное пространство и риск аварии нативного расширения.
Скрытая граница раздела «Ограничение окружения» проявляется так: Песочница должна выдавать отдельное окружение с белым списком значений; копирование _G с последующим удалением нескольких имён оставляет неожиданные пути к опасным объектам.
Вопрос 3 из 30
Какая гарантия важнее сохранения точной формы кода? Нужен основной контракт раздела «Ограничение окружения».
Lua Lua · Ограничение окружения · разбор 3 Копировать
do
local env={assert=assert,error=error,ipairs=ipairs,pairs=pairs,
tonumber=tonumber,tostring=tostring,type=type,
math=readonly(math),string=readonly(string),table=safe_table}
local chunk=assert(load(source,"guest","t",env))
end
Регрессионный контракт раздела «Ограничение окружения» требует: Песочница должна выдавать отдельное окружение с белым списком значений; копирование _G с последующим удалением нескольких имён оставляет неожиданные пути к опасным объектам.
Регрессионный контракт раздела «Ограничение окружения» требует: Профилирование песочницы включает стоимость проверок и худшие входы; лимит, который срабатывает только после исчерпания памяти процесса, уже не защищает соседние задачи.
Регрессионный контракт раздела «Ограничение окружения» требует: Лимит инструкций через hook, лимит памяти на стороне аллокатора и внешний тайм-аут дополняют друг друга; ни один из них в одиночку не ограничивает все C-функции и ресурсы.
Регрессионный контракт раздела «Ограничение окружения» требует: Сильная изоляция часто требует отдельного процесса или контейнера: внутрипроцессная песочница быстрее, но разделяет адресное пространство и риск аварии нативного расширения.
Регрессионный контракт раздела «Ограничение окружения» требует: Из окружения исключают io, os, package, debug, loadfile и непросмотренные userdata; безопасная функция-обёртка должна проверять аргументы и не возвращать привилегированные ссылки.
Вопрос 6 из 30
Что нельзя заменить привычкой из другого языка при чтении этого кода? Ответ должен описывать основной механизм раздела «Запрет опасных API».
Lua Lua · Запрет опасных API · разбор 1 Копировать
local env={print=safe_print,math=readonly(math)}
assert(env.io==nil and env.os==nil and env.package==nil and env.debug==nil)
return assert(load(source,"guest","t",env))
Поведение строки из раздела «Запрет опасных API» определяется правилом: Профилирование песочницы включает стоимость проверок и худшие входы; лимит, который срабатывает только после исчерпания памяти процесса, уже не защищает соседние задачи.
Поведение строки из раздела «Запрет опасных API» определяется правилом: Лимит инструкций через hook, лимит памяти на стороне аллокатора и внешний тайм-аут дополняют друг друга; ни один из них в одиночку не ограничивает все C-функции и ресурсы.
Поведение строки из раздела «Запрет опасных API» определяется правилом: Песочница должна выдавать отдельное окружение с белым списком значений; копирование _G с последующим удалением нескольких имён оставляет неожиданные пути к опасным объектам.
Поведение строки из раздела «Запрет опасных API» определяется правилом: Из окружения исключают io, os, package, debug, loadfile и непросмотренные userdata; безопасная функция-обёртка должна проверять аргументы и не возвращать привилегированные ссылки.
Поведение строки из раздела «Запрет опасных API» определяется правилом: Сильная изоляция часто требует отдельного процесса или контейнера: внутрипроцессная песочница быстрее, но разделяет адресное пространство и риск аварии нативного расширения.
Вопрос 8 из 30
Что должно пережить замену вспомогательных функций и имён переменных? Речь идёт о центральном правиле раздела «Запрет опасных API».
Lua Lua · Запрет опасных API · разбор 3 Копировать
do
local env={print=safe_print,math=readonly(math)}
assert(env.io==nil and env.os==nil and env.package==nil and env.debug==nil)
return assert(load(source,"guest","t",env))
end
После правки раздела «Запрет опасных API» должно оставаться верным: Из окружения исключают io, os, package, debug, loadfile и непросмотренные userdata; безопасная функция-обёртка должна проверять аргументы и не возвращать привилегированные ссылки.
После правки раздела «Запрет опасных API» должно оставаться верным: Лимит инструкций через hook, лимит памяти на стороне аллокатора и внешний тайм-аут дополняют друг друга; ни один из них в одиночку не ограничивает все C-функции и ресурсы.
После правки раздела «Запрет опасных API» должно оставаться верным: Сильная изоляция часто требует отдельного процесса или контейнера: внутрипроцессная песочница быстрее, но разделяет адресное пространство и риск аварии нативного расширения.
После правки раздела «Запрет опасных API» должно оставаться верным: Песочница должна выдавать отдельное окружение с белым списком значений; копирование _G с последующим удалением нескольких имён оставляет неожиданные пути к опасным объектам.
После правки раздела «Запрет опасных API» должно оставаться верным: Профилирование песочницы включает стоимость проверок и худшие входы; лимит, который срабатывает только после исчерпания памяти процесса, уже не защищает соседние задачи.
Вопрос 12 из 30
Какой риск останется незамеченным, если выполнить код только один раз? Нужен отрицательный сценарий для раздела «Лимиты ресурсов».
Lua Lua · Лимиты ресурсов · разбор 2 Копировать
local function reproduce_case()
local budget=100000
local function hook()
budget=budget-1000
if budget<=0 then error("instruction budget exceeded") end
end
debug.sethook(hook,"",1000)
local ok,err=pcall(chunk)
debug.sethook()
end
reproduce_case()
Для раздела «Лимиты ресурсов» отдельным тестом подтверждают: Из окружения исключают io, os, package, debug, loadfile и непросмотренные userdata; безопасная функция-обёртка должна проверять аргументы и не возвращать привилегированные ссылки.
Для раздела «Лимиты ресурсов» отдельным тестом подтверждают: Профилирование песочницы включает стоимость проверок и худшие входы; лимит, который срабатывает только после исчерпания памяти процесса, уже не защищает соседние задачи.
Для раздела «Лимиты ресурсов» отдельным тестом подтверждают: Лимит инструкций через hook, лимит памяти на стороне аллокатора и внешний тайм-аут дополняют друг друга; ни один из них в одиночку не ограничивает все C-функции и ресурсы.
Для раздела «Лимиты ресурсов» отдельным тестом подтверждают: Песочница должна выдавать отдельное окружение с белым списком значений; копирование _G с последующим удалением нескольких имён оставляет неожиданные пути к опасным объектам.
Для раздела «Лимиты ресурсов» отдельным тестом подтверждают: Сильная изоляция часто требует отдельного процесса или контейнера: внутрипроцессная песочница быстрее, но разделяет адресное пространство и риск аварии нативного расширения.
Вопрос 15 из 30
Что нельзя вывести из одного удачного примера, но нужно знать о разделе «Лимиты ресурсов»? Выберите описание, объединяющее механизм и границу раздела «Лимиты ресурсов».
Весь контракт раздела «Лимиты ресурсов» сводится к следующему: Профилирование песочницы включает стоимость проверок и худшие входы; лимит, который срабатывает только после исчерпания памяти процесса, уже не защищает соседние задачи.
Весь контракт раздела «Лимиты ресурсов» сводится к следующему: Лимит инструкций через hook, лимит памяти на стороне аллокатора и внешний тайм-аут дополняют друг друга; ни один из них в одиночку не ограничивает все C-функции и ресурсы.
Весь контракт раздела «Лимиты ресурсов» сводится к следующему: Сильная изоляция часто требует отдельного процесса или контейнера: внутрипроцессная песочница быстрее, но разделяет адресное пространство и риск аварии нативного расширения.
Весь контракт раздела «Лимиты ресурсов» сводится к следующему: Из окружения исключают io, os, package, debug, loadfile и непросмотренные userdata; безопасная функция-обёртка должна проверять аргументы и не возвращать привилегированные ссылки.
Весь контракт раздела «Лимиты ресурсов» сводится к следующему: Песочница должна выдавать отдельное окружение с белым списком значений; копирование _G с последующим удалением нескольких имён оставляет неожиданные пути к опасным объектам.
Вопрос 17 из 30
Какой крайний случай важнее всего добавить к проверке? Нужен отрицательный сценарий для раздела «Недоверенный код».
Lua Lua · Недоверенный код · разбор 2 Копировать
local function reproduce_case()
local source=read_untrusted()
assert(#source<=65536)
local chunk,err=load(source,"guest","t",env)
if not chunk then return reject(err) end
return run_isolated(chunk)
end
reproduce_case()
Второй запуск раздела «Недоверенный код» нужен, чтобы увидеть: Из окружения исключают io, os, package, debug, loadfile и непросмотренные userdata.
Второй запуск раздела «Недоверенный код» нужен, чтобы увидеть: Песочница проектируется как граница безопасности, а не как фильтр текста.
Второй запуск раздела «Недоверенный код» нужен, чтобы увидеть: Профилирование песочницы включает стоимость проверок и худшие входы.
Второй запуск раздела «Недоверенный код» нужен, чтобы увидеть: Ни один из них в одиночку не ограничивает все C-функции и ресурсы.
Второй запуск раздела «Недоверенный код» нужен, чтобы увидеть: Песочница должна выдавать отдельное окружение с белым списком значений.
Вопрос 21 из 30
Результат здесь задаёт не соглашение проекта, а правило языка. Какое? Выберите основное правило раздела «Профилирование решения».
Lua Lua · Профилирование решения · разбор 1 Копировать
for _,case in ipairs(adversarial_cases) do
local started=clock()
local ok,err=run_with_limits(case.source,case.input)
record(case.name,ok,clock()-started,memory_used())
end
Строку из раздела «Профилирование решения» нужно читать так: Песочница должна выдавать отдельное окружение с белым списком значений; копирование _G с последующим удалением нескольких имён оставляет неожиданные пути к опасным объектам.
Строку из раздела «Профилирование решения» нужно читать так: Профилирование песочницы включает стоимость проверок и худшие входы; лимит, который срабатывает только после исчерпания памяти процесса, уже не защищает соседние задачи.
Строку из раздела «Профилирование решения» нужно читать так: Из окружения исключают io, os, package, debug, loadfile и непросмотренные userdata; безопасная функция-обёртка должна проверять аргументы и не возвращать привилегированные ссылки.
Строку из раздела «Профилирование решения» нужно читать так: Лимит инструкций через hook, лимит памяти на стороне аллокатора и внешний тайм-аут дополняют друг друга; ни один из них в одиночку не ограничивает все C-функции и ресурсы.
Строку из раздела «Профилирование решения» нужно читать так: Сильная изоляция часто требует отдельного процесса или контейнера: внутрипроцессная песочница быстрее, но разделяет адресное пространство и риск аварии нативного расширения.
Вопрос 22 из 30
Какую границу стоит сделать явной в регрессионной проверке? Выберите именно проверяемую границу раздела «Профилирование решения».
Lua Lua · Профилирование решения · разбор 2 Копировать
local function reproduce_case()
for _,case in ipairs(adversarial_cases) do
local started=clock()
local ok,err=run_with_limits(case.source,case.input)
record(case.name,ok,clock()-started,memory_used())
end
end
reproduce_case()
Отрицательный сценарий для раздела «Профилирование решения» фиксирует: Из окружения исключают io, os, package, debug, loadfile и непросмотренные userdata.
Отрицательный сценарий для раздела «Профилирование решения» фиксирует: Копирование _G с последующим удалением нескольких имён оставляет неожиданные пути к опасным объектам.
Отрицательный сценарий для раздела «Профилирование решения» фиксирует: Лимит инструкций через hook, лимит памяти на стороне аллокатора и внешний тайм-аут дополняют друг друга.
Отрицательный сценарий для раздела «Профилирование решения» фиксирует: Лимит, который срабатывает только после исчерпания памяти процесса, уже не защищает соседние задачи.
Отрицательный сценарий для раздела «Профилирование решения» фиксирует: Безопасная функция-обёртка должна проверять аргументы и не возвращать привилегированные ссылки.
Вопрос 23 из 30
Внутреннюю реализацию меняют. Что обязано остаться верным снаружи? Нужен основной контракт раздела «Профилирование решения».
Lua Lua · Профилирование решения · разбор 3 Копировать
do
for _,case in ipairs(adversarial_cases) do
local started=clock()
local ok,err=run_with_limits(case.source,case.input)
record(case.name,ok,clock()-started,memory_used())
end
end
Внешнее поведение раздела «Профилирование решения» сохраняется при условии: Песочница должна выдавать отдельное окружение с белым списком значений; копирование _G с последующим удалением нескольких имён оставляет неожиданные пути к опасным объектам.
Внешнее поведение раздела «Профилирование решения» сохраняется при условии: Лимит инструкций через hook, лимит памяти на стороне аллокатора и внешний тайм-аут дополняют друг друга; ни один из них в одиночку не ограничивает все C-функции и ресурсы.
Внешнее поведение раздела «Профилирование решения» сохраняется при условии: Профилирование песочницы включает стоимость проверок и худшие входы; лимит, который срабатывает только после исчерпания памяти процесса, уже не защищает соседние задачи.
Внешнее поведение раздела «Профилирование решения» сохраняется при условии: Из окружения исключают io, os, package, debug, loadfile и непросмотренные userdata; безопасная функция-обёртка должна проверять аргументы и не возвращать привилегированные ссылки.
Внешнее поведение раздела «Профилирование решения» сохраняется при условии: Сильная изоляция часто требует отдельного процесса или контейнера: внутрипроцессная песочница быстрее, но разделяет адресное пространство и риск аварии нативного расширения.
Вопрос 26 из 30
Какое правило точнее всего описывает происходящее в строке «local result=worker_process:run({script=source,input=input},»? Нужна именно центральная гарантия раздела «Архитектурные компромиссы».
Lua Lua · Архитектурные компромиссы · разбор 1 Копировать
local result=worker_process:run({script=source,input=input},
{cpu_ms=50,memory_mb=32,wall_ms=200})
if result.crashed then quarantine(script_id) end
Результат кода в разделе «Архитектурные компромиссы» объясняет утверждение: Профилирование песочницы включает стоимость проверок и худшие входы; лимит, который срабатывает только после исчерпания памяти процесса, уже не защищает соседние задачи.
Результат кода в разделе «Архитектурные компромиссы» объясняет утверждение: Из окружения исключают io, os, package, debug, loadfile и непросмотренные userdata; безопасная функция-обёртка должна проверять аргументы и не возвращать привилегированные ссылки.
Результат кода в разделе «Архитектурные компромиссы» объясняет утверждение: Сильная изоляция часто требует отдельного процесса или контейнера: внутрипроцессная песочница быстрее, но разделяет адресное пространство и риск аварии нативного расширения.
Результат кода в разделе «Архитектурные компромиссы» объясняет утверждение: Лимит инструкций через hook, лимит памяти на стороне аллокатора и внешний тайм-аут дополняют друг друга; ни один из них в одиночку не ограничивает все C-функции и ресурсы.
Результат кода в разделе «Архитектурные компромиссы» объясняет утверждение: Песочница должна выдавать отдельное окружение с белым списком значений; копирование _G с последующим удалением нескольких имён оставляет неожиданные пути к опасным объектам.
Вопрос 27 из 30
Обычный запуск проходит. Какое граничное поведение обязан проверить второй тест? Нужен отрицательный сценарий для раздела «Архитектурные компромиссы».
Lua Lua · Архитектурные компромиссы · разбор 2 Копировать
local function reproduce_case()
local result=worker_process:run({script=source,input=input},
{cpu_ms=50,memory_mb=32,wall_ms=200})
if result.crashed then quarantine(script_id) end
end
reproduce_case()
Граничный тест раздела «Архитектурные компромиссы» должен показать: Профилирование песочницы включает стоимость проверок и худшие входы; лимит, который срабатывает только после исчерпания памяти процесса, уже не защищает соседние задачи.
Граничный тест раздела «Архитектурные компромиссы» должен показать: Сильная изоляция часто требует отдельного процесса или контейнера: внутрипроцессная песочница быстрее, но разделяет адресное пространство и риск аварии нативного расширения.
Граничный тест раздела «Архитектурные компромиссы» должен показать: Лимит инструкций через hook, лимит памяти на стороне аллокатора и внешний тайм-аут дополняют друг друга; ни один из них в одиночку не ограничивает все C-функции и ресурсы.
Граничный тест раздела «Архитектурные компромиссы» должен показать: Песочница должна выдавать отдельное окружение с белым списком значений; копирование _G с последующим удалением нескольких имён оставляет неожиданные пути к опасным объектам.
Граничный тест раздела «Архитектурные компромиссы» должен показать: Из окружения исключают io, os, package, debug, loadfile и непросмотренные userdata; безопасная функция-обёртка должна проверять аргументы и не возвращать привилегированные ссылки.
Вопрос 28 из 30
Что должно пережить замену вспомогательных функций и имён переменных? Выберите гарантию, определяющую раздел «Архитектурные компромиссы».
Lua Lua · Архитектурные компромиссы · разбор 3 Копировать
do
local result=worker_process:run({script=source,input=input},
{cpu_ms=50,memory_mb=32,wall_ms=200})
if result.crashed then quarantine(script_id) end
end
После правки раздела «Архитектурные компромиссы» должно оставаться верным: Сильная изоляция часто требует отдельного процесса или контейнера: внутрипроцессная песочница быстрее, но разделяет адресное пространство и риск аварии нативного расширения.
После правки раздела «Архитектурные компромиссы» должно оставаться верным: Лимит инструкций через hook, лимит памяти на стороне аллокатора и внешний тайм-аут дополняют друг друга; ни один из них в одиночку не ограничивает все C-функции и ресурсы.
После правки раздела «Архитектурные компромиссы» должно оставаться верным: Песочница должна выдавать отдельное окружение с белым списком значений; копирование _G с последующим удалением нескольких имён оставляет неожиданные пути к опасным объектам.
После правки раздела «Архитектурные компромиссы» должно оставаться верным: Из окружения исключают io, os, package, debug, loadfile и непросмотренные userdata; безопасная функция-обёртка должна проверять аргументы и не возвращать привилегированные ссылки.
После правки раздела «Архитектурные компромиссы» должно оставаться верным: Профилирование песочницы включает стоимость проверок и худшие входы; лимит, который срабатывает только после исчерпания памяти процесса, уже не защищает соседние задачи.