CyberGlossary

Уязвимости

Загрязнение прототипа

Также известно как: Загрязнение Object.prototype, Инъекция __proto__

Определение

JavaScript-уязвимость, при которой недоверенный ввод изменяет Object.prototype, добавляя свойства всем объектам и меняя поведение приложения вплоть до RCE.

Загрязнение прототипа эксплуатирует цепочку прототипов JavaScript: при установке ключей __proto__, constructor.prototype или prototype в операциях merge/clone/assign атакующий мутирует Object.prototype, и все обычные объекты наследуют эти свойства. Чаще всего проблема встречается в рекурсивных утилитах слияния, deep clone, парсерах query string и шаблонизаторах, принимающих пользовательский JSON. Последствия — от DoS и обхода аутентификации до RCE, если «отравленные» свойства влияют на проверки безопасности (isAdmin, sandbox, опции рендеринга). Значимые CVE: lodash CVE-2019-10744 и многие пакеты Node.js. Защита: отклонять ключи __proto__/constructor, использовать Map или Object.create(null) для недоверенных данных, замораживать прототип, выбирать безопасные библиотеки.

Примеры

  • POST {"__proto__":{"isAdmin":true}} на эндпоинт JSON-merge — и пользователь становится админом везде.
  • Загрязнение прототипа меняет опции рендеринга шаблонов и приводит к RCE.

Связанные термины