Node.js: критична уязвимост в Brotli (CVE-2026-111497) и още 9 поправки от 21 октомври

Уязвимост в декомпресирането на Brotli позволява изпълнение на код в Node.js приложения, които обработват данни от външни източници. Засегнати версии, кои приложения са изложени, как да обновите и какво още поправя изданието от 21 октомври 2026 г.

OfSec 7 мин. четене

На 21 октомври 2026 г. екипът на Node.js публикува поправки за 10 уязвимости във всички поддържани версии. Най-сериозната, CVE-2026-111497, е в декомпресирането на данни във формат Brotli и може да позволи изпълнение на код на сървъра. Засегнати са приложения на Node.js, които разархивират Brotli данни от външен източник: отговори от чужди сървъри или компресирани заявки от посетители. Някои публикации наричат уязвимостта Node2Shell.

Накратко

  • CVE-2026-111497: запис извън границите на буфера (out-of-bounds write) в декодера на Brotli.
  • Node.js я оценява като висока; Google, които поддържат библиотеката Brotli, ѝ дават 9,2 от 10 по CVSS 4.0.
  • Поправени версии: 26.12.1, 24.22.1 и 22.23.4.
  • Node.js 20, 23 и 25 не се поддържат и не получават поправка.
  • Към 23 октомври няма потвърдени атаки в интернет, но изследователи вече са демонстрирали изпълнение на код в тестова среда.

Кои приложения са засегнати

Уязвимостта е в библиотеката Brotli на Google, която Node.js съдържа и използва в модула zlib. Опасна е, когато приложението декомпресира Brotli данни, които нападателят може да контролира. Това става по два начина.

Отговори от чужди сървъри

Вграденият fetch() декомпресира автоматично отговорите с Content-Encoding: br. Същото правят по подразбиране и библиотеките axios, got и node-fetch. Изложени са приложенията, които зареждат адреси, подадени от потребители или от трети страни:

  • прегледи на връзки (link preview) в чатове, CRM и системи за поддръжка;
  • автоматизации и интеграции, които извикват външни API и уебхукове;
  • оптимизация на изображения от чужди адреси, например в Next.js;
  • инструменти за събиране на данни от сайтове.

Защитна стена пред приложението не вижда тези отговори, защото връзката се отваря от самото приложение навън.

Компресирани заявки от посетители

Express 5 използва body-parser 2.x, който по подразбиране декомпресира телата на заявките, включително Brotli. Така всяка заявка с Content-Encoding: br към API на Express 5 стига до уязвимия код. Express 4 (body-parser 1.x) не поддържа Brotli и не е изложен по този път. Сървър, написан само с модула http на Node.js, не декомпресира заявките сам.

Друг софтуер

Уязвимостта засяга и всеки друг софтуер, който използва Brotli от версия 1.0.3 до 1.2.0. Google публикува поправени версии 1.0.10, 1.1.1 и 1.2.1. В някои дистрибуции, например Debian, Node.js използва системната библиотека libbrotli вместо вградената. Там поправката идва с обновяването на системния пакет, когато дистрибуцията го публикува.

Версия на Node.js Състояние
26.x поправена в 26.12.1
24.x (LTS) поправена в 24.22.1
22.x (LTS) поправена в 22.23.4
20.x и по-стари, 23.x, 25.x няма поправка, необходимо е преминаване към поддържана версия

Как работи уязвимостта

Brotli е формат за компресия, който сайтовете използват, за да изпращат по-малко данни. При декомпресиране декодерът записва разархивираните данни в буфер в паметта. Нарочно съставен Brotli поток кара декодера да запише данни извън границите на този буфер и да повреди съседни области от паметта. Според Google това може да доведе до изтичане на съдържание от паметта, спиране на процеса или изпълнение на код.

Поправката в Node.js добавя проверка, която отхвърля невалидния поток по-рано, с нов код за грешка BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH.

Колко сериозна е заплахата

  • Google оценява уязвимостта с 9,2 по CVSS 4.0 с бележка, че атаката зависи от условия в конкретната среда. Node.js я класифицира като висока.
  • Imperva съобщава, че е постигнала изпълнение на код в тестови приложения върху официалния образ на Node.js 24.22.0 след няколко опита, а версия 24.22.1 отхвърля същите данни.
  • Публикуван експлойт е постигнал изпълнение на код само върху нарочно отслабена компилация. При стандартна компилация резултатът е спиране на процеса и ограничено изтичане на памет.
  • Агенцията CISA не е включила уязвимостта в списъка си с активно използвани уязвимости към 23 октомври.

При PHP2Shell от същата седмица първите опити за атаки бяха регистрирани още преди публикуването на поправките. Обновете, без да чакате потвърдени атаки.

Останалите поправки

Изданието поправя още девет уязвимости. Повечето засягат приложения, които сами отварят връзки към други сървъри.

  • CVE-2026-106069 и CVE-2026-105483 (високи): при нестандартен запис на IP адрес, например 127.1 или с цифри с пълна ширина от Unicode, Node.js може да приеме TLS сертификат, който не е издаден за този адрес. В комбинация с атака „човек по средата“ това позволява подмяна на сървъра, към който приложението се свързва.
  • CVE-2026-106072 (средна): свързан проблем, при който сертификат за име на домейн удостоверява връзка към IP адрес, записан в нестандартен вид.
  • CVE-2026-105482 (висока): dns.resolve отрязва имената при символ NUL. Приложение, което проверява адреса, подаден от потребител, и после го резолвира, може да резолвира различно име от проверяваното.
  • CVE-2026-106074 (средна): при приложения, изградени като single executable application (SEA) или със startup snapshot, crypto.randomUUID() и crypto.randomInt() връщат едни и същи стойности във всеки процес. Такива приложения трябва да бъдат изградени наново с поправената версия, не само обновени.
  • CVE-2026-105481 (средна): поддържана отворена връзка (keep-alive) може да приеме отговор, изпратен преди самата заявка.
  • Три уязвимости с ниска оценка засягат експерименталния Permission Model и модула за ZIP във версия 26.
  • Списъкът с доверени сертификати блокира междинните сертификати на eMudhra след компрометирането им.

Какво да направите сега

1. Установете версиите, които работят

Командата node -v на сървъра показва само една инсталация. Проверете и:

  • Docker образите: версията е в базовия образ, например node:22, и се обновява само при ново изграждане;
  • сървърите за непрекъсната интеграция (CI) и машините на разработчиците;
  • приложения, разпространявани като един изпълним файл, и настолни приложения на Electron.

npm audit проверява само пакетите в проекта, не самия Node.js, и няма да покаже тази уязвимост.

2. Обновете

  • Сървър с пакети от NodeSource: apt update && apt install nodejs, след което проверете с node -v.
  • nvm или подобни инструменти: инсталирайте новата версия от същия ред, например nvm install 22, и я направете версия по подразбиране.
  • Docker: изградете образите наново с docker build --pull и ги разположете отново.
  • Дистрибуции, които използват системната libbrotli (Debian и производни): обновете и пакета libbrotli1, когато дистрибуцията публикува поправка. Проверете с ldd $(command -v node) | grep brotli; ако командата не показва нищо, Node.js използва вградената библиотека.
  • Node.js 20 или по-стар: преминете на 22 или 24. Това обикновено изисква проверка на зависимостите.

3. Рестартирайте всички процеси

Работещите процеси продължават да използват старата версия, докато не бъдат рестартирани. Това важи за услугите в systemd, процесите на pm2 и всичко, стартирано ръчно или от cron.

4. Временни мерки

  • Ако API на Express 5 не трябва да приема компресирани заявки, задайте inflate: false на body-parser. Обновете body-parser до 2.4.0 или 1.20.9 и заради отделната уязвимост CVE-2026-111181, при която една компресирана заявка с излишни байтове спира процеса.
  • Когато приложението зарежда адреси, които не контролирате, изключете автоматичното декомпресиране: decompress: false в axios и got, compress: false в node-fetch.
  • Не изключвайте проверката на TLS сертификатите (rejectUnauthorized: false или NODE_TLS_REJECT_UNAUTHORIZED=0), за да заобиколите грешки след обновяването. Това премахва защитата, която поправките за TLS възстановяват.

Как да проверите за следи от атака

Към момента няма публикувани индикатори за компрометиране. Неочаквани спирания на Node.js процеси и грешки при декомпресиране в логовете след 21 октомври не доказват атака, но са причина за проверка. При съмнение проверете за нови файлове и задачи в cron на потребителя, с който работи приложението, и за изходящи връзки към непознати адреси. Сменете паролите и ключовете за API, до които процесът има достъп, например в .env файловете.

Ако нападателят е имал достъп до лични данни, това е нарушение на сигурността на личните данни, което в повечето случаи трябва да бъде съобщено на КЗЛД до 72 часа. Фирмите в обхвата на Закона за киберсигурността подават и ранно предупреждение до 24 часа.

УязвимостиУеб приложения