Uruchamianie kodu Pythona w piaskownicy za pomocą MicroPython i WASM

Uruchamianie kodu Pythona w piaskownicy za pomocą MicroPython i WASM


Uruchamianie kodu Pythona w piaskownicy za pomocą MicroPython i WASM

6 czerwca 2026 r

Od kilku lat eksperymentuję z różnymi podejściami do uruchamiania kodu w piaskownicy, ale moja ostatnia próba wydaje mi się, że w końcu może mieć wszystkie cechy, których szukałem. Wydałem go jako pakiet alfa o nazwie micropython-wasm i używam go do wtyczki piaskownicy do wykonywania kodu dla agenta Datasette o nazwie datasette-agent-micropython.

Dlaczego chcę piaskownicę?

Wszystkie moje kluczowe projekty open source — Datasette, LLM, a nawet sqlite-utils — obsługują wtyczki.

Bardzo lubię wtyczki jako mechanizm rozbudowy oprogramowania. Starannie zaprojektowany system wtyczek zmniejsza ryzyko związane z próbowaniem nowych rzeczy prawie do zera — nawet najśmielsze pomysły nie pozostawią trwałego wpływu na samą podstawową aplikację. W moim oprogramowaniu można dodać nową funkcję z dnia na dzień i nie muszę nawet przeglądać żądania ściągnięcia!

Jest jedna poważna wada: wszystkie moje systemy wtyczek używają Pythona i Pluggy, a kod wtyczki jest wykonywany z pełnymi uprawnieniami w moich aplikacjach. Błędna lub złośliwa wtyczka może wszystko zepsuć lub spowodować wyciek prywatnych danych.

Bardzo chciałbym móc uruchamiać kod w stylu wtyczki w środowisku, w którym nie można odczytać niezatwierdzonych plików, połączyć się z siecią lub ogólnie działać w sposób ryzykowny lub szkodliwy dla reszty aplikacji lub komputera użytkownika.

Moje zainteresowania obejmują nie tylko wtyczki. Szczególnie w przypadku Datasette jest wiele funkcji, które chciałbym obsługiwać, gdy przydatne byłoby wykonanie dowolnego kodu. Eksperymentowałem już z tym w przypadku wzbogacania zbiorów danych, gdzie można użyć kodu do przekształcenia wartości przechowywanych w tabeli. Bardzo chciałbym zbudować mechanizm, w którym można uruchamiać kod zgodnie z harmonogramem, który pobiera kod JSON z zatwierdzonej lokalizacji, uruchamia niewielki fragment kodu w celu sformatowania go na listę słowników, a następnie wstawia je jako wiersze w tabeli bazy danych SQLite.

Czego chcę od piaskownicy

Moim celem jest bezpieczne wykonywanie kodu w moich własnych aplikacjach w języku Python. Oto czego potrzebuję:

  • Zależności to zainstaluj czysto z PyPIw tym w razie potrzeby koła binarne na wielu platformach. Nie chcę, aby osoby korzystające z mojego oprogramowania musiały podejmować jakiekolwiek dodatkowe kroki poza bezpośrednią instalacją mojego pakietu Pythona.
  • Wykonywany kod musi podlegać obu pamięć I Procesor limity. nie chcę while True: s += "longer string" spowodować awarię mojej aplikacji lub komputera użytkownika.
  • Dostęp do plików musi być ściśle kontrolowany. Albo w ogóle nie mam dostępu do systemu plików, albo mogę dokładnie zdefiniować, które pliki można czytać, a w których można zapisywać.
  • Dostęp do sieci jest również kontrolowany. Kod w trybie piaskownicy nie powinien być w stanie komunikować się z niczym bez przejścia przez warstwę, którą w pełni kontroluję.
  • Wsparcie interakcji z funkcje gospodarza. Piaskownica nie na wiele się przyda, jeśli nie mogę dokładnie udostępnić wybranych funkcji platformy kodowi, na którym jest ona uruchomiona.
  • To musi być solidny, wspierany i jasno udokumentowany. Straciłem rachubę, ile projektów piaskownicy widziałem w repozytoriach z ostrzeżeniami, że nie są one aktywnie utrzymywane!

WebAssembly wygląda tutaj naprawdę obiecująco

Przeglądarki internetowe działają w najbardziej nieprzyjaznym środowisku, jakie można sobie wyobrazić, jeśli chodzi o złośliwy kod. Ich zadaniem jest pobieranie i wykonać niezaufany kod z Internetu przy prawie każdym ładowaniu strony.

Biorąc to pod uwagę, silniki JavaScript powinny być doskonałymi kandydatami na piaskownice. Niestety te silniki są również niezwykle skomplikowane i nie są przeznaczone do łatwego osadzania w innych projektach. Większość projektów v8 w Pythonie, które widziałem, jest rzadko konserwowana i zawiera ostrzeżenia, aby nie używać ich z całkowicie niezaufanym kodem.

WebAssembly to dużo lepiej kandydat. Został zaprojektowany od początku tak, aby obsługiwał wszystkie funkcje, na których mi zależy i był testowany w przeglądarkach przez prawie dekadę. Biblioteka wasmtime Pythona jest aktywnie utrzymywana i ma koła binarne.

MicroPython w WebAssembly

Silniki WebAssembly, takie jak wasmtime, uruchamiają pliki binarne WebAssembly. Niektóre języki programowania, takie jak Rust, można łatwo skompilować bezpośrednio do WebAssembly. Języki dynamiczne, takie jak JavaScript i Python, są trudniejsze — obsługują prymitywne języki, takie jak eval()co oznacza, że ​​potrzebują pełnego interpretera dostępnego w czasie wykonywania.

Aby uruchomić Python, potrzebujemy pełnego interpretera Pythona skompilowanego do WebAssembly, podłączonego w sposób ułatwiający wprowadzenie kodu, podłączenie funkcji hosta i dostęp do wyników.

Pyodide oferuje znakomity pakiet do uruchamiania Pythona przy użyciu WebAssembly w przeglądarce, ale używanie Pyodide w Pythonie po stronie serwera nie jest obsługiwane. Najnowsza rada, jaką udało mi się znaleźć, pochodzi z października 2024 r. i stwierdza, że ​​„Pyodide jest zbudowany przez zestaw narzędzi Emscripten i można go uruchomić tylko w przeglądarce lub Node.js”.

Któregoś dnia zdecydowałem się przyjrzeć MicroPythonowi jako opcji do tego. Witryna MicroPython mówi:

MicroPython to uproszczona i wydajna implementacja języka programowania Python 3, która zawiera niewielki podzbiór standardowej biblioteki Pythona i jest zoptymalizowana do działania na mikrokontrolerach oraz w ograniczonych środowiskach.

WebAssembly z pewnością wydaje mi się ograniczonym środowiskiem!

Budowanie pierwszej wersji

Poprosiłem GPT-5.5 Pro o wykonanie pewnych badań, co spowodowało, że pojawił się ten PR przeciwko MicroPython autorstwa Yamamoto Takahashi, zatytułowany „Eksperymentalna obsługa WASI dla portów/unix”.

Następnie wygenerował ten dokument research.md, więc pozwoliłem na swobodne korzystanie z Codex Desktop i GPT-5.5, aby zobaczyć, co się stanie:

read the research.md document and build this. You will probably need to write a script that compiles a custom WASM version of MicroPython as part of this project - fetch the MicroPython code to a /tmp directory for this as part of that script.

To zadziałało. Miałem teraz prototypową bibliotekę Pythona, która mogła wykonywać kod Pythona w piaskownicy WebAssembly!

Najtrudniejszym problemem do rozwiązania był trwały stan interpretera. Kompilacja WASM, której tutaj używamy, udostępnia pojedynczy punkt wejścia, który uruchamia interpreter, uruchamia kod, a następnie zatrzymuje interpreter na końcu.

Działa to dobrze w przypadku jednorazowych skryptów, ale w przypadku agenta Datasette chcę, aby zmienne i funkcje pozostawały rezydentne w pamięci, aby móc ich ponownie używać w wielu wywołaniach wykonawczych kodu.

Zaletą pracy z agentami zajmującymi się kodowaniem jest to, że można szybko przejść od pomysłu do sprawdzenia koncepcji. podpowiedziałem:

For keeping variables resident: what if we ran code inside micropython itself which called a host function get_next_python_code() and then passed that to eval() - and that host function blocked until new code was available, maybe by running in a thread with a queue? Could that or a similar idea help here?

Po kilku iteracjach dotarliśmy do wersji, która działa! W kodzie Pythona możesz teraz to zrobić:

from micropython_wasm import MicroPythonSession

with MicroPythonSession() as session:
    print(session.run("x = 10\nprint(x)").stdout)
    print(session.run("x += 5\nprint(x)").stdout)
    print(session.run("print(x * 2)").stdout)

W skrócie uruchamia to wątek, konfiguruje kolejkę żądań, a następnie wysyła wiadomości do tej kolejki w celu session.run() polecenie, za każdym razem oczekując w kolejce odpowiedzi na wynik tego wykonania. Wewnątrz WASM interpreter MicroPython blokuje oczekiwanie na plik __session_next__() host, aby zwrócić następny wiersz kodu, który uruchamia eval() włączone przed zadzwonieniem __session_result__({"id": request_id, "ok": True}) gdy każdy blok został pomyślnie wykonany.

Innym elementem złożoności była obsługa funkcji hosta, więc moja biblioteka Pythona mogła selektywnie udostępniać funkcje, które można następnie wywołać za pomocą kodu uruchomionego w MicroPythonie.

Codex rozwiązał ten problem za pomocą 78 linii C, które ostatecznie zostały skompilowane w blob WebAssembly o wielkości 362 KB, który dystrybuuję wraz z pakietem.

W żadnym wypadku nie jestem programistą C, ale czytałem C i miałem do czynienia z dwoma różnymi modelami, które mi to wyjaśniły (tutaj jest wyjaśnienie Claude’a), po czym poddałem go masie testów.

Wspaniałą rzeczą w pracy z WebAssembly jest to, że jeśli C okaże się fatalnie wadliwy, najgorsze, co może się zdarzyć, to wykonanie WebAssembly zakończy się niepowodzeniem, z wyjątkiem wyjątku. Mogę żyć z tym ryzykiem.

Limity pamięci są bezpośrednio obsługiwane przez wasmtime. Limity procesora są nieco większe: wasmtime oferuje koncepcję „paliwa”, która ogranicza liczbę operacji, które może wykonać wywołanie WebAssembly, i to jest właściwe rozwiązanie tego problemu, ale trudno określić jednostki. Eksperymentuję teraz z domyślnym ustawieniem „paliwa” na poziomie 20 milionów, ale nie jestem pewien, czy jest to najodpowiedniejsza wartość.

Spróbuj sam

The micropython-wasm alpha jest teraz dostępna na PyPI.

Możesz wypróbować to z własnego kodu Pythona, jak opisano w pliku README. Dodałem także prosty tryb CLI w wersji 0.1a2, co oznacza, że ​​możesz spróbować go użyć uvx bez uprzedniej instalacji w ten sposób:

uvx micropython-wasm -c 'print("Hello world")'
# To see it run out of fuel:
uvx micropython-wasm -c 's = ""; while True: s += "longer"'
# Outputs: micropython-wasm: guest exited with code 1

Możesz także wypróbować to w agencie Datasette w następujący sposób:

uvx llm keys set openai
# Paste in an OpenAI key, then:
uvx --with datasette-agent \
  --with datasette-agent-micropython \
  --prerelease allow \
  datasette --internal internal.db \
    -s plugins.datasette-llm.default_model gpt-5.5 \
    --root -o

Następnie przejdź do http://127.0.0.1:8001/-/agent i uruchom monit:

show me some micropython

Zrzut ekranu przedstawiający interfejs aplikacji do czatu z ciemnoniebiesko-szarym odczytem nagłówka "dom" po lewej stronie i "źródło" z ikoną menu hamburgera po prawej stronie. Poniżej znajduje się wiersz nawigacyjny z "← Powrót" I "Pogawędzić" po lewej stronie i "EKSPORT" przycisk po prawej stronie. Pojawi się niebieski dymek z wiadomością dla użytkownika "pokaż mi jakiegoś mikropytona". Poniżej znajduje się zwinięta sekcja dotycząca myślenia "▸Myślenie: … aby wyraźnie pokazać wynik. Potem mogę zakończyć krótkim wyjaśnieniem!" następnie a "▶ Narzędzie: wykonaj_micropython" etykieta. Blok kodu następuje: "# Mały przykład MicroPythona: logika w stylu migania + Fibonacci" / "zdecydowanie fib(n):" / "    a, b = 0, 1" / "    na zewnątrz = ()" / "    dla _ w zakresie (n):" / "        out.append(a)" / "        a, b = b, a + b" / "    wróć" / 'drukuj("Witamy z MicroPythona!")

Czy powinieneś zaufać mojej piaskownicy z kodem wibracyjnym?

Po narzekaniu na niedojrzałe, luźno utrzymywane biblioteki piaskownicy, zakrawa na głęboką ironię losu, że teraz zbudowałem własne!

Celowo umieściłem na nim wersję alfa i nie jestem gotowy polecać jej nikomu, kto nie chce podjąć znaczącego ryzyka.

Poddałem go wystarczającej liczbie testów, więc mogę go używać samodzielnie. Wysłałem moją pierwszą wtyczkę, która z niej korzysta, datasette-agent-micropython. Zablokowałem także GPT-5.5 xhigh we wtyczce Datasette Agent i rzuciłem mu wyzwanie, aby wyrwał się z piaskownicy, ale jak dotąd nie udało się.

Mam nadzieję, że ta implementacja przekona niektóre firmy z profesjonalnymi zespołami ds. bezpieczeństwa i poważnymi problemami do zaangażowania się w używanie Pythona w WebAssembly jako podejścia typu sandbox i open source do własnych rozwiązań.



Source link

Postagens Similares

  • Overflow 播客,與 Shana Kad 合作 – 探索自我認同、治愈與轉變

    鼓勵與自己、心態和身份教練建立更健康、更牢固的關係 Shana Kad 呈現了氛圍友好的播客 溢出 – 一場親密而誘人的現代表演,致力於幫助您治愈過去的創傷,並在未來展現您最好的個性和身份。 Shana Kad 憑藉超過 16 年的思維和身份教練實踐經驗,推出了 溢出播客 在個人極度悲痛的時期。突然失去了妹妹,她對生活和自我的整個認知都發生了大膽的改變,她開始質疑一切。 這 溢出播客 最初成為一個反思和自我療癒的地方,總是受到誠實的思想和感情的驅動,在我們的主人和聽眾身上展現出真正的人性。隨著時間的推移,播客逐漸演變為更多關於生存和自我認同的力量的內容。這個概念轉向在意識之外創造一種生活,而不是簡單地從我們過去的老故事中創造一種生活。因此,每一集都邀請觀眾進行更深入的思考,感受勇敢的感覺,並開始按照他們真正認為的自己的方式生活。 最近,第二季迎來了鼓舞人心的一集 當你的成長開始與你的身份爭論時。 這次客戶分解會議非常有趣,由一位冷靜但也特別熱情的主持人主持,她清晰和理解的天賦與她的同情心和心靈相結合,呈現了一個或一系列無價且措辭優美的課程。 “所以,深吸一口氣,你並沒有落後,你只是進入了你自己的一個版本,你的身體已經學會了不去抓住它。但它會學會它。你教它越多,它就會學得越快。” 優美的措辭是其中的一個突出部分 溢出播客, 劇集像詩歌一樣傾瀉而出,只有莎娜·卡德 (Shana Kad) 的原始且明顯真實的表達風格。這些故事也始終保持焦點並與每個主題相關,因此我們到最後又回到了原點,並很快就了解了我們的內容 溢出 確實是。 現實主義和善良中令人耳目一新的另類, 溢出 不僅僅是一個自助播客,它是關於自我誠實和通過學習創造選擇的。良好的知識就是力量,這就是Shana Kad教練的核心價值。 劇集數 溢出 真實性和內心從來沒有變化,但基調會根據每個故事或片段而變化,事實上,夏娜自己對此的真實情感反應和表達也有所不同。例如,第 10 集感覺像是一種更加溫和和舒適的方式,因為莎娜自始至終都直接向聽眾講話,並採取了行動 兩者之間:為什麼你的突破感覺就像失去了自我意識。 這一集和其他大多數集一樣,強調了經驗、知識、理解和善良的完美平衡。 夏娜的研究和智慧在這個領域是首屈一指的,這意味著絕對沒有任何填充物——劇集是集中的、有目的的、有益的,而幸福的文學方面簡直就是錦上添花。 對於那些厭倦了過度思考或精疲力盡並在生活中造成情緒循環的有自我意識的人。了解你的思維到底是如何運作的,然後轉向創造平靜、清晰和方向。你可能雄心勃勃,但卻精疲力盡,因自我懷疑而陷入癱瘓——一個看似擁有一切的高成就者,但私下卻感到與世隔絕或陷入困境。 溢出 非常獨特,製作和呈現都很精美。莎娜每隔幾天就會推出新劇集,並且隨時可以聯繫。她的目標是做到足夠,並幫助盡可能多的人,讓他們的情緒和生活回到正軌,而不是花費數年時間在治療中發洩。 找到 溢出播客 在亞馬遜、蘋果、Spotify 上。在 LinkedIn 上關注 Shana Kad 或訪問她的網站。查看 Sttanstore 的新課程。…

  • 5 legalnych poświęceń po stronie telefonu dla kobiet, które dobrze płacą

    Jeśli jesteś kobietą w Stanach Zjednoczonych i chcesz zarobić dodatkowe pieniądze za pomocą samego telefonu, jesteś we właściwym miejscu. Zarabiam w Internecie od lat. I mogę Ci to powiedzieć – nie potrzebujesz dyplomu, laptopa ani ogromnej liczby obserwujących, aby zarobić na boku prawdziwą gotówkę. Wszystko czego potrzebujesz to telefon, trochę czasu i odpowiednie platformy. Oto…

  • Google खुदरा विक्रेताओं के लिए तीन-स्तरीय स्टोर विजेट प्रोग्राम का परिचय देता है

    Google अपने स्टोर विजेट प्रोग्राम का विस्तार तीन पात्रता-आधारित स्तरों में कर रहा है, जिसे आप रेटिंग, नीतियों और समीक्षाओं को प्रदर्शित करने के लिए अपनी साइट पर एम्बेड कर सकते हैं, जिससे ग्राहकों को सूचित निर्णय लेने में मदद मिल सकती है। Google घोषणा करता है: “जब दुकानदार ऑनलाइन होते हैं, तो यह जानना…

  • 亞歷克斯溫特斯 (Alex Winters) 推出大膽的新單曲“Break In”

    來自美國奧斯汀的德克薩斯州創作型歌手亞歷克斯溫特斯 (Alex Winters) 幾週前剛推出了一首大膽的新歌。 … 一首優美的、由吉他驅動的另類搖滾曲目,融合了微妙的鄉村風格和輕鬆的可及性。 這是一首乾淨的搖滾曲目,帶有突出的原聲吉他,尤其是在前奏部分。她的歌聲也是開場的關鍵元素,立刻吸引你。整首歌中有一些刺耳的吉他聲,包括滑動的吉他聲和滴答作響的低音線。隨著曲目的發展,更多鄉村色調的出現,有助於讓它變得栩栩如生。 它由 Animal Farm 的 Mat Leppanen 製作,將原始演示轉變成優美的力量,並帶有一些令人興奮的聲音動作,尤其是後三分之一。這是一首無害的另類搖滾曲目,可以吸引任何願意聆聽的人的注意。 Alex Winters 的這首新作品充滿了跨越多種風格的各種吉他聲音,很可能成為她迄今為止最偉大的曲目之一。 在 Spotify 上的 Indie Rock Forever 播放清單中找到更多類似的精彩音樂! Source link

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *