FlawOpen

flawopen.com/Загрязнение прототипа/lodash.merge()

Защищён ли lodash.merge() от загрязнения прототипа?

CWE-1321: Prototype PollutionСправочное руководство
Short answer

Представьте глубокое слияние как копирование ярлыков из чужого картотечного шкафа в основные записи приложения. В старых версиях некоторые пути Lodash могли воспринимать особые имена свойств как инструкции для доступа к общему состоянию прототипов. Новые исправления блокируют известные пути, но копирование всех полей запроса всё ещё создаёт риск массового присваивания. Проверяйте допустимые поля.

УЯЗВИМЫЕ — затронутые версии Lodash
const _ = require("lodash");

const settings = {};
const input = request.body;

_.merge(settings, input);
_.set(settings, request.query.path, request.query.value);
ЗАЩИТА — обновить и собрать известную структуру
const allowedLocales = new Set(["en", "fr"]);
const input = request.body;

const settings = {
  theme: input.theme === "dark" ? "dark" : "light",
  locale: allowedLocales.has(input.locale)
    ? input.locale
    : "en",
};

Как проходит путь уязвимости

В затронутой версии недоверенный JSON или управляемый вызывающей стороной путь достигает уязвимой функции Lodash. Рекурсивное слияние или операция с путём неверно обрабатывает специальный компонент и изменяет либо удаляет свойство встроенного прототипа. Другой код может затем прочитать это унаследованное свойство; эффект зависит от свойства и доступного в приложении gadget. Само загрязнение прототипа не доказывает удалённое выполнение кода.

У advisories для npm-пакета lodash разные области: CVE-2018-16487 затрагивал defaultsDeep, merge и mergeWith до 4.17.11; CVE-2019-10744 — defaultsDeep до 4.17.12; CVE-2020-8203 — pick, set, setWith, update, updateWith и zipObjectDeep до 4.17.19. CVE-2025-13465 затрагивал unset и omit вплоть до 4.17.22; исправлено в 4.17.23. Затем CVE-2026-2950 затронул эти методы в 4.17.23; исправлено в 4.18.0. Последняя версия, проверенная для этого руководства, — 4.18.1. Эти диапазоны зависят от пакета: отдельно проверяйте advisories для lodash-es, модульных пакетов и сборок ОС.

Как проверить и исправить зависимость

npm install lodash@^4.18.1 npm ls lodash npm audit npm explain lodash

Обновите прямые и транзитивные копии, сохраните обновлённый lockfile и проверьте vendored- или bundle-копии. Не передавайте данные запроса напрямую в глубокое слияние или API путей; создавайте объект из проверенных разрешённых полей. Пример исключает ключи и пути под контролем атакующего. По состоянию на 2026-10-05 последняя версия Lodash — 4.18.1; следите за новыми advisory.

Вопросы и ответы

Безопасен ли lodash.merge() в последней версии?

В просмотренных advisories npm-пакета lodash указаны соответствующие исправления в последующих версиях; здесь последней проверена 4.18.1. Обновляйте её, проверяйте все установленные копии и не сливайте тело запроса целиком — это может привести к массовому присваиванию.

Всегда ли загрязнение прототипа приводит к удалённому выполнению кода?

Нет. Оно изменяет или удаляет унаследованные свойства. Последствия зависят от того, что приложение затем читает или вызывает, и есть ли доступный gadget. Описывайте подтверждённый эффект, не предполагая RCE.

Для lodash-es и пакетов lodash.* действуют те же диапазоны версий?

Не обязательно. В advisories могут быть разные затронутые и исправленные версии для каждого пакета. Проверяйте точное имя пакета, lockfile и advisory, не перенося диапазон lodash на другие сборки.

Источники

См. также Загрязнение прототипа JavaScript: причины и защита Object.assign() и Prototype Pollution: что безопасно? Вызывает ли JSON.parse() загрязнение прототипа? JSON.parse() безопаснее, чем eval()?