Критическая уязвимость внедрения кода в protobuf.js позволяет атакующим выполнять произвольный код на Node.js-серверах через вредоносные protobuf-определения. 52 миллиона еженедельных загрузок npm и цепочка из 5 дополнительных CVE делают этот инцидент одним из самых значительных в области безопасности npm в 2026 году.
Если ваше приложение использует protobufjs версии 7.5.4 или ниже, либо 8.0.0, ваш сервер уязвим для удалённого выполнения кода через вредоносные protobuf-определения. Немедленно обновитесь до 7.5.6+ / 8.0.2+. Наибольшему риску подвержены приложения, загружающие .proto-файлы или JSON-дескрипторы из внешних источников.
name.replace(/\W/g, "")) + фильтр __proto__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, "");
Это регулярное выражение отфильтровывает все не-буквенно-цифровые символы из имён типов. Комментарий к коммиту объясняет: "Нет причин, по которым имя типа должно содержать что-либо кроме буквенно-цифровых символов. Отфильтровываем остальные символы с помощью регулярного выражения."
Второе исправление (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 выглядит так:
Ключевой момент: Уязвимость находится в фазе генерации кода, а не в парсинге входных данных. Простая загрузка вредоносного .proto-файла достаточна для инъекции — вам не нужно кодировать или декодировать реальные сообщения. Инъекция происходит в момент компиляции определения protobuf.js в JavaScript.
| Ветка | Уязвимые | Исправленные | Дата |
|---|---|---|---|
| 7.x | <=7.5.4 |
7.5.5 |
17 апр 2026 |
| 8.x | ==8.0.0 |
8.0.1 |
11 мар 2026 |
Первоначальное исправление в 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-файлы, атака на цепочку поставок, изменяющая эти файлы, приведёт к компрометации сервера.
Обновитесь до последних безопасных версий:
# Проверьте текущую версию
npm ls protobufjs
# Обновитесь до последней безопасной версии
npm install protobufjs@latest
# Или укажите конкретную версию:
# Для пользователей 7.x (рекомендуется: сразу до последней)
npm install [email protected]
# Для пользователей 8.x
npm install [email protected]
# Если вы используете pbjs или pbts в сборке
npm install protobufjs-cli@latest
# Минимум: 1.3.2 (1.x) или 2.5.0 (2.x)
# Последняя: 2.5.4
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"
// }
# Подтвердите версию
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 даёт несколько важных уроков:
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 — где безопасность является ключевым приоритетом. Обсудим ваш проект.