آپدیت امنیتی اکتبر Node.js: ده آسیبپذیری روی نسخههای 22، 24 و 26
خلاصهٔ کاملتر
تیم Node.js نسخههای v22.23.4، v24.22.1 و v26.12.1 رو منتشر کرده که ده آسیبپذیری رو میبندن. کنارش وابستگیهایی مثل c-ares، OpenSSL، SQLite، Undici و لیست گواهیهای CA هم آپدیت شدن. گواهی میانی eMudhra لو رفته بود و از لیست حذف شده. شدیدترین مشکل تو هر سه خط انتشار HIGH هست و نسخههای End-of-Life هم طبق معمول آسیبپذیرن و آپدیتی نمیگیرن.
خطرناکترینش CVE-2026-111497 تو بازکننده Brotli داخل Node هست. یه بلاک نامعتبر بهجای خطای دائمی بهعنوان «ورودی بیشتر لازمه» گزارش میشد و decoder بایتها رو مدام به یه بافر داخلی هشتبایتی اضافه میکرد. یعنی اگه اپلیکیشنت داده Brotli از کاربر رو با node:zlib باز کنه، مهاجم میتونه حافظه پروسه رو خراب کنه و کار به کرش، لو رفتن حافظه یا اجرای کد از راه دور برسه.
یه باگ پرخطر دیگه CVE-2026-105482 هست. توابع dns.resolve*() و dns.reverse() اسم دامنهای که وسطش بایت NUL داره رو بیصدا کوتاه میکنن، چون اسم بهصورت رشته C به c-ares میرسه. یعنی اگه اول اسم رو با یه allowlist چک کنی و بعد resolve کنی، ممکنه رکوردهای یه دامنه دیگه دستت برسه. این در واقع اصلاح ناقص CVE-2026-48930 بود که فقط dns.lookup() رو پوشش داده بود.
دو تا مشکل پرخطر و یکی متوسط هم مربوط به tls.checkServerIdentity() هستن، یعنی تابعی که چک میکنه گواهی سرور واقعاً مال همون آدرسیه که بهش وصل شدی. اگه آدرس IPv4 با شکل غیرمعمول نوشته بشه، مثلاً با رقمهای تمامعرض یونیکد، با صفر اول، یا به شکل هگز و عدد یکتکه، Node اونو IP تشخیص نمیداد و با اسمهای DNS گواهی مقایسهش میکرد. تو حالت صفر اول هم Node اون عدد رو در مبنای هشت میخوند ولی resolver سیستمعامل (مثلاً تو macOS) در مبنای ده. نتیجهش اینه که یه گواهی میتونه برای IPای قبول بشه که براش صادر نشده.
بقیه موارد: CVE-2026-105481 تو HTTP Agent که روی سوکت keep-alive یه پاسخ رو که قبل از فرستادن درخواست رسیده بود قبول میکرد، مخصوصاً وقتی event loop با کار همزمان مشغول بود. CVE-2026-106074 باعث میشد cache تصادفی crypto.randomUUID() و randomInt() داخل startup snapshot یا SEA (یعنی اپلیکیشن تکفایلی) ذخیره بشه و هر پروسه تا 127 تا UUID و حدود 1000 مقدار randomInt() تکراری بده. سه تا باگ کمخطر هم تو zlib.ZipFile و Permission Model بود؛ مثلاً قانونهای wildcard تو --allow-fs-read گاهی مسیری بیشتر از اونی که اجازه داده بودی رو باز میکرد و fs.realpathSync() اصلاً چک مجوز خوندن نداشت.
نکات کلیدی:
- نسخههای اصلاحشده: v22.23.4، v24.22.1 و v26.12.1
- CVE-2026-111497 تو Brotli از طریق node:zlib میتونه به اجرای کد از راه دور برسه
- CVE-2026-105482: dns.resolve*() اسمهای دارای بایت NUL رو بیصدا کوتاه میکنه
- سه CVE تو tls.checkServerIdentity() اجازه میدادن گواهی با DNS SAN برای یه IP قبول بشه
- CVE-2026-106074: snapshot و SEA تا 127 UUID تکراری بین پروسهها تولید میکردن
- دو باگ کمخطر Permission Model: باگ wildcard فقط روی 26.x و باگ fs.realpathSync() روی هر سه خط




