CVE-2026-41242: критическая RCE в protobuf.js — CVSS 9.8
Анализ безопасности · 13 июня 2026

CVE-2026-41242: критическая уязвимость внедрения кода в protobuf.js
CVSS 9.8 — эксплуатация, влияние и полное руководство по исправлению

Критическая уязвимость внедрения кода в protobuf.js позволяет атакующим выполнять произвольный код на Node.js-серверах через вредоносные protobuf-определения. 52 миллиона еженедельных загрузок npm и цепочка из 5 дополнительных CVE делают этот инцидент одним из самых значительных в области безопасности npm в 2026 году.

Олег Максимов 13 июня 2026 14 мин чтения

⚠ КРИТИЧЕСКИ ВАЖНО — необходимы немедленные действия

Если ваше приложение использует protobufjs версии 7.5.4 или ниже, либо 8.0.0, ваш сервер уязвим для удалённого выполнения кода через вредоносные protobuf-определения. Немедленно обновитесь до 7.5.6+ / 8.0.2+. Наибольшему риску подвержены приложения, загружающие .proto-файлы или JSON-дескрипторы из внешних источников.

Кратко: что произошло

Обзор уязвимости

17 апреля 2026 года разработчики protobuf.js раскрыли CVE-2026-41242 — критическую уязвимость внедрения кода в одном из самых зависимых пакетов npm. protobuf.js — это среда выполнения JavaScript для Protocol Buffers, формата сериализации от Google, используемая примерно 52 миллионами установок npm в неделю.

Уязвимость получила оценку CVSS 3.1 — 9.8 (CRITICAL) от NVD с вектором CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — сетевой доступ, низкая сложность, без привилегий, без взаимодействия с пользователем, полная компрометация конфиденциальности, целостности и доступности. GitHub Security Advisories оценила её в 8.7 (HIGH) по CVSS 4.0, указав LOW уровень привилегий.

Обнаруженная исследователями безопасности cristianstaicu, alexander-fenster и sofisl, уязвимость классифицирована как CWE-94 (недостаточный контроль генерации кода — 'Code Injection'). Отслеживается через GHSA-xq3m-2v4x-88gg.

Почему это важно: protobuf.js — фундаментальный компонент экосистемы npm. Это транзитивная зависимость клиентских библиотек Google Cloud, Firebase SDK, gRPC-web и тысяч других пакетов. Любое приложение, обрабатывающее .proto-файлы или JSON-дескрипторы из непроверенных источников, находится под прямым риском компрометации сервера.

Техническая причина

protobuf.js компилирует определения Protocol Buffers (.proto-файлы или JSON-дескрипторы) в JavaScript-код во время выполнения. Когда вы определяете тип сообщения, protobuf.js генерирует функции encode, decode и toObject, встраивая имена типов напрямую в строки генерируемого JavaScript.

Уязвимость поразительно проста в ретроспективе: имена типов подставлялись в генерируемый код без санитизации. Имя типа, содержащее символы вроде обратных кавычек, скобок или кавычек, может выйти за пределы строкового литерала и внедрить произвольный JavaScript в сгенерированную функцию.

// Упрощённо: как работает эксплойт
// protobufjs генерирует код примерно так:
function encode(message, writer) {
  // Имя типа подставляется напрямую:
  var TypeName = "` + АТАКУЕМЫЙ_КОД + `";
  // ...
}

// С вредоносным именем типа, содержащим:
// ` + process.mainModule.require('child_process').execSync('id') + `
// Сгенерированный код становится:
var TypeName = "` + process.mainModule.require('child_process').execSync('id') + `";
// JavaScript интерпретирует это как конкатенацию строк — команда выполняется!

Исправление: одна строка кода

Исправление (PR #2127) — это одна строка, добавленная в конструктор Type в src/type.js:

// До (уязвимо):
// Имена типов использовались как есть в генерируемом коде

// После (исправлено в 7.5.5 / 8.0.1):
name = name.replace(/\W/g, "");

Это регулярное выражение отфильтровывает все не-буквенно-цифровые символы из имён типов. Комментарий к коммиту объясняет: "Нет причин, по которым имя типа должно содержать что-либо кроме буквенно-цифровых символов. Отфильтровываем остальные символы с помощью регулярного выражения."

Вектор prototype pollution

Второе исправление (PR #2126) касалось связанного вектора атаки: загрязнения прототипа через конструктор Message. Когда объект свойств передавался в конструктор, __proto__ копировался как обычное свойство, позволяя атакующим загрязнять Object.prototype:

// Загрязнение прототипа через конструктор Message:
const properties = JSON.parse('{"__proto__": {"polluted": "yes"}}');
const message = new protobuf.Message(properties);
// message.__proto__.polluted === "yes"
// Object.prototype теперь загрязнён — влияет на все объекты!

// Исправление фильтрует __proto__ при переборе свойств:
// if (key === "__proto__") continue;

Цепочка атаки

Полная цепочка эксплуатации CVE-2026-41242 выглядит так:

  1. Вредоносные данные: Атакующий предоставляет .proto-файл или JSON-дескриптор с именами типов, содержащими JavaScript-инъекции
  2. Компиляция: protobuf.js компилирует определение, встраивая вредоносное имя типа без санитизации в генерируемый JavaScript-код
  3. Сгенерированная функция: Сгенерированная функция encode/decode содержит код атакующего в цепочке конкатенации строк
  4. Триггер: При вызове сгенерированной функции (encode, decode, toObject или verify) внедрённый JavaScript выполняется
  5. Полная компрометация: Атакующий получает возможность выполнять произвольный код в процессе Node.js, обычно развёртывая веб-шелл, похищая данные или закрепляясь в системе

Ключевой момент: Уязвимость находится в фазе генерации кода, а не в парсинге входных данных. Простая загрузка вредоносного .proto-файла достаточна для инъекции — вам не нужно кодировать или декодировать реальные сообщения. Инъекция происходит в момент компиляции определения protobuf.js в JavaScript.

Затронутые версии

Первоначальный CVE-2026-41242

Ветка Уязвимые Исправленные Дата
7.x <=7.5.4 7.5.5 17 апр 2026
8.x ==8.0.0 8.0.1 11 мар 2026

Полная цепочка уязвимостей (6 CVE)

Первоначальное исправление в 7.5.5 и 8.0.1 было неполным. В течение следующих двух месяцев разработчики раскрыли 5 дополнительных CVE — включая обходы внедрения кода, цепочки prototype pollution и уязвимости CLI:

CVE ID Тип CVSS Пакет Описание
CVE-2026-41242 RCE 9.8 protobufjs Внедрение кода через вредоносные имена типов в protobuf-определениях
CVE-2026-44293 RCE 7.7 protobufjs Внедрение кода через значения по умолчанию bytes-полей в toObject
CVE-2026-44291 RCE 8.1 protobufjs Гаджет генерации кода после загрязнения прототипа — подмена таблицы типов
CVE-2026-44295 RCE 8.7 protobufjs-cli Внедрение кода в статический вывод pbjs из изменённых имён схем
CVE-2026-54271 RCE 8.2 protobufjs-cli Обход CVE-2026-44295 — JSON-дескрипторы всё ещё создавали небезопасные ссылки
CVE-2026-54269 DoS 5.3 protobufjs Имена схем вроде `valueOf`, `rpcImpl` конфликтуют с runtime-помощниками

Реальное влияние

protobuf.js — один из самых используемых пакетов на npm с примерно 52 миллионами еженедельных загрузок. Он является транзитивной зависимостью:

Критический профиль риска относится к приложениям, загружающим protobuf-определения из непроверенных источников — например, сервис, принимающий загруженные пользователем .proto-файлы, или API-шлюз, обрабатывающий внешние JSON-дескрипторы. Даже если ваше приложение использует только жёстко заданные .proto-файлы, атака на цепочку поставок, изменяющая эти файлы, приведёт к компрометации сервера.

Руководство по исправлению

1. Немедленно обновите protobufjs

Обновитесь до последних безопасных версий:

# Проверьте текущую версию
npm ls protobufjs

# Обновитесь до последней безопасной версии
npm install protobufjs@latest

# Или укажите конкретную версию:
# Для пользователей 7.x (рекомендуется: сразу до последней)
npm install [email protected]

# Для пользователей 8.x
npm install [email protected]

2. Обновите protobufjs-cli (если используется)

# Если вы используете pbjs или pbts в сборке
npm install protobufjs-cli@latest
# Минимум: 1.3.2 (1.x) или 2.5.0 (2.x)
# Последняя: 2.5.4

3. Проверьте транзитивные зависимости

protobuf.js часто является транзитивной зависимостью. Проверьте, не закреплены ли какие-либо из ваших зависимостей на уязвимой версии:

# Найдите все версии protobufjs в дереве зависимостей
npm ls protobufjs

# Проверьте транзитивный protobufjs-cli
npm ls protobufjs-cli

# Принудительное разрешение, если транзитивная зависимость закреплена
npm install [email protected] --save-dev
# Или используйте overrides в package.json:
// "overrides": {
//   "protobufjs": "7.6.4"
// }

4. Подтвердите исправление

# Подтвердите версию
npm ls protobufjs
# Ожидается: 7.6.4 или 8.6.3 (или выше)

# Для protobufjs-cli
npm ls protobufjs-cli
# Ожидается: 2.5.4 или выше

Временные меры (если патч невозможен)

Если немедленное обновление невозможно (например, из-за ограничений совместимости):

⚠ Временные меры — не панацея

Эти меры снижают риск, но не устраняют его. Единственное полное решение — обновление до исправленной версии protobufjs. Атакующему нужен только один путь — забытый непропатченный сервис, забытая транзитивная зависимость или единственный .proto-файл из внешнего источника могут привести к полной компрометации.

Полная хронология

Дата Событие
7 мар 2026 Открыт PR #2126 — фильтр __proto__ в конструкторе Message
11 мар 2026 Открыт PR #2127 — санитизация имён типов (фильтр /\W/g); выпущена v8.0.1
15 апр 2026 Исправление перенесено в ветку 7.x (коммит ff7b2af)
17 апр 2026 Выпущена v7.5.5 — исправление CVE-2026-41242 для 7.x
27–28 апр 2026 Выпущены v7.5.6 и v8.0.2 — дополнительные исправления безопасности (CVE-2026-44291, CVE-2026-44293)
12 мая 2026 Опубликованы 5 уведомлений: CVE-2026-44291/293/295 + уведомления CLI
9–10 июн 2026 Выпущены v7.6.3 / v8.6.2 / v8.6.3 — исправление CVE-2026-54269 и исправления ошибок
13 июн 2026 Последние версии: v7.6.4, v8.6.3

Выводы для индустрии

Цепочка уязвимостей protobuf.js даёт несколько важных уроков:

FAQ

Что такое CVE-2026-41242?
CVE-2026-41242 — это критическая (CVSS 9.8) уязвимость внедрения кода в protobuf.js. Она позволяет атакующему выполнить произвольный JavaScript-код на сервере, передав вредоносное protobuf-определение с изменёнными именами типов. При компиляции определения unsanitized имена типов встраиваются напрямую в генерируемый код, что приводит к выполнению кода.
Какие версии protobuf.js затронуты?
Затронуты версии protobuf.js 7.x до 7.5.4 включительно и версия 8.0.0. Первоначальное исправление вышло в 7.5.5 (17 апреля) и 8.0.1 (11 марта). Из-за дополнительных CVE, обходящих первоначальное исправление, последние безопасные версии — 7.6.4 и 8.6.3 (июнь 2026).
Как работает эксплуатация protobuf.js?
Вредоносный JavaScript-код встраивается в имя типа protobuf. Когда protobuf.js компилирует определение, имя типа подставляется напрямую в генерируемый код без санитизации. Имя типа, содержащее символы вроде обратных кавычек или скобок, может выйти за пределы строкового контекста и выполнить произвольный код при вызове сгенерированной функции.
Какой CVSS-рейтинг у CVE-2026-41242?
NVD присваивает CVSS 3.1 — 9.8 (CRITICAL), вектор CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H. GitHub Security Advisories присваивает CVSS 4.0 — 8.7 (HIGH). Разница из-за того, что GitHub указывает LOW привилегии, а NVD — NONE.
Была ли также исправлена prototype pollution?
Да. PR #2126 добавил фильтр __proto__ в конструктор Message. До исправления передача JSON-объекта с ключом __proto__ загрязняла Object.prototype. Это использовалось в CVE-2026-44291 (гаджет генерации кода после загрязнения прототипа, CVSS 8.1), где загрязнённый прототип заставлял protobufjs разрешать атакуемые свойства как валидную информацию о типах.
Какие пакеты зависят от protobuf.js?
protobuf.js имеет примерно 52 миллиона еженедельных загрузок npm. Он используется Google Cloud, Firebase SDK, gRPC-web, TensorFlow.js, драйвером Apache Cassandra и тысячами других пакетов. Практически любое Node.js-приложение, взаимодействующее с облачными сервисами Google, содержит protobufjs как транзитивную зависимость.
Как исправить CVE-2026-41242?
Обновите protobufjs до >=7.5.6 (7.x) или >=8.0.2 (8.x). Последние версии — 7.6.4 и 8.6.3. Также обновите protobufjs-cli до >=1.3.2 (1.x) или >=2.5.0 (2.x). Запустите 'npm audit fix' или обновите package.json вручную. Проверьте дерево транзитивных зависимостей — не все уязвимые установки являются прямыми зависимостями.

Заключение

CVE-2026-41242 — один из самых значительных инцидентов безопасности цепочки поставок npm в 2026 году. Уязвимость внедрения кода с рейтингом CVSS 9.8 в protobuf.js — пакете с 52 миллионами еженедельных загрузок — демонстрирует, как одна несанитизированная интерполяция строк может скомпрометировать тысячи приложений.

Ситуация усугубилась цепочкой из 5 последующих CVE, обходящих первоначальное исправление, что подчёркивает важность комплексных проверок безопасности, а не минимальных патчей. Разработчики protobuf.js полностью устранили все известные векторы, и последние версии (7.6.4 и 8.6.3) безопасны.

Для разработчиков ключевой вывод очевиден: protobuf-определения, загружаемые из внешних источников — критическая поверхность атаки. Даже если вы используете только жёстко заданные .proto-файлы, ваш граф транзитивных зависимостей может быть уязвим. Запустите npm audit, проверьте дерево зависимостей и обновитесь до последних версий protobufjs сегодня.

Контакты

Нужна помощь с безопасностью вашего приложения?

Я создаю production-приложения с современными инструментами — React, Next.js, Node.js и TypeScript — где безопасность является ключевым приоритетом. Обсудим ваш проект.