На 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-105482 | dns.resolve съкращава имена, които съдържат нулев байт | Висока | 22.x, 24.x, 26.x |
| CVE-2026-105481 | Keep-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-106070 | ZipFile връща байтове, контролирани от атакуващ, след неуспешна проверка на заглавната част | Ниска | 26.x |
| CVE-2026-106071 | Permission 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 отговори, които приложението изтегля от други сървъри, и не заместват обновяването.