Skip to content
BotServBotServ
CVE-2026-111497уязвимость Node.jsбезопасность Vibe Codingисследования безопасности ИИBrotliClean CodeRemote Code Execution

CVE-2026-111497: уязвимость Node.js и уроки для разработчиков

CVE-2026-111497 в Brotli декодере Node.js: CVSS 9.2, Remote Code Execution. Найдена ИИ, заделана в один день с PHP2Shell.

S

schutzgeist

15 min read
CVE-2026-111497: уязвимость Node.js и уроки для разработчиков

Что рассмотрено в статье

  • Что такое CVE-2026-111497, как работает ошибка в декодере Brotli и какие версии Node.js защищены.
  • Почему эта уязвимость вместе с PHP2Shell показывает закономерность: ИИ находит ошибки, которые люди упускали годами.
  • Неудобный вопрос: учатся ли кодирующие агенты из исправлений безопасности или распространяют ошибочный код дальше.
  • Что уязвимость означает для Docker и Coolify развёртываний и почему контейнеры сами по себе недостаточны.
  • Почему основы вроде Clean Code остаются актуальны в эру ИИ, несмотря на обоснованную критику книги.

21 октября 2026 года был двойной удар

В тот же день, когда PHP2Shell потрясла PHP-мир, Node.js-проект выпустил свой Security Release. Самая серьёзная уязвимость в нём: CVE-2026-111497, ошибка в памяти декодера Brotli с CVSS 9,2. Главное: обе уязвимости обнаружили команды с поддержкой ИИ. PHP2Shell связана с Wiz Research, OpenAI Codex Security и Calif, а CVE-2026-111497 сообщили в OpenAI Codex Security, конкретно Khai Tran и Sylvie Mayer.

Это главный новостной момент. За одну неделю ИИ-системы нашли две критические ошибки в памяти инфраструктуры, которая работала в production годами. Для разработчиков, пишущих код с ИИ, вопрос встаёт с двух сторон: помогает ли тот же инструмент найти такие ошибки в твоём коде? И одновременно генерирует ли больше кода, в котором прячутся такие дефекты?

Что такое CVE-2026-111497?

Уязвимость Node.js находится в Brotli-декомпрессоре. Brotli это алгоритм сжатия от Google, он упаковывает веб-трафик, HTTP-ответы и архивы плотнее, чем gzip. Node.js включает C-библиотеку и предоставляет её через node:zlib.

Ошибка классическая для безопасности памяти, обёрнутая в контекст потока: когда декодер встречал неправильный переход блока, он должен был сообщить постоянную ошибку формата. Вместо этого он возвращал, что ему нужны дополнительные входные данные. Потоковый декодер продолжал писать в тот же буфер, добавляя новые байты во внутренний восьмиканальный буфер за пределами конца. Итог: Out-of-bounds Write, запись за границы выделенной памяти.

Если кто-то может подсунуть приложению поддельные данные Brotli, например через тело HTTP-запроса, загрузку или ответ, который приложение загружает с внешнего сервера, он может повредить память процесса. Последствия: крах, утечка памяти процесса или в худшем случае Remote Code Execution с правами процесса Node. CVE помечена как CWE-787 (Out-of-bounds Write) и CWE-252 (Unchecked Return Value). Вторая особенно показательна: возвращаемое значение не проверили правильно. Именно это проверяют Code Reviews уже десятилетия.

Какая версия Node.js безопасна?

ВерсияСтатус
Node.js 26.12.1 или новееисправлено
Node.js 24.22.1 или новееисправлено
Node.js 22.23.4 или новееисправлено
Node.js 20.x и старшеEnd of Life, исправления нет
Brotli-библиотека 1.0.10, 1.1.1, 1.2.1исправлено
Brotli 1.0.3 до 1.2.0уязвима

Важно: уязвимость в самой библиотеке Brotli. Подвержены не только Node.js, а любое ПО, которое включает тот же декодер. NVD-запись показывает Google Brotli 1.0.3 до 1.2.0 как уязвимые. Если ты запускаешь Python-, Rust- или Go-проекты с Brotli-привязками, проверь версию встроенной библиотеки.

О CVE-записи: идентификатор выдала Google как CNA, не Node.js-проект, потому что ошибка в Google-библиотеке. CISA-Vulnrichment-дополнение от 23 октября оценивает уязвимость тремя SSVC-баллами: нет известной эксплуатации на момент сообщения, не тривиально автоматизируется, но при успешной эксплуатации полный технический удар на процесс. Коротко: сейчас нет массовой волны, но основание для серьёзных атак, когда появится стабильный exploit.

Тебя это касается?

Поверхность атаки уже, чем у PHP2Shell: Node.js не распаковывает Brotli-данные из сети автоматически. Ты уязвим, если приложение активно применяет brotliDecompress или Brotli-поток из node:zlib к данным, которые контролирует злоумышленник. Три типичных случая:

  • Request-body’и или загрузки с Content-Encoding: br, которые ты принимаешь и распаковываешь.
  • Ответы, которые твой код загружает с внешних серверов и распаковывает. Здесь Runtime-патч перехватывает то, что обойти нельзя.
  • Middleware, которая получает сжатые payload’ы от пользователей.

Проверь версию так:

node -v

В Docker-контейнерах, как и при PHP2Shell, важна версия в образе:

docker exec <container> node -v

На Vercel и подобных Managed-платформах обновление идёт через провайдера, переразвёртывание гарантирует новую Runtime. Если ты на Node.js 20.x: ветка End of Life и не получит исправление, переход на 22.x или 24.x обязателен.

Сравнение с CVE-2025-10966: две уязвимости, один паттерн

Ровно год раньше, в ноябре 2025, вышла CVE-2025-10966: в curl отсутствовала проверка хоста для SFTP через wolfSSH-backend. Man-in-the-Middle мог выдать себя за сервер без всяких сигналов тревоги. Серьёзность низкая, потому что почти никто не использует этот backend в production, но находка интересна: сообщил её Stanislav Fort из Aisle Research, компании, занимающейся исследованиями безопасности с ИИ.

CVE-2025-10966CVE-2026-111497
ПОcurlNode.js (Brotli)
Тип ошибкиОтсутствует проверка хоста, CWE-322Out-of-bounds Write, CWE-787 + CWE-252
СерьёзностьLowCritical, CVSS 9,2
Обнаружено с ИИДа, Aisle ResearchДа, OpenAI Codex Security
Возраст кодаОшибка в реализации, которой годыДефект в давно стабильном коде декодера

Общий паттерн: оба бага не были новыми ошибками. Они сидели в коде, работавшем в production годами, в путях, которые почти никто не использует или не ревьюит. Человеческие ревьюеры упустили оба. ИИ-системы нашли их, потому что систематически и неутомимо обходят кодовые пути, на которые у человека нет времени. За контекстом, как ИИ меняет кибербезопасность с обеих сторон, смотри статью KI in der Cybersecurity.

Учатся ли Vibe-Coding агенты из исправлений?

Честный ответ: нет, не автоматически. LLM, генерирующая код, не учится из патча в реальном времени. Веса модели обучены до исправления. Если модель выучила из обучающих данных Brotli-потоковый код, unchecked-return-паттерны или небезопасные конфигурации по умолчанию, она будет предлагать те же паттерны, пока не обучится на новой модели с исправленными данными.

Это структурное отличие от человеческой команды: разработчик, однажды вызвавший production-уязвимость, помнит об этом. Модель нет. Она воспроизводит статистически вероятный код, а статистически вероятный код содержит исторические ошибки.

Три следствия для тебя как Vibe Coder:

  • Слепота к версиям: агенты охотно предлагают API и зависимости в версиях из обучающих данных. Агент не скажет сам, что его Node-пример содержит Brotli-уязвимость. npm audit, OSV-scanner или Dependabot остаются обязательны, даже если агент выдал чистый код.
  • Контекстное окно вместо памяти: что агент исправил внутри сессии, он забывает в следующей. Персистентность достигается только через правила, которые попадают в каждую сессию: project-rules, AGENTS.md, memory-файлы. Систематика описана в Agenten-Sicherheit.
  • Патч не в модели: пока не выйдет следующее поколение модели, обучающее распределение содержит ошибочный код. Если сегодня ты напишешь prompt про “streaming-decompression”, получишь паттерны, содержащие ту же логическую ошибку, которую CVE-2026-111497 только что исправила.

Второй вопрос: распространяют ли агенты старый, уязвимый код дальше? Да, пока он в обучающих данных и статистически часто встречается. Единственная защита с твоей стороны: не принимать сгенерированный код слепо, а ревьюить, тестировать и версионировать и аудировать зависимости.

Почему в будущем будет больше критических уязвимостей

Это не паника, а простой вывод из двух наблюдений.

Во-первых, кодовая база растёт быстрее, чем ёмкость её проверки. Генерируемый ИИ код увеличивает пропускную способность, но не углубляет понимание каждой строки. Больше кода в production означает больше поверхности атаки, и растущая доля этого кода проверена людьми лишь поверхностно.

Во-вторых, поиск уязвимостей дешевеет. Те же модели, что пишут код разработчикам, теперь систематически сканируют существующие кодовые базы. PHP2Shell и CVE-2026-111497: первые видные результаты. Wiz говорит о точке перегиба в исследовании уязвимостей на ИИ. Что раньше месяцы искало узкоспециализированное подразделение, теперь находит ИИ-усиленная команда за недели. Следствие: число сообщаемых критических CVE растёт не потому, что ПО становится хуже, а потому что его лучше ищут. Это тоже хорошая новость, которая звучит плохо: каждая найденная лазейка была там всегда.

Имеют ли смысл релизы в Docker-контейнерах вроде Coolify?

Контейнеры помогают, но проблему не решают. Они делают её управляемой.

Что контейнеры дают при CVE-2026-111497:

  • Контроль над runtime: Ты зафиксируешь версию Node в образе (node:24.22.1-alpine), перестраиваешь, развёртываешь атомарно. Без сценария «сервер ещё работает со старой версией, потому что никто не перезагрузил».
  • Быстрый путь патча: Официальный Node-образ пересобран с исправлением. Обновляешь тег, docker compose up -d, готово. Так же, как в руководстве PHP2Shell для Docker: перезагрузка недостаточна, нужна пересборка образа.
  • Ограничение урона: Если приложение не работает от root, файловая система в режиме read-only и нет секретов в переменных окружения, то RCE в контейнере ценится намного меньше. Компонента утечки памяти не вычитает системное ядро от root, а только сам процесс.
  • Откат и воспроизводимость: Если новый build отказывает, откатываешься на шаг назад через тег. Для Coolify это особенно удобно через интерфейс.

Чего контейнеры не делают: они ничего не патчат. Образ node:22-alpine, собранный до 21 октября, содержит уязвимую версию Brotli и после перезагрузки. Изоляция тоньше, чем её репутация: RCE в контейнере достаёт монтированные volumes, переменные окружения и в худшем случае Docker-сокет. Шаги усиления есть в разделах Безопасность Docker-контейнеров и Rootless Docker.

Для пользователей Coolify практический путь: запустить redeploy, чтобы Coolify пересобрал базовый образ, потом в работающем контейнере проверить node -v. Кто так управляет своим homeserver, найдёт пошаговую инструкцию с проверкой WordPress в статье PHP2Shell: WordPress, Docker, Coolify и Homeserver jetzt prüfen und absichern на IRC-Mania.de.

Учиться без Vibe Coding: насколько Clean Code полезен сегодня

Статья была бы неполной без вопроса, что можно вынести из CVE-2026-111497 без инструментов ИИ. И вот настольная классика: Clean Code Роберта К. Мартина 2008 года, есть в рекомендациях книг по ИИ.

Сначала справедливая критика. Книга старая. Примеры на Java, паттерны pre-Microservice, некоторые правила спорны. Враждебность Дяди Боба к комментариям, его догма о коротких функциях и раздумья о наследовании уже не бесспорны. Кто читает книгу как закон, производит догматизм вместо качества.

Но честный ответ на вопрос об актуальности: ядро держится. Ошибка за CVE-2026-111497: учебный пример того, чему учит книга. Возвращаемое значение не обработано правильно, состояние ошибки передано как «нужны ещё данные» вместо «ошибка формата», вызывающий код сделал неверное предположение о состоянии декодера. Clean Code называет это так: относись к ошибкам как к отдельному классу логики, не возвращай двусмысленные состояния, не заставляй вызывающего угадывать, что произошло. Эти принципы языконезависимы и старше самой книги.

Три конкретизации для сегодня:

  • Именование и короткие функции остаются в силе, особенно потому что генерируемый код часто содержит длинные, сложные для проверки функции.
  • Обработка ошибок в эру ИИ важнее, чем когда-либо: сгенерированные пути кода часто упираются в сценарий успеха. Если ты задаёшь вопросы из книги, ошибка всплывает: что при неверном вводе, при таймауте, при прерванном потоке?
  • То, что действительно устарело, это конкретные Java-идиомы и рекомендации по фреймворкам. Главное послание, что код пишется для читателя и ошибочные пути должны быть видны, актуально так же, как в 2008.

Для систематической практики подходит Программирование с ИИ, там есть упражнение, где ИИ предлагает улучшения в духе Clean Code, которые ты затем сам реализуешь.

Как продолжить обучение программированию, несмотря на ИИ

Последний вопрос самый важный: если ИИ пишет код, что учить тебе?

Честный ответ: ценный навык смещается с написания на проверку. CVE-2026-111497 показывает почему. Ошибка была в человеческом коде, но та же логическая ошибка, необработанное возвращаемое значение в streaming API, появляется и в сгенерированном. Кто не понимает, что декодер делает с буфером, не может проверить код, кто бы его ни писал.

Конкретные пути практики:

  • Читай CVE-writeups как документацию. Advisory по Node.js объясняет ошибку в трёх абзацах понятнее, чем любой туториал. Если один раз понял, что такое Out-of-bounds Write, узнаёшь паттерн в собственном коде.
  • Проси ИИ разобрать сгенерированный код, строка за строкой. Требуй от ИИ объяснить код, который она только что написала. Если какое-то место не понимаешь, это место, которое нужно учить.
  • Проверяй чужой код по одному паттерну. Возьми CVE вроде этого, прочитай патч и объясни, почему исправление правильно. Это практическое знание безопасности, которое никакой курс не передаёт так подробно.
  • Критические пути пиши сам. Auth, декомпрессия, загрузка файлов, всё, что касается недоверенного ввода. ИИ пусть создаёт boilerplate, строки, где ошибка дорога, пиши ты.
  • Наработай привычку к безопасности: npm audit, проверка зависимостей, раз в квартал инвентаризировать server runtimes. Рутина побеждает знание без применения.

И главная позиция: ИИ не заменяет понимание, он его смещает. Кто разрабатывает сегодня, нуждается в меньшем запоминании синтаксиса, но в большем суждении о коде, который получает. Именно для этого написан Clean Code, и именно поэтому он остаётся актуален.

Частые вопросы о CVE-2026-111497 и безопасности кода

Лазейка в Node.js

Что такое CVE-2026-111497? Критическое повреждение памяти в декодере Brotli, который Node.js предоставляет через node:zlib. Out-of-bounds Write может привести к краху, утечке памяти или удалённому выполнению кода. Затронуты Node.js 22.x, 24.x и 26.x до версий с патчем.
Какая версия Node.js безопасна? 22.23.4, 24.22.1 и 26.12.1 или новее. Node.js 20.x достиг конца жизни и патч не получит, обновление необходимо.
Как проверить мою версию Node.js? На сервере выполни node -v. В Docker-контейнере: docker exec <container> node -v. В Coolify через вид логов или терминал контейнера.
Мою приложение затронет, если я не использую Brotli? Если твой код применяет brotliDecompress или Brotli-потоки к данным под контролем злоумышленника, то да. Кто использует Brotli только для исходящей компрессии, реже подвержен. Вызовы библиотек в зависимостях считаются.
ИИ нашёл эту лазейку? Да. Сообщили OpenAI Codex Security, конкретно Khai Tran и Sylvie Mayer. Вместе с PHP2Shell это наиболее видимое доказательство того, что исследование безопасности на ИИ находит настоящие критические баги.
Что такое Brotli? Алгоритм сжатия Google, стандарт для HTTP-кодирования наряду с gzip. Node.js встраивает C-библиотеку. Лазейка находится в самой библиотеке, не в коде для Node.
Хватит ли перезагрузки Docker для патча? Нет. Образ нужно пересобрать, чтобы исправленная версия Brotli оказалась в контейнере. docker compose build --pull && docker compose up -d, затем проверь версию.
Что мне делать с Node.js 20.x? Планируй переход на 22.x или 24.x. Node 20 достиг конца жизни, патч не получит и всё равно постоянный риск.
Защитит ли брандмауэр? Нет. Правила WAF, например от Vercel или Cloudflare, смягчают известные векторы атак, но не заменяют runtime-патч. Вектор атаки ниже уровня приложения.

Vibe Coding и безопасность КИ

Учатся ли кодирующие агенты из патчей безопасности? Автоматически нет. Веса модели обучались до выпуска патча. Уязвимый код остаётся в тренировочных данных. Только новая модель с обновленным корпусом изменит поведение.
Распространяют ли KI-агенты старый, уязвимый код? Да, пока он доминирует в тренировочных данных. Агент предлагает статистически частые паттерны, не безопасные. Review и аудит зависимостей остаются обязательными.
Код, сгенерированный КИ, принципиально небезопасен? Нет. Опасен, если попадает в production без review, тестов и проверки зависимостей. КИ может улучшить безопасность, если использовать её для review и анализа.
Может ли КИ проверить мой код на такие уязвимости? На первый проход да. “Проверь этот код на ошибки доступа в памяти и непроверенные возвращаемые значения” даёт полезные совпадения. Граница в контексте: модели пропускают проблемы, зависящие от системы, и могут привнести ложное чувство безопасности.
Будем ли мы видеть больше критических CVE в будущем? Вероятно, по двум причинам: кодовая база растёт быстрее, чем ёмкость review, а исследование на основе КИ находит ошибки, которые люди пропускают. Оба фактора растят количество находок.
В чём разница между CVE-2026-111497 и PHP2Shell? PHP2Shell был в PHP-Core и давал RCE на очень широкий спектр. CVE-2026-111497 в библиотеке Brotli и касается приложений, которые активно распаковывают данные, контролируемые атакующим. Сходство: обе найдены с помощью КИ.
Что такое Vibe Coding? Разработка через естественноязычные промпты к LLM с фокусом на результат вместо собственного понимания кода. Подходит для прототипов, рискованна для production, если недостаёт review и тестов.
Docker-контейнеры безопаснее для релизов? Практичнее, да. Дают контроль над runtime, атомарный deployment и откат. Но ничего не патчат: образ нужно пересобрать с исправленной версией, и контейнер нужно закаливать.
Подходит ли Coolify для безопасного развёртывания? Да, для цепочки патчей очень удобно: redeploy берёт новый базовый образ, откат работает по тегу. Безопасность зависит от настроек контейнера: без root, read-only файловая система, secrets как файлы, а не переменные окружения.

Кодирование и безопасность в целом

Что такое out-of-bounds write? Программа пишет данные вне зарезервированного буфера. Это может перезаписать соседние данные, вызвав сбой, утечку информации или в худшем случае выполнение кода.
Что значит CWE-252, Unchecked Return Value? Возвращаемое значение функции не проверяется, вызывающий неправильно предполагает успех. В CVE-2026-111497 “ошибка формата” возвращалась как “нужно больше данных”, и декодер продолжал писать в слишком маленький буфер.
Что такое Remote Code Execution? Атакующий выполняет свой код в вашей системе без физического доступа. В CVE-2026-111497 с правами Node-процесса, то есть с доступом к volume, переменным окружения и сети.
Что такое Memory Disclosure? Процесс раскрывает содержимое памяти, не предназначенное для вызывающего, например session-токены, ключи или данные пользователей. Даже без выполнения кода это серьёзный ущерб.
Нужен ли code review, если КИ пишет? Да, больше чем когда-либо. КИ-код выглядит чистым, но содержит непроверенные предположения, небезопасные значения по умолчанию и устаревшие паттерны API. Review единственный фильтр.
Что такое supply-chain атака? Вместо прямого нападения на вас атакующий заражает зависимость, которую вы устанавливаете. Пример: npm-worm кампания 2025 года, которая экспортировала токены и credentials с машин разработчиков.
Как защититься от скомпрометированных npm-пакетов? Коммитьте lockfile, используйте npm audit и Dependabot, вкатывайте обновления с задержкой, а не сразу, проверяйте статус maintenance пакетов и не храните secrets на dev-машинах.
Что такое Secrets-Rotation? Регулярная смена API-ключей, паролей и токенов, чтобы утечённые доступы стали недействительны. При уязвимостях раскрытия памяти типа CVE-2026-111497 первый шаг после патча, см. Secrets-Rotation автоматизировать.
Что даёт read-only файловая система в контейнере? После RCE атакующий не может заменить бинарники или залить webshell. Персистентность усложняется, forensics упрощается.
Почему не root в контейнере? RCE как root в контейнере может использовать kernel-интерфейсы, достичь Docker-демона или эскалировать на хосте. Как непривилегированный пользователь поверхность атаки намного меньше.
Что такое процесс управления патчами? Регулярная рутина: инвентаризация runtime, мониторинг security-релизов, своевременные обновления с проверкой перезагрузки, проверка на компрометацию. При критических CVE типа PHP2Shell в часах, не неделях.

Обучение программированию и чистый код

Стоит ли Clean Code в эру КИ? Суть да: обработка ошибок как отдельная логика, говорящие имена, маленькие функции, вызывающий не гадает. Java-примеры и догмы устарели, но принципы именно те, которые нарушила CVE-2026-111497.
Какие слабости Clean Code? Java-ориентирован, написан до микросервисов, догматично против комментариев, некоторые правила спорны. Как закон непригоден, как мыслительный фреймворк остаётся мощным.
Как остаться релевантным разработчиком, если КИ пишет? Переместите фокус с написания на проверку: умение review, знания безопасности, системный дизайн, отладка. КИ заменяет печатание, не суждение.
Как учиться на CVE для своей работы? Прочитайте advisory, поймите ошибку, посмотрите на патч и объясните себе, почему fix корректен. Следующий шаг: поищите тот же паттерн в собственном коде.
Писать ли критический код самому вместо КИ? Да. Auth, декомпрессия, загрузка файлов, логика платежей, всё, что обрабатывает недоверенный input. КИ может boilerplate, security-критичные пути ваши.
Может ли КИ помочь при обучении? Да: объяснять, проходить review, генерировать примеры, показывать вариации. Учебный эффект приходит, когда вы понимаете, что сделала КИ, а не когда вы это просто берёте.
Каковы главные принципы безопасности для разработчиков? Никогда не доверяйте входу, проверяйте возвращаемые значения, делайте состояния ошибок явными, минимально необходимые права, инвентаризируйте зависимости, secrets не в коде, логирование для паттернов атак. CVE-2026-111497 нарушает сразу три.
Нужна ли учёба по безопасности для безопасного кода? Нет. Паттерны обучаемы: CWE-Top-25, OWASP-гайды, CVE-writeups, bug-bounty-отчёты. Важна рутина при review, не диплом.
Где найти больше о безопасной разработке на PHP и Node.js? Для технической стороны IRC-Coding.de с его программистскими туториалами, для Incident Response и компрометации IRC-Security.de. PHP2Shell-статья на BotServ разбирает PHP-часть той же темы.

Источники и дополнительные материалы

  • Node.js Security Release, 21 октября 2026: Официальное уведомление об уязвимости CVE-2026-111497 и девяти других исправлениях.
  • CVE-2026-111497 Record: Запись в реестре CVE с CWE-787 и CWE-252, включая обогащение CISA (известные эксплуатации отсутствуют, полный масштаб воздействия).
  • GitHub Advisory GHSA-9v8h-qqgm-4m35: Уведомление об уязвимости в библиотеке Brotli с перечислением затронутых версий.
  • Vercel Security Bulletin: Контекст эксплуатации и статус управляемой среды исполнения.
  • CSA Singapore Alert: Оценка критичности с CVSS 9,8.
  • curl CVE-2025-10966 Advisory: Пример для сравнения, также обнаруженный с помощью AI.
  • PHP2Shell на BotServ.de: Аналогичный случай того же дня.
  • PHP2Shell на IRC-Coding.de: Подробное руководство по обновлению PHP.
  • PHP2Shell на IRC-Mania.de: Практика с Docker, Coolify и домашними серверами.
  • IRC-Security.de: Реагирование на инциденты, анализ логов и судебная экспертиза после компрометации.
Назад к блогу
Share:

Nächster Artikel in Безопасная эксплуатация

Weiterlesen
AI Pentest-агенты: Novee, Tenzai, Pentera и Escape

Похожие статьи