
Доказательство концепции для CVE-2021-44906, демонстрирующее прототипное загрязнение в minimist через обход Function.prototype, с рабочими примерами и подробным техническим анализом цепочки эксплуатации.
Оригинал: https://github.com/Marynk/JavaScript-vulnerability-detection/blob/main/minimist%20PoC.zip
npm run hack
И вы увидите, что свойство done любой функции изменится на true.
Пояснение команды node index.js --_.concat.constructor.prototype.done true:
-- — это дефис, обычно используемый в аргументах командной строки._ — встроенный ключ в minimist: https://github.com/minimistjs/minimist/blob/v1.2.5/index.js#L37.concat.constructor.prototype.done true устанавливает _.concat.constructor.prototype.done в true.
Поскольку _.concat.constructor имеет тип Function, ко всем прототипам Function будет добавлено свойство с именем done.Причина такой длинной цепочки прототипов в том, что в предыдущих исправлениях разработчик заблокировал __proto__, Arrary.prototype, Object.prototype, Number.prototype и String.prototype. Поэтому мы вынуждены использовать constructor, у которого есть свойство prototype и который не находится в чёрном списке.
Другой пример:
npm run hack2
Однако в обоих примерах мы можем изменять только значения, а не определения функций.
В исправлении CVE-2020-7598 (1.2.2) и в версии 1.2.3 разработчик уже устранил некоторые уязвимости, проверяя __proto__, Arrary.prototype, Object.prototype, Number.prototype, String.prototype,
но забыл проверить Function.prototye. Именно поэтому данная эксплуатация может затронуть только свойство Function.
В исправлении этой CVE разработчик добавил проверку Function.prototype, а также constructor: https://github.com/minimistjs/minimist/blob/v1.2.6/index.js#L73