Что рассмотрено в статье
- Что такое 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-10966 | CVE-2026-111497 | |
|---|---|---|
| ПО | curl | Node.js (Brotli) |
| Тип ошибки | Отсутствует проверка хоста, CWE-322 | Out-of-bounds Write, CWE-787 + CWE-252 |
| Серьёзность | Low | Critical, 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: Реагирование на инциденты, анализ логов и судебная экспертиза после компрометации.


