Логотип
Главная | Статьи | Prototype Pollution в Node.js: от теории до RCE
Prototype Pollution в Node.js: от теории до RCE

Prototype Pollution в Node.js: от теории до RCE

15 января, 2026

19

Prototype Pollution – это одна из самых недооцененных, но смертельно опасных уязвимостей в JavaScript-экосистеме. Она позволяет модифицировать базовые прототипы объектов и в итоге получить Remote Code Execution на сервере. В 2026 году это всё ещё актуально, потому что тонны npm-пакетов до сих пор содержат уязвимый код.

Теория: как устроены прототипы в JavaScript

JavaScript использует прототипное наследование. Каждый объект имеет ссылку на свой прототип через свойство __proto__, которое ведёт к Object.prototype – корню всех объектов.

Проблема в том, что если атакующий может контролировать свойства объекта, он может добраться до __proto__ и отравить глобальный прототип.

Как возникает уязвимость: merge и recursive assignment

Уязвимость появляется в функциях, которые рекурсивно копируют свойства объектов без проверки ключей.

Уязвимый код: классический merge

Уязвимый код: lodash set/merge (старые версии)

От Pollution до RCE: ищем Gadget Chains

Prototype Pollution сама по себе не даёт RCE. Нужно найти “gadget” – участок кода, который использует отравленное свойство для выполнения опасных операций.

Gadget #1: child_process.spawn через options

Эксплойт для spawn gadget

Gadget #2: EJS template rendering

Эксплойт для EJS gadget

Gadget #3: VM2 escape (до версии 3.9.11)

Автоматический поиск Prototype Pollution

Сканер на Node.js

Python-чекер с gadget detection

Реальные примеры из npm-пакетов

CVE-2020-8203: lodash < 4.17.19

CVE-2021-23337: @hapi/hoek < 9.1.1

CVE-2022-21704: express-fileupload < 1.2.1

Автоматизация через Nuclei templates

Продвинутая эксплуатация: AST Injection

Массовое сканирование GitHub репозиториев

Защита: как предотвратить Prototype Pollution

Безопасная функция merge

Object.freeze для критичных прототипов

Использование Map вместо обычных объектов

Prototype Pollution – это мощное оружие в руках профи. В 2026 году половина Node.js-приложений до сих пор уязвима из-за legacy npm-пакетов. Находи уязвимости, строй gadget chains, получай RCE. А если ты на стороне защиты – используй безопасные паттерны и замораживай прототипы. Удачной охоты! 🔥💀