نود دو شل: جزئیات PoC و دامنهی ضعف Brotli در Node.js
حدود ۵ دقیقه مطالعه
نام Node2Shell برچسب رایج آسیبپذیری CVE-2026-111497 در Node.js است؛ همان نقص دیکودر Brotli که در انتشار امنیتی ۲۱ اکتبر ۲۰۲۶ (نسخههای 26.12.1، 24.22.1 و 22.23.4) رفع شد. این خبر تکمیلی است: بعد از انتشار، روز ۲۲ اکتبر کد اثبات مفهوم (PoC) عمومی آمد و مشخص شد این ضعف فقط مربوط به Node.js نیست، چون کتابخانههای دیگری هم از همان دیکودر استفاده میکنند.
ریشهی مشکل و راههای فعال شدن
طبق Aikido، این یک نوشتن خارج از محدوده (out-of-bounds write) در دیکودر Brotli است که با ورودی فشردهی خراب فعال میشود. سه مسیر اصلی ذکر شده است:
- درخواستهای ورودی: Express 5 و body-parser 2.x بدنهی درخواست با Content-Encoding برابر br را باز میکنند. یک سرور HTTP خام Node.js بهتنهایی بدنهی Brotli را دیکد نمیکند.
- پاسخهای خروجی: تابع fetch پاسخ Brotli را خودکار باز میکند، پس سرور مخرب یا هکشده میتواند از مسیر پاسخ به برنامه برسد. webhook ها و نشانیهایی که کاربر میدهد هدف معمولاند.
- استفادهی مستقیم: دادهٔ نامطمئن به توابع Brotli در ماژول zlib داده شود.
طبق Aikido و HeroDevs، رفع در سورس Brotli از فوریهی ۲۰۲۶ وجود داشت و Node.js آن را در انتشار ۲۱ اکتبر گرفت. HeroDevs مینویسد نتیجهی حمله از کرش (DoS) و خواندن بخشی از حافظه تا اجرای کد با دسترسی کاربر پردازهی Node.js متغیر است.
PoC و وضعیت بهرهبرداری
طبق HeroDevs و The Hacker News (به نقل از آنها)، اولین PoC عمومی روز ۲۲ اکتبر آمد و فقط روی یک build عمداً تضعیفشده به اجرای کد رسید؛ روی build معمولی نویسندهاش کرش و خواندن محدود حافظه گزارش کرد. همان روز تیم Imperva Red Team اجرای کد روی image رسمی و تغییرنکردهی Node.js 24.22.0 برای Linux arm64 را گزارش کرد، از طریق fetch و Express 5 همراه body-parser 2.x؛ ولی در هر تلاش جواب نداد. معماریهای دیگر و شاخههای 22.x و 26.x تست نشدهاند و نسخهی 24.22.1 همان ورودی را رد میکند. تا ۲۳ اکتبر هیچ استفادهی واقعی گزارش نشده و این CVE در فهرست KEV ی CISA نیست.
چه کار کنیم؟
نسخه را چک کنید و به نسخهی اصلاحشدهی شاخهی خود بروید:
node --version
Node.js 26.x → 26.12.1
Node.js 24.x → 24.22.1
Node.js 22.x → 22.23.4
Bun → 1.4.4 یا بالاتر
برای کانتینر:
docker run --rm IMAGE node --version
ایمیج را دوباره بسازید (build) و پردازهها را دوباره راهاندازی کنید. طبق Aikido، pin کردنی مثل node:22.23.3-alpine تا زمان build مجدد روی نسخهی اصلاحشده آسیبپذیر میماند. نسخههای Node.js که از Brotli ی سیستم استفاده میکنند، رفع را از بستهی brotli توزیع میگیرند. طبق اطلاعیهی رسمی، نسخههای End-of-Life همیشه در انتشارهای امنیتی آسیبپذیر فرض میشوند و رفع رسمی ندارند. طبق HeroDevs بازبینی کد نشان میدهد منطق آسیبپذیر در شاخههای قدیمی هم هست، ولی این نتیجهی بازبینی است و اجرای موفق حمله روی آنها گزارش نشده.
راههای کاهش خطر موقت که هیچکدام رفع کامل نیستند: رد کردن درخواستهایی که Content-Encoding آنها br دارد در reverse proxy یا middleware، که طبق Aikido فقط مسیر ورودی را میپوشاند، و برای مسیر خروجی برنامهای که پاسخها را مستقیم دیکد میکند باید همان رفع runtime را بگیرد. Vercel هم طبق Aikido روز ۲۱ اکتبر قانون firewall برای مسدود کردن حملهی ورودی اضافه کرد.
فراتر از Node.js
طبق Aikido، همان دیکودر آسیبپذیر در Brotli نسخههای 1.0.3 تا 1.2.0 هست و رفعش در نسخههای 1.0.10، 1.1.1 و 1.2.1 آمده. این صفحه ادعا میکند بستههای Brotli و brotlicffi در PyPI هم همان دیکودر را کامپایل میکنند و کلاینتهای HTTP پایتونی مثل urllib3، httpx (با extra مربوط) و aiohttp در صورت نصب بودن آنها خودکار از آن استفاده میکنند. Aikido از Bun، Envoy، Istio و curl هم نام میبرد. دو نکتهی احتیاط: این صفحه خودش میگوید برای پایتون اجرای کد نشان داده نشده و آسیبپذیری از مشترک بودن کد دیکودر استنباط شده؛ و میگوید تا ۲۳ اکتبر ابزارهایی مثل pip-audit و Dependabot چون advisory به بستههای PyPI نگاشت نشده بود، این مورد را نشان نمیدادند. نام «HTTP2Shell» هم فقط در عنوان همان صفحه آمده و رسمی نیست.
اختلافها بین منابع
امتیاز CVSS فرق میکند: Aikido و HeroDevs نمرهی 9.2 (CVSS 4.0، از Google بهعنوان CNA) را مینویسند و Node.js اثر آن را High میداند، ولی Indusface مینویسد هنوز امتیازی ندارد. مبدأ نام هم روشن نیست: HeroDevs میگوید Imperva Red Team نام Node2Shell را گذاشت و هیچ منبعی کاشف اصلی CVE را نمیگوید. ادعای Aikido دربارهی گزارش شدن باگ توسط OpenAI در فوریه را نتوانستم از منبع دیگری تأیید کنم و در خبر نیاوردم.
منابع:
- Node.js Security Releases: October 21, 2026
- Node2Shell: Node.js Brotli vulnerability (Aikido)
- Node2Shell Brotli vuln evolves to HTTP2Shell (Aikido)
- CVE-2026-111497 (Node2Shell): Node.js Brotli RCE Fix (HeroDevs)
- Node2Shell (CVE-2026-111497): Node.js Brotli RCE (Indusface)
