بلاگ/آسیب‌پذیری بحرانی اجرای کد از راه دور در Brotli (CVE-2026-111497)؛ کدام نسخه‌های Node.js و Python آسیب‌پذیرند و چطور وصله کنیم
به‌روز شده

آسیب‌پذیری بحرانی اجرای کد از راه دور در Brotli (CVE-2026-111497)؛ کدام نسخه‌های Node.js و Python آسیب‌پذیرند و چطور وصله کنیم

1405/08/110 بازدید
آسیب‌پذیری بحرانی اجرای کد از راه دور در Brotli (CVE-2026-111497)؛ کدام نسخه‌های Node.js و Python آسیب‌پذیرند و چطور وصله کنیم

آسیب‌پذیری بحرانی اجرای کد از راه دور در Brotli (CVE-2026-111497)؛ کدام نسخه‌های Node.js و Python آسیب‌پذیرند و چطور وصله کنیم

یک آسیب‌پذیری بحرانی با شناسه CVE-2026-111497 در دیکودر Brotli پیدا شده که روی Node.js و پکیج‌های پایتون brotli و brotlicffi اثر می‌گذارد. وصله‌های رسمی از 21 اکتبر 2026 (29 مهر 1405) منتشر شده‌اند و CISA از 27 اکتبر 2026 این مورد را در فهرست آسیب‌پذیری‌های مورد سوءاستفادهٔ فعال (KEV) قرار داده؛ یعنی مهلتی تا 10 نوامبر برای رفع آن تعیین کرده. اگر روی سرورتان Node.js یا یک سرویس پایتون اجرا می‌شود، در ادامه می‌گوییم چطور وضعیت خودتان را چک کنید و چه کاری باید انجام دهید.

چه اتفاقی افتاده

Brotli یک الگوریتم فشرده‌سازی است که گوگل ساخته و خیلی از زیرساخت‌های وب از آن برای فشرده کردن پاسخ‌های HTTP استفاده می‌کنند (همان هدر Content-Encoding: br). کد دیکودر آن (فایل c/dec/decode.c) به‌جای این‌که در یک کتابخانهٔ مشترک بماند، داخل خود Node.js، پکیج‌های پایتون brotli و brotlicffi، و چند نرم‌افزار دیگر کپی شده است.

این آسیب‌پذیری یک نوشتن خارج از محدوده (buffer overflow) در همان کد دیکودر است. وقتی یک جریان داده Brotli ساخته‌شده و دستکاری‌شده به دیکودر داده شود، می‌تواند حافظهٔ کناری را خراب کند. یک مهاجم بدون نیاز به احراز هویت، با فرستادن چنین داده‌ای (مثلا در بدنهٔ یک درخواست یا پاسخ HTTP، از طریق یک پراکسی، یا یک فایل آپلودی) می‌تواند برنامه را کرش کند، داده‌های حساس را بیرون بکشد یا در بدترین حالت کد دلخواه اجرا کند.

مسیر سوءاستفاده از آسیب‌پذیری CVE-2026-111497 در دیکودر Brotli تا Node.js و پایتون

چون کد دیکودر در هر زبان و پروژه جدا کپی شده، هر کدام باید جدا وصله می‌شد؛ به همین دلیل هم Node.js هم پایتون جدا از هم بسته‌های تازه منتشر کردند.

کدام نسخه‌ها آسیب‌پذیرند

اگر یکی از این نرم‌افزارها را اجرا می‌کنید و نسخه‌تان از ستون وسط جدول زیر است، آسیب‌پذیر هستید:

نرم‌افزارنسخه‌های آسیب‌پذیرنسخهٔ وصله‌شده
Brotli (نسخهٔ اصلی گوگل)1.0.3 تا 1.2.01.0.10 (شاخهٔ 1.0.x) / 1.1.1 (شاخهٔ 1.1.x) / 1.2.1 (شاخهٔ 1.2.x)
Node.js 22.xپیش از 22.23.422.23.4
Node.js 24.xپیش از 24.22.124.22.1
Node.js 26.xپیش از 26.12.126.12.1
پکیج brotli در PyPI1.0.3 تا کمتر از 1.2.11.2.1
پکیج brotlicffi در PyPI1.0.3 تا کمتر از 1.2.1.01.2.1.0

نسخه‌های Node.js 20، 23، 25 و قدیمی‌تر از این‌ها به پایان عمر رسیده‌اند (EOL) و وصلهٔ رسمی نمی‌گیرند. اگر هنوز روی یکی از این خطوط هستید، تنها راه درست مهاجرت به یک نسخهٔ فعال (22، 24 یا 26) است، نه منتظر ماندن برای وصله.

این آسیب‌پذیری چقدر خطرناک است

امتیاز CVSS آن 9.2 از 10 است (CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N) که یعنی از راه دور، بدون نیاز به دسترسی قبلی و بدون دخالت کاربر قابل سوءاستفاده است. امتیاز EPSS آن هم در صدک حدود 82.6 قرار دارد، یعنی احتمال سوءاستفادهٔ عملی از آن در مقایسه با بقیهٔ آسیب‌پذیری‌های ثبت‌شده بالاست.

نکتهٔ مهم‌تر این است که CISA این مورد را از 27 اکتبر 2026 به فهرست KEV (آسیب‌پذیری‌های مورد سوءاستفادهٔ فعال) اضافه کرده، یعنی سوءاستفاده از آن در دنیای واقعی دیده شده، نه فقط یک ریسک تئوری. اگر سروری در معرض اینترنت دارید که درخواست یا پاسخ Brotli را از منبع نامعتبر decompress می‌کند — مثل یک اپ Express/Koa/Fastify، یک پراکسی یا یک CDN — در دستهٔ هدف‌های اول قرار می‌گیرید. این دقیقا همان جایی است که افزایش امنیت سرور لینوکس به‌عنوان یک قدم جداگانه، در کنار وصله کردن خود Brotli، اهمیت پیدا می‌کند.

چطور بررسی کنید سرور یا اپ شما آسیب‌پذیر است

برای Node.js، نسخهٔ در حال اجرا را چک کنید:

node -v

اگر عددی کمتر از 22.23.4، 24.22.1 یا 26.12.1 دیدید (یا یک نسخهٔ 20/23/25)، باید ارتقا بدهید. توجه کنید که این وصله داخل خود runtime کامپایل شده، نه یک پکیج npm جدا؛ پس بررسی کردن package.json یا node_modules کافی نیست. اگر اپ Node.js خودتان را روی یک VPS با PM2 و Nginx مدیریت می‌کنید، دیپلوی اپلیکیشن Node.js روی سرور اختصاصی و VPS با PM2 و Nginx نشان می‌دهد چطور بدون قطعی سرویس، نسخهٔ runtime را عوض کنید.

برای پایتون، نسخهٔ پکیج‌ها را ببینید (اگر هنوز محیط پایتون را روی سرور راه‌اندازی نکرده‌اید، نصب پایتون و تنظیم محیط برنامه‌نویسی در سرور اوبونتو نقطهٔ شروع خوبی است):

pip show brotli
pip show brotlicffi

اگر پروژه‌تان را در Docker اجرا می‌کنید، باید ایمیج‌ها را هم چک کنید، نه فقط سرور خودتان:

docker run --rm <image> node -v
docker run --rm <image> pip show brotli

اگر یک ایمیج قدیمی روی Node 22.20 یا مثلا یک tag ثابت‌شده مثل node:22 با دیت قدیمی pin شده، همان ایمیج هم باید rebuild شود. برای جزئیات بیشتر دربارهٔ اجرای Node.js داخل کانتینر، اجرای اپلیکیشن Node.js در داکر ایمیج را هم ببینید.

چطور وصله کنیم

برای Node.js روی سرور، به نسخهٔ وصله‌شده همان خط اصلی ارتقا بدهید (نه لزوما به جدیدترین major):

# با nvm
nvm install 22.23.4
nvm install 24.22.1
nvm install 26.12.1

# یا از مخزن رسمی NodeSource در اوبونتو/دبیان
sudo apt update && sudo apt install nodejs

برای پکیج‌های پایتون:

pip install --upgrade "brotli>=1.2.1" "brotlicffi>=1.2.1.0"

اگر یک کتابخانهٔ دیگر Brotli گوگل را مستقیم کنار خودش کپی کرده (برخی کتابخانه‌های native همین کار را می‌کنند)، باید همان کتابخانه را هم به نسخهٔ 1.0.10، 1.1.1 یا 1.2.1 (بسته به شاخه‌اش) ارتقا دهید.

بعد از آپدیت، ایمیج‌های Docker را rebuild و redeploy کنید؛ صرفا آپدیت کردن میزبان کافی نیست اگر اپ شما داخل یک ایمیج قدیمی پک شده است. فروشنده‌ها راهکار جایگزینی غیر از ارتقا پیشنهاد نکرده‌اند؛ در عمل هم غیرفعال کردن decompress کردن Brotli در بیشتر stackها عملی نیست، پس وصله کردن تنها راه است.

سؤالات متداول

آیا همین الان کسی از این آسیب‌پذیری سوءاستفاده می‌کند؟ بله. CISA از 27 اکتبر 2026 این مورد را در فهرست KEV قرار داده که فقط برای آسیب‌پذیری‌هایی است که سوءاستفادهٔ واقعی از آن‌ها دیده شده، نه هر آسیب‌پذیری بحرانی.

فقط Node.js درگیر است یا پایتون هم همین‌طور؟ هر دو. چون کد دیکودر Brotli در هر پروژه جدا کپی شده، Node.js (نسخه‌های 22، 24، 26) و پکیج‌های پایتون brotli و brotlicffi هر کدام باید جدا وصله می‌شدند و هر کدام نسخهٔ وصله‌شدهٔ خودشان را دارند.

اگر روی Node.js 20 یا 23 هستم چه کار کنم؟ این خطوط به پایان عمر رسیده‌اند و وصلهٔ رسمی نمی‌گیرند. تنها راه، مهاجرت به یک نسخهٔ فعال (22.23.4 یا بالاتر، 24.22.1 یا بالاتر، یا 26.12.1) است.

بعد از ارتقا، باید کار دیگری هم انجام بدهم؟ بعد از آپدیت runtime یا پکیج، ایمیج‌های Docker را rebuild و redeploy کنید و مطمئن شوید هیچ tag قدیمی pin‌شده باقی نمانده. وصلهٔ جانبی یا تنظیم دیگری لازم نیست.

جمع‌بندی

CVE-2026-111497 یک یادآوری خوب است که روی سرور شخصی خودتان، کنترل ارتقا دست خودتان است؛ می‌توانید قبل از آپدیت یک snapshot بگیرید، فایروال را تنظیم کنید و بعد با خاطر جمع نسخهٔ Node.js یا پایتون را بالا بیاورید. اگر هنوز روی یک سرور مجازی هستید که این کارها را دستی و آزاد انجام می‌دهید، صفحهٔ سرور مجازی آریانت را ببینید.

منابع