tgoop.com/pro_python_code/1849
Last Update:
🧠 Сложная и интересная задача для Python-инженеров:
"Запусти чужой Python-код... но так, чтобы он не сломал твой сервер"
Представь, ты разрабатываешь платформу, где пользователи могут запускать произвольные Python-скрипты:
например, в формате онлайн-компилятора, песочницы для тестов, или генератора графиков.
📌 Условия задачи:
Ты должен написать систему, которая:
• Принимает произвольный Python-код от пользователя
• Выполняет его безопасно и изолированно
• Ограничивает время выполнения до 2 секунд
• Ограничивает память до 128 MB
• Блокирует доступ к файловой системе, сети, subprocess, fork
• Возвращает stdout
, stderr
и статус выполнения
🛡️ Безопасность — ключ:
• Скрипт может попытаться сделать os.remove('/')
, import socket
, while True:
и т.п.
• Ваша система не должна пострадать. Даже если кто-то пошлёт fork-бомбу или запросит весь RAM.
📦 Технические ограничения:
• Решение должно быть на Python
• Можно использовать Docker, podman, или Firecracker — но обоснуй выбор
• Стандартная библиотека разрешена, но доступ к os
, sys.modules
, inspect
, eval
, __import__
— должен быть отключён или переопределён
• Никаких внешних HTTP-запросов, файловых сокетов или pip install
🔧 Что ожидается:
1. Функция запуска:
result = run_code_safely(code="print(2 + 2)")
# result = { "stdout": "4\n", "stderr": "", "exit_code": 0, "status": "ok" }
Изоляция среды:
• Вариант 1: через запуск контейнера с ограничениями (docker run --rm --net=none --memory=128m)
• Вариант 2: через Firejail / chroot / seccomp / AppArmor профили
• Вариант 3: через интерпретатор Python внутри subprocess с ограничениями через resource, signal, ast и multiprocessing.Process
Блокировка опасных импортов и функций:
• Запретить import os, import subprocess, import, eval, exec, open, globals()
• Пример: AST-парсер удаляет запрещённые ноды до запуска
Обработка ошибок и ограничений:
• TimeoutExceededError — если код работает > 2 сек
• MemoryLimitError — если процесс превысил лимит
• SecurityViolation — при попытке запрещённого импорта или доступа
Опционально — FastAPI API:
POST /run
{
"code": "for i in range(10): print(i)"
}
→ Ответ:
{
"stdout": "0\n1\n2\n...\n",
"stderr": "",
"status": "ok",
"time": 0.032
}
🎯 Цель:
Собрать систему, которая запускает потенциально опасный код от незнакомцев — и не падает, не зависает, не открывает доступ к хосту.
🤯 Challenge:
• Как отследить попытку from os import system?
• Что делать с __import__('os').system('ls')?
• Как гарантировать остановку при while True: pass?
• Как контролировать память на уровне Python?
✅ Если решишь — ты разберёшься с:
• AST-парсингом и безопасностью исполнения Python
• Управлением ресурсами (CPU, RAM, время) на уровне ОС
• Изоляцией через контейнеры и sandbox-окружения
• Построением безопасных API и интерпретаторов
BY Python RU
Share with your friend now:
tgoop.com/pro_python_code/1849