
Этот репозиторий содержит решение для уязвимости CVE-2023-26136.
Версии пакета tough-cookie до 4.1.3 уязвимы к Prototype Pollution из-за некорректной обработки cookie при использовании CookieJar в режиме rejectPublicSuffixes=false. Проблема возникает из-за способа инициализации объектов.
Этот проект направлен на предоставление пропатченной версии [email protected], которая устраняет уязвимость CVE-2023-26136, сохраняя при этом обратную совместимость.
Для исправления уязвимости мы изменили memstore.js, чтобы cookie хранились в объекте без риска загрязнения прототипа, заменив стандартную инициализацию объекта на Object.create(null). Это предотвращает манипуляцию прототипом через вредоносные имена cookie.
В каталоге tough-cookie/ можно найти две дополнительные директории, содержащие оригинальную и пропатченную версии tough-cookie:
Original v2.5.0/) – Немодифицированный tough-cookie 2.5.0, который уязвим.v2.5.0-PATCHED/) – Модифицированная версия, включающая исправление для CVE-2023-26136.Для установки оригинальной уязвимой версии:
npm install [email protected]
Применённый патч изменяет способ хранения cookie: this.idx = {};
было изменено на: this.idx = Object.create(null);
Это предотвращает внедрение атакующим свойств в цепочку прототипов и эксплуатацию уязвимости.
Уязвимость в tough-cookie (CVE-2023-26136) возникает из-за использования обычного JavaScript-объекта {} для хранения cookie. Поскольку {} наследуется от Object.prototype, его можно эксплуатировать, внедряя свойства типа proto, что приводит к загрязнению прототипа. Это может позволить атакующему манипулировать поведением приложения или вызывать проблемы безопасности.
Чтобы смягчить эту проблему, патч заменяет {} на Object.create(null), который создаёт объект без прототипа ([[Prototype]]: null). Это гарантирует, что объект не наследует никаких свойств от Object.prototype, предотвращая внедрение вредоносных свойств атакующим.
Используя Object.create(null), мы эффективно изолируем хранилище cookie от непреднамеренного наследования прототипа, делая его более безопасным против атак типа prototype pollution.
Чтобы установить пропатченную версию локально, выполните следующие шаги:
tar -tzf tough-cookie-2.5.0.tgz
При необходимости извлеките его:
tar -xzf tough-cookie-2.5.0.tgz
npm install ./tough-cookie-2.5.0.tgz
node index.js
Ожидаемый вывод:
EXPLOITED SUCCESSFULLY - для оригинальной версии
EXPLOIT FAILED - для пропатченной версии
Пропатченная версия была протестирована на Node.js 20 (LTS) для обеспечения совместимости с последней стабильной средой выполнения.
Оригинальный репозиторий tough-cookie (Salesforce) в настоящее время находится на версии 5.1.1. Поскольку мы работаем с версией 2.5.0, прямой форк из основного репозитория невозможен. Вместо этого мы создали отдельный репозиторий, содержащий как оригинальную, так и пропатченную версии. Вы можете найти его здесь:
GitHub Repository - Forked Version
Для получения дополнительных сведений посетите официальную страницу CVE: CVE-2023-26136 - NVD