
Патч для tough-cookie v2.5.0, исправляющий уязвимость прототипного загрязнения CVE-2023-26136 с помощью Object.create(null) в MemoryCookieStore, включая демонстрацию эксплойта и модульные тесты.
Этот репозиторий содержит пропатченную версию пакета tough-cookie версии 2.5.0, предназначенную для устранения критической уязвимости Prototype Pollution (CVE-2023-26136). Уязвимость позволяет злоумышленникам манипулировать цепочкой прототипов, внедряя свойства в объекты JavaScript. Это может привести к непредвиденному поведению, угрозам безопасности, таким как удалённое выполнение кода, а также к проблемам совместимости в приложениях, использующих этот пакет.
Версии пакета tough-cookie до v4.1.3 уязвимы к Prototype Pollution при использовании CookieJar с режимом rejectPublicSuffixes=false. Уязвимость возникает из-за некорректной обработки cookie-файлов, в частности когда cookie.domain установлен в __proto__. Это позволяет злоумышленникам изменять базовый объект , что может вызвать масштабные проблемы во всём приложении.
Object.prototypeБолее подробную информацию о CVE-2023-26136 можно найти здесь:
Загрязнение прототипа может привести к нескольким критическим рискам, в том числе:
Уязвимости безопасности: изменяя базовый Object.prototype, злоумышленники могут манипулировать поведением объектов, потенциально повышая привилегии, получая доступ к конфиденциальным данным или обходя механизмы безопасности приложения.
Отказ в обслуживании (DoS): загрязнение цепочки прототипов может вызвать непредвиденное поведение системы, приводящее к сбоям, бесконечным циклам или исчерпанию ресурсов, что делает приложение недоступным для легитимных пользователей.
Проблемы совместимости: изменение Object.prototype может вызывать ошибки и непредвиденное поведение при взаимодействии с другими библиотеками или фреймворками. Зависимости, которые полагаются на цепочки прототипов, могут выходить из строя, что приводит к проблемам интеграции или некорректному поведению приложения при обновлениях.
Непредвиденное поведение приложения: загрязнение прототипа может приводить к нестабильной работе программы, включая повреждение данных, нарушения безопасности и потенциально делая приложение уязвимым для дальнейших эксплойтов.
Патч заключается в модификации класса MemoryCookieStore, в частности метода putCookie, для предотвращения загрязнения прототипа за счёт создания объектов без прототипа. Основные изменения включают:
Object.create(null) вместо {} для создания объектов без прототипа.cookie.domain = __proto__.Чтобы установить пропатченную версию tough-cookie, выполните следующую команду:
npm install ./tough-cookie-2.5.0-PATCHED.tgz
Этот репозиторий включает модульный тест, предназначенный для проверки того, что уязвимость Prototype Pollution успешно устранена.
Тест с именем prototype_pollution_test специально проверяет, что установка cookie-файлов с доменом __proto__ больше не влияет на цепочку прототипов JavaScript. Это гарантирует предотвращение загрязнения прототипа и сохранение целостности приложения.
Чтобы запустить тесты и подтвердить исправление, выполните следующую команду:
npm test
Чтобы продемонстрировать эксплойт как в оригинальной, так и в пропатченной версии, выполните следующие шаги:
Установите уязвимую версию tough-cookie:
npm install [email protected] && node index.js
Ожидаемый вывод:
Polluted object: {
Slonser: Cookie="Slonser=polluted; Domain=__proto__; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms",
Auth: Cookie="Auth=Lol; Domain=google.com; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms"
} EXPLOITED SUCCESSFULLY
Это указывает на то, что прототип объекта был загрязнён, что подтверждает наличие уязвимости в оригинальной версии.
npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js
Ожидаемый вывод:
EXPLOIT FAILED
Это показывает, что эксплойт был успешно заблокирован, что подтверждает устранение уязвимости Prototype Pollution.
Процесс устранения уязвимости Prototype Pollution в tough-cookie v2.5.0 включал несколько методичных шагов, чтобы гарантировать полноту и эффективность исправления. Ниже представлен обзор подхода, которого я придерживался:
Я начал с изучения Prototype Pollution (CVE-2023-26136), чтобы понять его влияние. Уязвимость позволяет злоумышленникам внедрять свойства в цепочку прототипов через свойство cookie.domain, что потенциально создаёт угрозы безопасности, такие как удалённое выполнение кода.
Я изучил вопросы и обсуждения на GitHub, касающиеся этой уязвимости, включая исправление в tough-cookie v4.1.3, в котором используется Object.create(null) для предотвращения загрязнения прототипа. Это помогло мне определить изменения, необходимые для исправления v2.5.0.
Я сравнил v2.5.0 с v4.1.3, чтобы понять различия и выявить необходимые изменения. Ключевая модификация заключалась в использовании объектов без прототипа для предотвращения эксплуатации.
Я обновил класс MemoryCookieStore, чтобы использовать Object.create(null) вместо {}, гарантируя отсутствие загрязнения прототипа.
Я написал модульные тесты для проверки исправления и создал демонстрационный скрипт эксплойта (index.js), показывающий, как уязвимость предотвращается в пропатченной версии.
В завершение я задокументировал исправление, включая инструкции по установке и тестированию, и упаковал пропатченную версию (tough-cookie-2.5.0-PATCHED.tgz) для удобного распространения.
Добавленные/изменённые файлы относительно v2.5.0
index.js: основной скрипт для демонстрации уязвимости и исправления.lib/memstore.js: модифицированный класс MemoryCookieStore для предотвращения загрязнения прототипа.test/ietf_data/parser.json: обновлён для исправления устаревших дат в тестовых данных.test/prototype_pollution_test.js: модульные тесты для проверки того, что загрязнение прототипа устранено.tough-cookie-2.5.0-PATCHED.tgz: пропатченная версия пакета tough-cookie.