Вразливість CVE-2026-111497 у декодері стиснення Brotli від Google дає змогу виконати запис за межі буфера під час обробки спеціально сформованих стиснених даних. Оскільки багато програмних продуктів — від Node.js і Bun до Python-пакетів і проксі-серверів Envoy — включають власну копію цього декодера, масштаб ураженого ПЗ виявився значним. Дослідники з Imperva продемонстрували виконання довільного коду на немодифікованій збірці Node.js 24.22.0 для Linux arm64. Патчі вже доступні: оновлення рантайму або бібліотеки — єдиний надійний спосіб усунення.
Технічна суть вразливості
Вразливість класифікується як CWE-787 (запис за межі буфера) і розташована в C-коді декодера Brotli. Згідно із записом у GitHub Advisory Database, проблема виникає під час обробки потоку Brotli, в якому оголошена структура блоків призводить до неможливого переходу типу блоку. Уразливий декодер інтерпретує такий стан як запит додаткових даних і продовжує роботу в невалідному стані, що призводить до запису за межі виділеного буфера. Виправлена версія натомість зупиняє декодування з помилкою формату.
Оцінки критичності відрізняються залежно від контексту продукту. GitHub Advisory Database вказує 9.2 Critical за CVSS v4.0. Red Hat оцінює вразливість як Important з балом 8.1 за CVSS v3.1. Node.js присвоює рейтинг High. Istio в контексті свого продукту вказує 7.7. Такий розкид відображає різні умови досяжності вразливого коду в кожному продукті, і жодну з цих оцінок не варто сприймати як універсальну.
Показова історія виправлення: патч, що закриває кореневу причину, було додано до вихідного коду Brotli ще 27 лютого, однак на той момент не було відомо, що зміна усуває вразливість безпеки, і нового релізу Brotli з цим виправленням не виходило до 21 жовтня. Докладні відомості доступні на сторінці NVD.
Уражені продукти та умови експлуатації
Ключова особливість цієї вразливості — кожен уражений продукт постачає власну копію декодера Brotli, тому кожен з них потрібно оновлювати незалежно. Підтверджений список ураженого ПЗ:
- Node.js — лінійки 22.x, 24.x і 26.x. Виправлені версії: 22.23.4, 24.22.1 і 26.12.1 (бюлетень Node.js)
- Bun — версії від 1.0.21 до 1.4.3. Виправлено у 1.4.4 (бюлетень Bun)
- Python-пакет Brotli (PyPI) — версії від 1.0.3 до 1.2.0. Виправлено в 1.2.1
- Python-пакет brotlicffi (PyPI) — також уражений
- Envoy — за ввімкненої декомпресії Brotli (бюлетень Envoy)
- Istio — версії 1.29.0–1.29.8, 1.30.0–1.30.5, 1.31.0–1.31.1 за використання ураженого шляху Envoy
Умови експлуатації залежать від конфігурації. Програма є вразливою лише якщо декодує дані Brotli з недовіреного джерела. Для Node.js і Bun це відбувається під час читання відповіді із заголовком Content-Encoding: br через вбудований fetch(), а також під час декомпресії тіла запиту через middleware. Сам по собі HTTP-сервер Node.js не декодує тіло запиту у форматі Brotli — для цього потрібен явний виклик або middleware. Згідно з документацією Express 5, middleware express.json(), express.urlencoded(), express.text() та express.raw() тепер підтримують декомпресію Brotli, що створює вхідний вектор атаки на маршрутах, де ці обробники активні.
У Python ситуація особливо підступна: достатньо встановленого пакета Brotli або brotlicffi, щоб HTTP-клієнти requests, urllib3, httpx і aiohttp почали автоматично декодувати відповіді у форматі Brotli — без явного імпорту Brotli в коді застосунку.
Для Envoy та Istio вразливість досяжна лише за ввімкненої декомпресії Brotli через відповідний фільтр.
Статус експлуатації та демонстрація
Статус експлуатації — доступний публічний PoC. Дослідники з Imperva у межах демонстрації Node2Shell домоглися виконання довільного коду на стандартній збірці Node.js 24.22.0 для Linux arm64, без налагоджувача і без модифікованої збірки. Експлойт відтворювався через обидва вектори — тіло вхідного запиту (Express 5) та відповідь, отриману через fetch(). Водночас експлуатація не була стабільною й потребувала кількох спроб; інші архітектури та лінійки 22.x і 26.x не тестувалися.
За даними бюлетеня Vercel, дослідники також продемонстрували витік пам’яті процесу та виконання команд на непатчених лінійках Node.js. Експлуатації у реальних атаках на момент публікації не зафіксовано. Вразливість не внесена до каталогу CISA KEV.
Обмеження WAF-захисту
Vercel розгорнув правила WAF 21 жовтня для блокування вхідних атак. Однак, як прямо зазначено в бюлетені Vercel, ці правила не охоплюють відповіді у форматі Brotli, які застосунок отримує від зовнішніх серверів. Це принципове обмеження: WAF-телеметрія здатна виявити частину спроб атаки на вхідному трафіку, але не може захистити від шкідливих відповідей, отриманих застосунком під час звернення до зовнішніх ресурсів. Тому інвентаризація рантаймів і перескладання контейнерних образів залишаються обов’язковими.
Рекомендації
Пріоритет оновлення слід надати сервісам і клієнтам з доступом до інтернету, які автоматично декодують недовірені дані Brotli. Сам факт приймання HTTP-трафіку не означає вразливість Node.js — потрібна наявність коду або middleware, що виконує декомпресію.
- Оновіть рантайм або бібліотеку до виправленої версії. Після оновлення перезапустіть сервіс і перескладіть контейнерні образи — запущений процес використовує старий декодер до перезапуску.
- Лінійки Node.js 20.x і старші не отримають виправлення — потрібна міграція на підтримувану лінійку.
- Якщо негайне оновлення неможливе: відхиляйте вхідні запити із заголовком
Content-Encoding: brдо того, як проксі або парсер почне декомпресію; вимкніть автоматичну декомпресію Brotli в HTTP-клієнтах. - У Python: видаліть пакети Brotli та brotlicffi, щоб клієнти повернулися до gzip і deflate.
- Перевірте сканери залежностей: запис CVE посилається на репозиторій Google Brotli, а не на PyPI-пакети, і GitHub Advisory на момент публікації не вказував уражений пакет — Dependabot може не спрацювати. Записи PYSEC-2026-4322 та PYSEC-2026-4323 додано 23 жовтня; перевіряйте встановлені версії вручну.
Видалення значення br із Accept-Encoding саме по собі не захищає: сервер може надіслати відповідь у форматі Brotli незалежно від уподобань клієнта. Для Node.js обхідного шляху всередині рантайму не опубліковано — оновлення є єдиним способом усунення вразливості.
Оновіть усі екземпляри уражених рантаймів і бібліотек, приділивши першочергову увагу сервісам, що обробляють недовірений Brotli-трафік в обох напрямках — як на вході, так і під час отримання відповідей від зовнішніх серверів. Раніше ми писали про виправлення безпеки в продуктах Google — CVE-2026-111497 підтверджує, що компоненти Google, вбудовані у сторонні продукти, потребують окремого відстеження та оновлення.












