secure-eval-worker: اجرای کد ناشناس داخل Node
خلاصهٔ کاملتر
تو این پست از تیم Platformatic اومده که اجرای جاوااسکریپت در زمان اجرا داره روزبهروز عادیتر میشه: کدی که هوش مصنوعی تولید کرده، اتوماسیون کاربر، پلاگینها و بخشهای برنامهپذیر اپ. مشکل سر اختیاراته. eval() معمولی دقیقاً همون دسترسیهای میزبان رو داره، و حتی اگه کد رو ببری تو یه worker thread، باز هم به فایلسیستم، شبکه، متغیرهای محیطی و بقیهٔ امکانات Node دسترسی داره مگر اینکه خودت دونهدونه ببندیشون.
secure-eval-worker یه کتابخونهٔ تازهست که اسکریپت، ES module و ماژول محلی مورد اعتماد رو داخل workerهای Node اجرا میکنه، ولی فقط با همون دسترسیهایی که خودت انتخاب کردی. زیرساختش Permission Model خود Node (یعنی سیستم مجوز داخلی Node که جلوی دسترسی به فایل و شبکه رو میگیره)، قابلیتهای صریح میزبان و عمر محدود workerهاست. نویسندهها خودشون صاف میگن هدفشون ساختن یه sandbox بینقص نیست؛ هدف اینه که «حداقل دسترسی» بشه حالت پیشفرض.
اختیار از راه host function داده میشه، نه با دادن یه کلاینت عمومی دیتابیس یا شبکه. یعنی بهجای fetch(url) فقط records.find(id) رو در اختیار کد مهمون میذاری و پیادهسازی، اعتبارسنجی و مجوزش دست میزبان میمونه:
const result = await runUntrustedCode('return records.find(input.id)', {
input: { id: 'record-42' },
hostFunctions: {
records: { find: async id => database.records.find(id) }
}
})مهمترین قاعدهٔ امنیتیاش ترتیبه: قبل از اینکه کد مهمون اصلاً کامپایل یا import بشه، worker با Permission Model روشن ساخته میشه، بعد خود bootstrap با process.permission.drop('worker') اجازهٔ ساخت worker تودرتو رو هم ازش میگیره، parentPort بسته و پنهان میشه و راههای فرار شناختهشده (فایلسیستم، شبکه، loader hookها، addonهای نیتیو) غیرفعال میشن. تازه بعدش نوبت اجرای کد مهمونه.
ارتباط هم از یه MessageChannel خصوصی رد میشه که هر پیامش با HMAC (یه امضای کوتاه با کلید مشترک) مخصوص همون نشست و یه شمارندهٔ صعودی تأیید میشه، پس تکرار یه پیام قدیمی هیچ عملیات معتبری نمیسازه. سقفها از قبل مشخصه: ۴ worker همزمان، ۶۴ کیلوبایت حجم سورس، ۱ مگابایت ورودی، ۲۵۶ فراخوانی host function و ۳۰ ثانیه عمر برای workerهای ماندگار. فعلاً فقط روی Node.js نسخهٔ 26.3.0 تا 26.x کار میکنه و هنوز روی npm منتشر نشده.
نکات کلیدی:
- دسترسیها قبل از کامپایل و اجرای کد مهمون حذف میشن، نه بعدش
- اختیار فقط از راه host functionهای تعریفشدهٔ میزبان داده میشه، مثل records.find(id) بهجای fetch(url)
- هر فراخوانی یکباره یه worker تازه میسازه و pool نمیشه، چون ریست کامل محیط Node تضمینپذیر نیست
- سقف پیشفرض ۴ worker همزمانه و هر worker حدود ۱۲ تا ۲۰ مگابایت حافظه میگیره (Linux x86-64، Node 26)
- ایزولاسیون کامل نیست: workerها تو همون پروسهان، پس بار چندمستاجری رو تو پروسه یا کانتینر جدا اجرا کن




