micropython-wasm 0.1a2: запуск Python-кода в изолированной WASM-песочнице

6 июня 2026 года Саймон Уиллисон (Simon Willison) — создатель Datasette и один из самых известных Python-разработчиков открытого сообщества — выпустил версию micropython-wasm 0.1a2. Это альфа-релиз Python-библиотеки, которая позволяет безопасно запускать произвольный Python-код внутри изолированной среды на основе WebAssembly (WASM — компактный бинарный формат выполнения кода, изначально созданный для браузеров).

ℹ Что такое micropython-wasm?
micropython-wasm — экспериментальная Python-библиотека, которая запускает фрагменты кода на MicroPython внутри свежего WebAssembly-окружения. Каждый запуск изолирован: нет доступа к файловой системе хоста, нет сетевых подключений, жёсткий лимит памяти и CPU.

Зачем нужна изоляция кода?

Запуск стороннего или автоматически сгенерированного кода — давняя головная боль для разработчиков. Все плагинные системы Уиллисона построены на Python и Pluggy, а значит, код плагинов выполняется с полными привилегиями внутри основного приложения. Это создаёт серьёзный риск: один ненадёжный плагин — и всё приложение скомпрометировано.

Уиллисон экспериментировал с различными подходами к запуску кода в sandbox на протяжении нескольких лет, и его последняя попытка, по его словам, наконец-то обладает всеми характеристиками, которые он искал.

Настоящая изоляция кода — это не ограничение возможностей, а фундамент для безопасного расширения. Без надёжного sandbox плагин и агент становятся потенциальной дырой в безопасности.

Почему именно WebAssembly?

WebAssembly — значительно более подходящий кандидат для изоляции: он был спроектирован с самого начала с учётом всех необходимых характеристик и прошёл проверку в браузерах почти за десятилетие.

Динамические языки вроде JavaScript и Python сложнее изолировать — они поддерживают такие примитивы, как eval(), а значит, для их выполнения нужен полноценный интерпретатор во время исполнения. Для запуска Python необходим полный интерпретатор, скомпилированный в WebAssembly, с возможностью подавать ему код, подключать хост-функции и получать результаты.

Pyodide предлагает отличный пакет для запуска Python через WebAssembly в браузере, но использование Pyodide на стороне сервера не поддерживается. Именно здесь на сцену выходит MicroPython.

MicroPython — компактная и эффективная версия Python, разработанная для работы в ресурсоограниченных средах, таких как микроконтроллеры; поддерживает подмножество возможностей языка и работает с минимальным потреблением памяти.

💡 Сравнение с Docker-контейнерами
По сравнению с традиционными методами изоляции, такими как Docker-контейнеры, WebAssembly-sandbox гораздо легче и стартует практически мгновенно: Docker-контейнеры загружаются сотни миллисекунд, а WASM-sandbox — менее чем за 1 миллисекунду.

Что нового в версии 0.1a2: CLI-интерфейс

Главное нововведение версии 0.1a2 — добавление полноценного CLI (интерфейса командной строки). В релизе добавлен CLI: micropython-wasm для запуска REPL (интерактивной консоли), micropython-wasm filename.py для выполнения файла и micropython-wasm -c "print('hi')" для прямого выполнения кода.

Благодаря CLI-режиму можно попробовать библиотеку через uvx без предварительной установки.

Примеры использования из командной строки

# Простой запуск кода
uvx micropython-wasm -c 'print("Hello world")'

# Пример бесконечного цикла — покажет исчерпание «топлива» (fuel)
uvx micropython-wasm -c 's = ""; while True: s += "longer"'
# Вывод: micropython-wasm: guest exited with code 1

# Запуск REPL (интерактивная сессия)
micropython-wasm

# Запуск файла
micropython-wasm my_script.py

# Настройка лимитов памяти и CPU
micropython-wasm --memory 33554432 --fuel 20000000 -c "print('hello')"

Использование из Python-кода

from micropython_wasm import run

result = run(
    "print(sum(range(10)))",
    memory_bytes=16 * 1024 * 1024,  # 16 МБ памяти
    fuel=20_000_000,                 # лимит операций
    wall_timeout_seconds=1.0,        # таймаут по времени
    host_result_bytes=256 * 1024,
)

Архитектура и механизмы защиты

Проект является экспериментальным Python-пакетом для запуска небольших фрагментов MicroPython в свежем WebAssembly-sandbox.

Sandbox реализует строгую изоляцию: нет доступа к файловой системе хоста (если явно не открыта директория только для чтения), нет сетевого доступа, при этом есть настраиваемые лимиты памяти WebAssembly, «топлива» (fuel) и таймер реального времени.

Концепция «топлива» (fuel) в wasmtime — это оригинальный способ ограничить нагрузку на CPU: wasmtime предлагает концепцию “fuel” для ограничения количества операций, которые может выполнить WebAssembly-вызов, — это идеально подходит для данной задачи, хотя единицы измерения трудно интерпретировать. Уиллисон экспериментирует со значением по умолчанию в 20 миллионов единиц топлива, но не уверен, что это оптимальная величина.


graph TD
    A[Python-код пользователя / ИИ-агент] --> B[micropython-wasm API]
    B --> C[Wasmtime — движок WebAssembly]
    C --> D[MicroPython WASI-модуль]
    D --> E{Лимиты}
    E --> F[Память: memory_bytes]
    E --> G[CPU: fuel]
    E --> H[Время: wall_timeout]
    D --> I[Результат выполнения]
    I --> B
    B --> J[Ответ хост-приложению]
    style E fill:#ff9800,color:#fff
    style F fill:#f44336,color:#fff
    style G fill:#f44336,color:#fff
    style H fill:#f44336,color:#fff

Параметры управления sandbox

ПараметрОписаниеЗначение по умолчанию
memory_bytesМаксимальный объём линейной памяти WebAssembly
fuelБюджет «топлива» Wasmtime (лимит операций CPU)20 000 000
wall_timeout_secondsТаймаут по реальному времени1.0 с
readonly_dirДиректория хоста, доступная внутри sandbox только для чтенияNone
host_functionsСловарь хост-функций, доступных из sandboxNone
host_result_bytesМаксимальный размер ответа от хост-функции256 КБ

Применение: ИИ-агенты и плагины

Уиллисон уже использует библиотеку для плагина выполнения кода в Datasette Agent под названием datasette-agent-micropython.

Он также «заперел» GPT‑5.5 (режим xhigh) в этом плагине Datasette Agent и предложил модели попытаться вырваться из sandbox — до сих пор ей это не удалось.

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

⚠ Статус: альфа-версия
Уиллисон с иронией замечает, что, жаловавшись на незрелые и плохо поддерживаемые библиотеки для sandbox, он теперь сам написал одну. Он намеренно пометил её как альфа-версию и не готов рекомендовать её тем, кто не готов взять на себя существенный риск — хотя сам уже использует её в своих проектах.

Два режима сессий: одноразовый и персистентный

Библиотека предлагает два режима: свежий экземпляр Wasmtime для одноразового выполнения и опциональный API персистентных сессий на основе фонового потока.

MicroPythonReplaySession не использует фоновый поток и не хранит живую MicroPython-VM между вызовами. Каждый вызов run() создаёт новый экземпляр Wasmtime и завершается после выполнения одной команды. Для сохранения переменных, функций, классов и импортов между вызовами сессия воссоздаёт состояние, заново воспроизводя предыдущие успешные фрагменты перед каждым новым.

📝 Практический сценарий: автономный агент
Представьте ИИ-агента, который помогает анализировать данные и пишет Python-скрипты на лету. Без sandbox каждый такой скрипт имеет полный доступ к серверу. С micropython-wasm каждый запуск изолирован: агент не может прочитать файлы, обратиться к сети или «сломать» основное приложение — даже если его намеренно об этом попросить.

Как попробовать прямо сейчас

Альфа-версия micropython-wasm уже доступна на PyPI. Попробовать её можно из собственного Python-кода согласно README.

# Установка через pip
pip install micropython-wasm

# Или запустить без установки через uvx
uvx micropython-wasm -c 'print("Привет из sandbox!")'

# Интерактивная консоль
uvx micropython-wasm

Итоги

WebAssembly и MicroPython вместе создают мощную комбинацию для безопасного динамического выполнения кода. По мере роста поддержки WebAssembly всё больше проектов будет принимать эти sandbox. Они предлагают почти мгновенный старт, тонкое управление и надёжную безопасность.

micropython-wasm — это не просто библиотека для изоляции кода. Это демонстрация принципа: WebAssembly, давно ставший стандартом безопасности в браузере, может и должен применяться на сервере — особенно в эпоху ИИ-агентов, которые пишут и запускают код самостоятельно.

Для тех, кто строит системы плагинов, ИИ-агентов или платформы выполнения кода, — это захватывающее направление, за которым стоит следить.


Ссылки: