اگر در اپلیکیشنهای پایتونی خود از پلاگینهای شخص ثالث استفاده میکنید، احتمالاً تمام دسترسیهای سیستم خود را در اختیار آنها قرار دادهاید. در ۶ ژوئن ۲۰۲۶، توسعهدهنده سایمون ویلیسون (Simon Willison) بسته micropython-wasm را منتشر کرد. این یک بسته در مرحله آلفا است که طراحی شده تا با حبس کردن کدهای غیرقابلاعتماد در یک سندباکس (Sandbox) — شبیه به یک اتاق امن و عایقبندی شده که هیچ ارتباطی با فضای بیرون ندارد — این ریسک امنیتی را به پایان برساند. او در حال حاضر از این فناوری در یک پلاگین اجرای کد برای Datasette Agent به نام datasette-agent-micropython استفاده میکند.
طبق اعلام ویلیسون، اکثر سیستمهای پلاگین پایتون، از جمله ابزارهایی مثل Datasette، LLM و sqlite-utils، بر پایه Pluggy هستند. این ساختار اجازه میدهد نرمافزارها به سرعت گسترش یابند و یکشبه قابلیتهای جدید بگیرند، بدون اینکه نویسنده اصلی حتی نیاز به بررسی یک Pull Request داشته باشد. اما این سرعت یک نقطه ضعف مرگبار دارد: کدهای پلاگین با دسترسی کامل (Full Privileges) اجرا میشوند. به همین دلیل، تنها یک پلاگین معیوب یا مخرب میتواند دادههای خصوصی را لو دهد، اپلیکیشن را خراب کند یا باعث کرش کردن کامل ماشین میزبان شود.
همانطور که در تحلیلهای پیشین ما دربارهی امنیت مدلهای بازمتن اشاره کردیم، جداسازی لایهی اجرا از لایهی دسترسی، تنها راه مقابله با کدهای ناشناخته است. هدف ویلیسون ایجاد محیطی بود که کد نتواند بدون اجازه صریح به فایلهای تایید نشده دسترسی داشته باشد یا به شبکه وصل شود. او فراتر از پلاگینها، کاربردهای دیگری برای اجرای کدهای دلخواه میبیند؛ مثلاً در قابلیت Datasette Enrichments که در آن کدها مقادیر یک جدول را تغییر میدهند. او همچنین مکانیزمی را تصور میکند که کدهای زمانبندی شده را اجرا کند تا دادههای JSON را از یک مکان تایید شده دریافت کرده، آنها را به لیستی از دیکشنریها تبدیل کند و سپس به عنوان ردیفهایی در یک جدول پایگاه داده SQLite درج نماید.
الزامات یک سندباکس کاربردی
به نقل از مستندات این پروژه، برای اینکه یک سندباکس برای توسعهدهندگان در مقیاس تولید (Production) قابل استفاده باشد، باید ۵ شرط سختگیرانه را برآورده کند:
- نصب پاکیزه (Clean Installation): وابستگیها باید به راحتی از PyPI نصب شوند. این شامل ارائه Binary Wheels برای پلتفرمهای مختلف است تا کاربران هیچ گام اضافهای فراتر از نصب بسته پایتونی برندارند.
- محدودیت منابع (Resource Limits): کد اجرا شده باید هم در حافظه (Memory) و هم در CPU محدود باشد. این کار مانع از آن میشود که یک حلقه مانند
while True: s += "longer string"باعث کرش کردن اپلیکیشن یا کامپیوتر کاربر شود. - کنترل سیستم فایل (Filesystem Control): دسترسی به فایلها باید به شدت کنترل شود. سیستم باید یا دسترسی به فایلها را کاملاً مسدود کند، یا به میزبان اجازه دهد دقیقاً تعریف کند کدام فایلها قابل خواندن یا نوشتن هستند.
- کنترل شبکه (Network Control): کدهای داخل سندباکس نباید بتوانند بدون عبور از لایهای که کاملاً توسط میزبان کنترل میشود، با هیچ موجودیت خارجی ارتباط برقرار کنند.
- تعامل با میزبان (Host Interaction): سندباکس باید از تعامل با توابع میزبان پشتیبانی کند تا ویژگیهای منتخب پلتفرم را به صورت محتاطانه در اختیار کد در حال اجرا قرار دهد.
علاوه بر این، راهکار باید مستحکم، دارای پشتیبانی و مستندات شفاف باشد. ویلیسون اشاره کرد که بسیاری از پروژههای سندباکس موجود در مخازن گیتهاب رها شدهاند و هشدارهایی دارند مبنی بر اینکه دیگر به طور فعال نگهداری نمیشوند.
چرا WebAssembly؟
او ابتدا موتورهای جاوااسکریپت مثل V8 را بررسی کرد و اشاره کرد که مرورگرها در خصمانهترین محیط قابل تصور عمل میکنند، زیرا با هر بار لود صفحه، کدهای غیرقابلاعتماد را دانلود و اجرا میکنند. با این حال، او دریافت که این موتورها برای جاسازی (Embed) بیش از حد پیچیده هستند. اکثر پروژههای V8-in-Python به ندرت بهروزرسانی میشوند و در مورد استفاده از آنها برای کدهای کاملاً غیرقابلاعتماد هشدار میدهند.
در مقابل، وباسمبلی (WebAssembly یا WASM) گزینهای برتر بود چون از ابتدا برای پشتیبانی از ویژگیهایی که ویلیسون به دنبالشان بود طراحی شده و نزدیک به یک دهه در مرورگرها تست شده است. برای پیادهسازی این ایده در پایتون، پروژه از کتابخانه wasmtime استفاده میکند که Binary Wheels فعال و بهروزی را ارائه میدهد.
از آنجا که پایتون یک زبان پویا (Dynamic) است، نمیتوان آن را مستقیماً مانند زبان Rust به WASM کامپایل کرد؛ بلکه به یک مفسر کامل نیاز دارد که در زمان اجرا در دسترس باشد تا دستوراتی مثل eval() را پشتیبانی کند. اگرچه Pyodide بستهای فوقالعاده برای اجرای پایتون در مرورگر است، اما برای پایتون در سمت سرور پشتیبانی نمیشود. تا اکتبر ۲۰۲۴، توصیه این بود که Pyodide (که با ابزار Emscripten ساخته شده) فقط در مرورگر یا Node.js قابل اجرا است.
به همین دلیل ویلیسون به سراغ MicroPython رفت؛ نسخهای بسیار سبک و بهینه از پایتون ۳. این نسخه شامل زیرمجموعه کوچکی از کتابخانه استاندارد پایتون است و برای میکروکنترلرها و محیطهای محدود بهینه شده است. او میگوید: «وباسمبلی برای من دقیقاً شبیه به یک محیط محدود و کممنبع است!»
ساخت نمونه اولیه و غلبه بر چالشها
ویلیسون با کمک GPT-5.5 Pro برای تحقیق و Codex Desktop برای پیادهسازی، از یک درخواست تغییر (PR) آزمایشی برای پشتیبانی از WASI در MicroPython با عنوان "Experimental WASI support for ports/unix" اثر یاماموتو تاکاهاشی استفاده کرد. او از هوش مصنوعی خواست تا یک سند research.md را بخواند و سیستم را بسازد، از جمله اسکریپتی برای دریافت کدهای MicroPython در پوشه /tmp و کامپایل یک نسخه سفارشی WASM.
یک چالش بزرگ، حفظ وضعیت مفسر (Persistent Interpreter State) بود. در ساختارهای استاندارد WASM، تنها یک نقطه ورود (Entry Point) وجود دارد که مفسر را شروع میکند، کد را اجرا میکند و بلافاصله متوقف میشود. این برای اسکریپتهای یکباره مناسب است، اما برای Datasette Agent، متغیرها و توابع باید در حافظه باقی بمانند تا در فراخوانیهای متعدد مجدداً استفاده شوند.
برای حل این مشکل، ویلیسون یک سیستم صف درخواست (Request Queue) با استفاده از یک Thread طراحی کرد. جریان کاری به این صورت است:
۱. در پایتون، یک MicroPythonSession باز میشود.
۲. دستور session.run() پیامی به صف درخواست میفرستد و منتظر پاسخ در صف پاسخ میماند.
۳. در داخل WASM، مفسر MicroPython متوقف شده و منتظر تابع میزبان __session_next__() میماند تا خط بعدی کد را بازگرداند.
۴. مفسر آن کد را از طریق eval() اجرا میکند.
۵. در صورت اجرای موفق، نتیجه از طریق __session_result__({"id": request_id, "ok": True}) بازگردانده میشود.
این سازوکار اجازه میدهد کاربر ابتدا دستور x = 10 را اجرا کند، سپس x += 5 و در نهایت print(x * 2) را ببیند، در حالی که مقدار x در طول این سه فراخوانی مجزا حفظ شده است.
محدودیتهای فنی و امنیت
برای ایجاد تعامل بین میزبان و سندباکس، ویلیسون از Codex برای نوشتن ۷۸ خط کد C استفاده کرد. این کدها به یک فایل باینری ۳۶۲ کیلوبایتی WebAssembly تبدیل شدند که همراه با بسته توزیع میشود. اگرچه او برنامهنویس C نیست، اما از Claude خواست تا کدها را برایش توضیح دهد و آنها را تحت فشار تستهای متعددی قرار داد. او اشاره کرد که مزیت اصلی امنیتی WASM این است که اگر کد C دارای نقص 치명ي (Fatal) باشد، بدترین نتیجه معمولاً این است که اجرای WASM با یک Exception شکست میخورد، نه اینکه کل سیستم به خطر بیفتد.
مدیریت منابع از طریق مکانیزمهای زیر انجام میشود:
- حافظه: محدودیتها مستقیماً توسط موتور wasmtime پشتیبانی و تحمیل میشوند.
- CPU: از طریق مفهوم «سوخت» (Fuel) در wasmtime مدیریت میشود که تعداد عملیاتی را که یک فراخوانی WASM میتواند اجرا کند، محدود میکند. ویلیسون در حال حاضر در حال آزمایش مقدار پیشفرض ۲۰ میلیون واحد سوخت است، هرچند اشاره میکند که استدلال درباره این واحدها دشوار است.
تست در دنیای واقعی و استقرار
ویلیسون این سیستم را در datasette-agent-micropython ادغام کرده است. برای تست امنیت، او مدل GPT-5.5 xhigh را درون این پلاگین حبس کرد و از مدل خواست تا راهی برای فرار از سندباکس پیدا کند؛ اما مدل تاکنون موفق به فرار نشده است.
کاربران میتوانند نسخه آلفا را از طریق PyPI تست کنند یا از حالت CLI که در نسخه 0.1a2 از طریق uvx معرفی شده است استفاده کنند:
- تست پایه:
uvx micropython-wasm -c 'print("Hello world")' - تست محدودیت سوخت:
uvx micropython-wasm -c 's = ""; while True: s += "longer"'(که منجر به خروجیmicropython-wasm: guest exited with code 1میشود).
برای تست کامل ادغام در Datasette Agent، کاربران میتوانند یک کلید OpenAI را از طریق uvx llm keys set openai تنظیم کنند و سپس Datasette را با فلگهای --with datasette-agent-micropython و --prerelease allow اجرا نمایند و با رفتن به نقطه اتصال /-/agent دستور "show me some micropython" را اجرا کنند.
این رویکرد، بار امنیتی را از دوش زمان اجرای پایتون برداشته و به موتور WASM میسپارد. استفاده از یک مفسر مینیمال مثل MicroPython، سطح حمله (Attack Surface) را در مقایسه با یک نصب کامل CPython به شدت کاهش میدهد.
برای جامعه گستردهتر، این پروژه به عنوان یک اثبات مفهوم (PoC) عمل میکند. ویلیسون به تناقض ساخت یک سندباکس با روش «Vibe-coding» (برنامهنویسی بر اساس حس و شهود با AI) پس از شکایت از کتابخانههای ناپخته اعتراف میکند و هنوز آن را به کسانی که نمیخواهند ریسکهای بزرگ بپذیرند توصیه نمیکند. با این حال، او امیدوار است این پیادهسازی، تیمهای امنیتی حرفهای در شرکتهایی با مسائل حساس را ترغیب کند تا روی Python-in-WASM سرمایهگذاری کرده و راهکارهای مستحکم خود را به صورت متنباز منتشر کنند.
گام بعدی شما
- اگر توسعهدهنده پلاگین هستید، بسته
micropython-wasmرا در محیط تست نصب کنید تا محدودیتهای «سوخت» CPU را بسنجید. - برای اجرای سریع، از دستور
uvx micropython-wasm -c 'print("Hello")'استفاده کنید. - بررسی کنید آیا بخشهایی از کد شما را میتوان به MicroPython منتقل کرد تا ریسک اجرای کدهای Third-party کاهش یابد.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو