اجرای امن کد پایتون توی سندباکس با MicroPython و WASM
خلاصهٔ کاملتر
نویسنده میگه پروژههای متنبازش مثل Datasette و LLM همه از سیستم پلاگین استفاده میکنن و عاشق این مدله، ولی یه مشکل بزرگ داره: کد پلاگین با دسترسی کامل داخل برنامه اجرا میشه، پس یه پلاگین باگدار یا مخرب میتونه همهچیز رو خراب کنه یا دادههای خصوصی رو لو بده. چیزی که میخواد یه محیطیه که کد توش نتونه فایل غیرمجاز بخونه، به شبکه وصل شه یا کار خطرناکی بکنه.
به گفتهٔ نویسنده، یه سندباکس خوب باید چند تا ویژگی داشته باشه: وابستگیهاش تمیز از PyPI نصب شن، کد اجراشده هم محدودیت حافظه و هم محدودیت CPU داشته باشه، دسترسی به فایل و شبکه کاملاً کنترلشده باشه، بشه توابع مشخصی از میزبان رو در اختیارش گذاشت، و مهمتر از همه پروژه پایدار و نگهداریشده باشه. میگه از بس کتابخونهٔ سندباکس نیمهکاره و رهاشده دیده، حساب از دستش در رفته.
نویسنده معتقده WebAssembly بهترین گزینه برای این کاره. استدلالش اینه که مرورگرها توی خصمانهترین محیط ممکن کار میکنن چون هر بار باید کد ناشناختهٔ وب رو دانلود و اجرا کنن، و WASM از اول برای همین جور ایزولهسازی طراحی شده و نزدیک یه دهه توی مرورگرها تست شده. کتابخونهٔ wasmtime هم WASM رو میاره توی پایتون و فعالانه نگهداری میشه.
برای اجرای پایتون به یه مفسر کامل نیاز هست که به WASM کامپایل شده باشه. نویسنده میگه Pyodide برای مرورگر عالیه ولی سمت سرور پشتیبانی نمیشه، برای همین سراغ MicroPython رفته — یه پیادهسازی سبک از پایتون ۳ که برای محیطهای محدود مثل میکروکنترلرها ساخته شده، و به قول خودش WASM هم دقیقاً یه محیط محدوده.
سختترین بخش، نگهداشتن وضعیت مفسر بین چند بار اجرا بود؛ چون بیلد WASM یه نقطهٔ ورود داره که مفسر رو روشن میکنه، کد رو اجرا میکنه و بعد میبنده. راهحل این شد که کد داخل MicroPython یه تابع میزبان صدا بزنه که تا رسیدن کد بعدی بلاک میشه، و اینجوری متغیرها و توابع توی حافظه باقی میمونن. این هم پشتیبانی از توابع میزبان با حدود ۷۸ خط C حل شد که توی یه فایل WASM حدود ۳۶۲ کیلوبایتی کامپایل میشه.
محدودیت حافظه رو مستقیم wasmtime پشتیبانی میکنه؛ محدودیت CPU سختتره و با مفهومی به اسم «سوخت» (fuel) کنترل میشه که تعداد عملیات مجاز رو محدود میکنه، هرچند نویسنده میگه واحدش گیجکنندهست و فعلاً داره مقدار پیشفرض ۲۰ میلیون رو امتحان میکنه.
نویسنده صادقانه میگه که این یه نسخهٔ آلفاست و خودش هم به طعنه اعتراف میکنه بعد از اینهمه گله از کتابخونههای نیمهکاره، حالا خودش یکی ساخته. فعلاً فقط برای خودش ازش استفاده میکنه و حتی یه مدل قوی رو به جون سندباکس انداخته تا ازش فرار کنه که تا الان موفق نشده. امیدش اینه که شرکتهایی با تیم امنیتی حرفهای این رویکرد رو جدی بگیرن و راهحل خودشون رو متنباز کنن.
نکات کلیدی:
- پکیج آلفای micropython-wasm کد پایتون رو توی سندباکس مبتنی بر WebAssembly اجرا میکنه
- مفسر سبک MicroPython به WASM کامپایل شده تا توی محیط محدود اجرا شه
- دسترسی به فایل و شبکه کنترلشدهست و فقط توابع میزبانِ منتخب در دسترسن
- محدودیت حافظه با wasmtime و محدودیت CPU با مفهوم «سوخت» اعمال میشه
- نگهداشتن وضعیت مفسر بین اجراها با یه ترفند صف و تابع میزبان حل شده




