یه calloc چکنشده sandbox امن wasm2c رو میشکنه
خلاصهٔ کاملتر
به گزارش پژوهشگرهای امنیتی TrustSig، ابزار wasm2c که کد WebAssembly رو به C تبدیل میکنه و تو پروژههایی مثل Firefox استفاده میشه، یه باگ جدی داره. ایدهٔ wasm2c اینه که یه فایل wasm که بهش اعتماد نداری رو تبدیل به سورس کنی و با چکهای محدودهٔ خودکارش، مهمون رو داخل حافظهٔ خودش نگه داری، بدون نیاز به JIT.
طبق این گزارش، ریشهٔ مشکل تو تابع تخصیص جدولهاست، جایی که نتیجهٔ calloc هیچوقت چک نمیشه:
void WASM_RT_TABLE_APINAME(wasm_rt_allocate)(WASM_RT_TABLE_TYPE* table,
uint32_t elements) {
table->size = elements;
table->data = calloc(table->size,
sizeof(WASM_RT_TABLE_ELEMENT_TYPE));
}اگه این calloc (که ممکنه چندین گیگابایت درخواست بده) شکست بخوره، مثلاً وقتی رو هاست محدودیت حافظه گذاشته باشی، table->data خالی (NULL) میمونه ولی table->size هنوز همون عدد بزرگیه که مهمون اعلام کرده. از اونجا به بعد چک محدودهٔ جدول هنوز داره کار میکنه، ولی داره یه فنس رو چک میکنه که اصلاً ساخته نشده؛ یعنی هر ایندکس جدول در واقع به یه آدرس واقعی از حافظهٔ هاست اشاره میکنه.
نویسندههای گزارش نشون دادن که با همین یه باگ میشه حافظهٔ هاست رو خوند، نوشت، آدرس یه تابع از کتابخونهٔ libc رو لو داد و درنهایت یه فراخوانی تابع جعلی ساخت که دستور دلخواه رو روی سیستم اجرا میکنه؛ همهش فقط از دل یه instantiate و صدا زدن تابع، بدون نیاز به هیچ باگ دیگهای. این مسیر مخصوص لینوکسه؛ رو مک، چون محدودیت حافظه به همین شکل اعمال نمیشه، calloc معمولاً موفق میشه و این مسیر خاص کار نمیکنه، هرچند خود باگ همچنان هست.
راهحل سادهست: دقیقاً همون کاری که برای تخصیص حافظهٔ خطی (linear memory) تو ژوئیهٔ ۲۰۲۶ انجام شده، یعنی چک کردن نتیجهٔ calloc و متوقف کردن اجرا اگه NULL برگشت. طبق این گزارش این باگ از سال ۲۰۱۸ تو کد بوده و این مورد به تیم wabt گزارش شده ولی تا زمان انتشار مقاله هنوز رفع نشده.
نکات کلیدی:
- علت اصلی باگ: عدم چک نتیجهٔ calloc تو تخصیص جدول wasm2c، از سال ۲۰۱۸ بدون تغییر.
- تخصیص حافظهٔ خطی (memory) از ژوئیهٔ ۲۰۲۶ این چک رو داره؛ فقط تخصیص جدول (table) جا مونده بود.
- این مسیر خاص فقط رو لینوکس و باینریهای non-PIE جواب میده؛ مکاواس درگیر این مسیر نیست.
- گزارش به تیم wabt داده شده ولی تا زمان انتشار مقاله رفع نشده.




