Node2Shell به HTTP2Shell رسید: باگ بحرانی Brotli در Node.js و پایتون
آسیبپذیری CVE-2026-111497 در کتابخانه فشردهسازی Brotli با امتیاز ۹٫۲ فقط Node.js را درگیر نمیکند و بستههای پایتون و ابزارهای HTTP را هم تهدید میکند.
آسیبپذیری CVE-2026-111497 در رمزگشای Brotli، کتابخانهی فشردهسازی گوگل، ۲۱ اکتبر ۲۰۲۶ همراه با انتشار نسخههای اصلاحی Node.js اعلام شد. نام اولیهاش «Node2Shell» بود. طی دو روز مشخص شد بستههای پایتون و هر برنامهای که پاسخ یا بدنهی Brotli را باز میکند هم در معرض خطرند، و حالا نام «HTTP2Shell» برای آن رایج شده است. امتیاز آن در CVSS 4.0 برابر ۹٫۲ و در دستهی بحرانی است.
ماجرا چیست؟
طبق گزارشها، مشکل در تابع داخلی DecodeBlockTypeAndLength در رمزگشای C کتابخانهی Brotli است و نسخههای ۱٫۰٫۳ تا ۱٫۲٫۰ را شامل میشود. مهاجم میتواند جریانی بسازد که فقط یک نوع بلوک اعلام میکند و بعد سوئیچ بلوکی را میخواهد که ممکن نیست. رمزگشا این وضعیت غیرممکن را «نیاز به دادهی بیشتر» تلقی میکند و بایتهای مهاجم را در بافری هشتبایتی پشت سر هم مینویسد. در نتیجه حافظهی مجاور خراب میشود.
این نوشتن خارج از محدوده میتواند به کرش فرایند، نشت حافظه یا اجرای کد برسد. به گفتهی پروژهی Node.js، شدت آن بالاست و امتیاز ۹٫۲ هم همین را نشان میدهد. پژوهشگران یک اثبات مفهومی ارائه کردهاند که روی Node.js 24.22.0 با لینوکس arm64 به اجرای کد رسیده، اما پایداری آن روی معماریهای مختلف یکسان نبوده است.
نکات کلیدی
- شناسه: CVE-2026-111497؛ امتیاز CVSS 4.0: ۹٫۲
- کتابخانهی آسیبدیده: رمزگشای C در Brotli نسخههای ۱٫۰٫۳ تا ۱٫۲٫۰
- اثر احتمالی: کرش، نشت حافظه یا اجرای کد
چرا از Node2Shell به HTTP2Shell رسید؟
Node.js اول اصلاحیه را داد و به همین دلیل نام Node2Shell رایج شد. بعد از آن مشخص شد بستههای Brotli و brotlicffi در PyPI هم همان رمزگشا را دارند و نام «Python2Shell» هم به کار رفت. به گزارش شرکت امنیتی Aikido، حدود ۲۳ اکتبر روشن شد دامنهی اثر بسیار گستردهتر است. کتابخانههای HTTP و ابزارهایی مانند Bun، Envoy، Istio و curl در صورتی که از Brotli آسیبپذیر استفاده کنند در معرض خطرند.
مسیر حمله دو حالت اصلی دارد. در حالت اول برنامهی شما درخواستی به یک سرور نامطمئن میفرستد و آن سرور پاسخی با Content-Encoding: br برمیگرداند. در حالت دوم برنامه بدنهی فشردهی ورودی را باز میکند. در Node.js فراخوانیهای مستقیم zlib، تابع داخلی fetch() و Express 5 با body-parser 2.x میتوانند این مسیر را باز کنند. در پایتون، Brotli اغلب بهصورت وابستگی غیرمستقیم در urllib3، requests، httpx یا aiohttp نصب میشود، پس ممکن است ندانید در پروژهتان هست.
نسخههای اصلاحشده و راههای کاهش ریسک
نسخههای اصلاحشدهی Node.js شامل 22.23.4، 24.22.1 و 26.12.1 هستند. برای پایتون باید به Brotli نسخهی ۱٫۲٫۱ یا brotlicffi نسخهی ۱٫۲٫۱٫۰ به بعد ارتقا دهید. Bun از نسخهی 1.4.4 و کتابخانهی بومی Brotli در شاخههای 1.0.10، 1.1.1 و 1.2.1 اصلاح شده است. برای Envoy و Istio هم نسخههای وصلهشده منتشر شده است.
به گزارش HeroDevs، شاخههای پایانعمر Node.js، از ۲۵ تا ۱۲، همچنان بدون وصلهی رسمی ماندهاند. شرکتهای دیگر مثل HeroDevs نسخههای پشتیبانی تجاری عرضه میکنند.
اگر فوراً نمیتوانید ارتقا دهید، این کارها ریسک را کم میکند:
- بستههای Brotli را در محیطهای پایتونی که ضروری نیستند حذف کنید. کلاینتهای HTTP به gzip یا deflate برمیگردند. - در reverse proxy یا load balancer، درخواستهایی با Content-Encoding: br را پیش از رسیدن به برنامه رد کنید. - br را از هدر Accept-Encoding درخواستهای خروجی حذف کنید. - کانتینرها را بعد از ارتقا دوباره بسازید و فرایندها را ریاستارت کنید.
# بررسی وجود بستههای Brotli در محیط پایتون
pip list | grep -i brotli
# ارتقا
pip install --upgrade "Brotli>=1.2.1" "brotlicffi>=1.2.1.0"
# بررسی نسخهی Node.js
node --versionچرا برای برنامهنویسها مهم است؟
Brotli در بیشتر مرورگرها و سرورها برای فشردهسازی وب استفاده میشود و کمتر کسی آن را تهدید امنیتی میداند. در این باگ حتی برنامهای که هیچ سروری را در معرض اینترنت نگذاشته، اگر فقط به یک API بیرونی نامطمئن درخواست بزند، میتواند هدف باشد. بنابراین سرویسهای بکاند، رباتها، وبکراولرها و ابزارهای هوش مصنوعی که صفحهها را دریافت میکنند باید بررسی شوند.
یک نکتهی عملی دیگر هم هست. طبق گزارش Aikido، هنگام انتشار مطلب ابزارهایی مانند pip-audit، Dependabot و Safety هنوز این CVE را به بستههای PyPI نگاشت نکرده بودند. پس اسکن خودکار ممکن است هشدار ندهد و بررسی دستی نسخهها لازم است. برای تیمهایی که در ایران با میرورهای داخلی بستهها کار میکنند، باید مطمئن شوند میرور به نسخههای اصلاحشده رسیده باشد. همچنین ایمیجهای کانتینری قدیمی را باید دوباره ساخت.
جمعبندی
این ماجرا نشان میدهد یک باگ در کتابخانهای کوچک و عمیقاً وابسته میتواند چند اکوسیستم را همزمان درگیر کند. پیشنهاد عملی این است که نسخهی Node.js و بستههای Brotli را بررسی کنید، ارتقا بدهید و تا آن زمان در صورت امکان پذیرش br را در لبهی شبکه محدود کنید. گزارشهای منتشرشده هنوز در حال تکمیلاند و جزئیات بهرهبرداری ممکن است تغییر کند.
منابع
- Aikido: Node2Shell به HTTP2Shell تبدیل میشود (CVE-2026-111497)aikido.dev
- HeroDevs: CVE-2026-111497 (Node2Shell) و RCE در Brotli برای Node.jsherodevs.com
این خبر بر اساس منابع بالا به فارسی بازنویسی و خلاصه شده است؛ برای جزئیات کامل به منبع اصلی مراجعه کنید.