compile(source, filename, mode) создаёт объект кода, но не выполняет его. exec/eval с отдельными globals не образуют безопасную песочницу для недоверенного Python и не предотвращают RCE.
Опишите механику работы встроенной функции compile(). Как превратить динамически сгенерированную строку с кодом на Python в объект кода (code object), безопасно выполнить его в изолированном контексте с помощью exec/eval и предотвратить уязвимости удалённого выполнения кода (RCE)?
compile(source, filename, mode) создаёт объект кода, но не выполняет его. exec/eval с отдельными globals не образуют безопасную песочницу для недоверенного Python и не предотвращают RCE.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
compile(source, filename, mode) создаёт объект кода, но не выполняет его. exec/eval с отдельными globals не образуют безопасную песочницу для недоверенного Python и не предотвращают RCE.
Режим exec предназначен для блока инструкций, eval — для выражения, single — для интерактивной инструкции. Для доверенного выражения можно создать code = compile('2 + 3', '<expr>', 'eval'), затем вычислить его. Удаление builtins не гарантирует изоляцию: модель объектов Python допускает обходы наивных ограничений. Пользовательские данные лучше обрабатывать декларативным форматом или ограниченным DSL. Если нужен произвольный код, используйте отдельную жёстко изолированную среду без секретов, с лимитами ресурсов и сетевого доступа.