На 21 октомври Node.js пусна обновявания за сигурност за трите си поддържани линии – 22.x, 24.x и 26.x, – с които се отстраняват 10 уязвимости. Най-сериозната е грешка в кода за декомпресия на Brotli, който Node.js включва в себе си. Според проекта тя може да позволи отдалечено изпълнение на код, т.е. атакуващ би могъл да изпълни произволен код по свой избор върху засегнатата система.

Всяка поддържана линия има по една коригирана версия: 22.23.4 и 24.22.1 при линиите с дългосрочна поддръжка и 26.12.1 при текущата линия. Node.js 20.x и по-старите версии са достигнали края на жизнения си цикъл и няма да получат корекцията, затова трябва да бъдат преместени на поддържана линия.

Уязвимостта в Brotli е в код, който Node.js съдържа във вградена форма, а не в собствената програма на потребителя. Node.js изпълнява този код всеки път, когато декомпресира Brotli данни – директно чрез модула node:zlib или автоматично, когато кодът извика fetch() за отговор, изпратен с Brotli компресия.

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

Уязвимостта в Brotli

Грешката представлява запис извън границите на буфера (out-of-bounds write) в Brotli декодера и се задейства от неправилно оформени компресирани входни данни. Корекцията е от проекта Brotli и е копирана в Node.js. Тя кара декодера да разпознава невалидния вход и да спира по-рано, вместо да записва отвъд буфера.

Brotli е компресионната библиотека на Google, а Node.js включва собствено копие от нея. Същата корекция излезе в Brotli 1.2.1, 1.1.1 и 1.0.10 на 21 октомври, така че и друг софтуер, който вгражда Brotli, може да се нуждае от същото обновяване. Промяната е направена за първи път в изходния код на Brotli през февруари 2026 г., а като издание за сигурност е пусната едва през октомври.

„Отдалечено изпълнение на код“ е описанието на проекта за това, което уязвимостта би могла да позволи, като тя е оценена като висока, а не като критична. Доказаното на практика е по-ограничено.

Публичен proof-of-concept, публикуван на 22 октомври, достига до изпълнение на код само срещу умишлено отслабен тестов билд. При стандартен билд на Node.js авторът му съобщава за срив и ограничено четене от паметта на процеса, но не и за изпълнение на код, и посочва, че работеща атака срещу нормален билд не е постигната.

Коригираният Node.js отхвърля неправилно оформения вход, който използва proof-of-concept кодът, а до 22 октомври не са докладвани случаи на експлоатация на уязвимостта в реални атаки.

Другите уязвимости

Три от останалите корекции също са с висока оценка. Две от тях са проверки на TLS сертификати, които атакуващ може да заобиколи, като запише IP адреса на сървъра в необичаен формат, така че сертификатът да съвпадне с хост, с който не би трябвало (CVE-2026-106069 и CVE-2026-105483). Третата не позволява на dns.resolve да съкращава име на хост при вграден нулев байт (CVE-2026-105482).

Node.js оценява CVE-2026-105483 като висока, макар че комитът, който я отстранява, определя грешката като с ниска severity и трудна за експлоатация.

Останалите са със средна и ниска степен на сериозност. Една от средните кара crypto.randomUUID() и crypto.randomInt() да връщат едни и същи стойности във всеки процес, когато приложението е изградено като startup snapshot или като single-executable application (CVE-2026-106074). Това компрометира всичко, което разчита на непредсказуемостта на тези стойности.

Пълният списък и линиите, които засяга всяка уязвимост:

CVEКакво представляваСериозностЗасегнати линии
CVE-2026-111497Запис извън границите на буфера в Brotli декодера; отдалечено изпълнение на код според проектаВисока22.x, 24.x, 26.x
CVE-2026-106069Заобикаляне на TLS проверката на името на хоста, когато хост се резолвира до IP адрес в неканонична формаВисока22.x, 24.x, 26.x
CVE-2026-105483Заобикаляне на TLS проверката на името на хоста, когато IP адрес е записан с цифри с пълна ширина (fullwidth)Висока24.x, 26.x
CVE-2026-105482dns.resolve съкращава имена, които съдържат нулев байтВисока22.x, 24.x, 26.x
CVE-2026-105481Keep-alive сокет може да обработи отговор, записан преди изпращането на заявкатаСредна22.x, 24.x, 26.x
CVE-2026-106072Валидиране на сертификати за неканоничен IPv4 позволява на DNS имена да автентикират IP крайни точкиСредна22.x, 24.x, 26.x
CVE-2026-106074Кешовете на randomUUID() и randomInt() се използват повторно в startup snapshots и single-executable приложенияСредна22.x, 24.x, 26.x
CVE-2026-106070ZipFile връща байтове, контролирани от атакуващ, след неуспешна проверка на заглавната частНиска26.x
CVE-2026-106071Permission Model предоставя прекомерен достъп до файлове чрез търсене с wildcardНиска26.x
CVE-2026-106073Заобикаляне на Permission Model с fs.realpathSyncНиска22.x, 24.x, 26.x

Блокирането на сертификатите на eMudhra

Същите обновявания спират и доверието на Node.js към осем ключа на междинни сертифициращи органи на индийския доставчик eMudhra, за които няколко дни по-рано бе съобщено, че са компрометирани.

Node.js използва списъка с коренни сертификати на Mozilla, но по подразбиране не извършва проверки за отнемане на сертификати. Затова преди това обновяване верига от сертификати, изградена върху някой от компрометираните ключове, все още се приемаше като валидна.

Изданията добавят вградена блокировка на осемте ключа и обновяват включения списък с коренни сертификати, като премахват три emSign корена. Go направи същата блокировка в собственото си обновяване на 20 октомври.

Връзки, възобновени от сесия, започнала преди обновяването, не се проверяват отново до изтичането ѝ, а линиите с изтекла поддръжка не получават блокировката.

Обновени зависимости

Освен 10-те уязвимости, обновяванията освежават и няколко вградени компонента. Копието на undici – HTTP клиента зад fetch() – е преместено на версия, която отстранява три съвета със средна сериозност: един в проверката за Subresource Integrity и два за изчерпване на паметта, като единият е в WebSocket клиента, вграден в Node.js.

Node.js обнови и вградения c-ares на всички линии, OpenSSL на 22.x и 24.x и SQLite на 22.x, за да включи корекции на публично известни уязвимости.

Ако още не можете да обновите

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

Vercel, която изпълнява Node.js за своите клиенти, съобщи, че на 21 октомври е добавила правила на защитната стена, които блокират атаката във входящите заявки. Правилата не покриват Brotli отговори, които приложението изтегля от други сървъри, и не заместват обновяването.