
Researching on the vulnrability CVE-2023-26136
Исследование уязвимости CVE-2023-26136
Версии пакета tough-cookie до 4.1.3 уязвимы к Prototype Pollution из-за неправильной обработки Cookies при использовании CookieJar в режиме rejectPublicSuffixes=false. Эта проблема возникает из-за способа инициализации объектов.
https://nvd.nist.gov/vuln/detail/CVE-2023-26136
JavaScript имеет концепцию объектов, которые чем-то похожи на словари. Объект может содержать набор переменных разных типов (например, string, Boolean, int и т.д.), имя переменной — это ключ, а её значение — это значение, если продолжать аналогию со словарями и объектами. Точнее, объект аналогичен самой структуре данных словаря, а каждая переменная аналогична паре ключ-значение. У объектов также есть ключевое слово proto, которое позволяет добавлять дополнительные переменные в объект через изменение его прототипа. Prototype Pollution — это атака, при которой злоумышленник загрязняет свой объект, добавляя в него дополнительные переменные с помощью ключевого слова proto. Ниже приведено взаимодействие с консолью браузера, демонстрирующее атаку.
Как мы видим, у нас есть два пользователя: admin1 и user1. Объект admin1 имеет булеву переменную "isAdmin", установленную в true. У user1 этой переменной вообще нет. На строке 7 мы добавляем переменную isAdmin в прототип user1, и хотя из строки 10 видно, что переменная не была добавлена в сам объект user1, консоль положительно реагирует, когда мы проверяем значение user1.isAdmin. Это происходит потому, что user1 наследует свойства своего прототипа.
Также стоит упомянуть, что прототип сам по себе является объектом, который, в свою очередь, наследует свойства и методы от своего прототипа, создавая цепочку прототипов. Цепочка заканчивается нулевым прототипом, поэтому разумный подход для предотвращения prototype pollution — сделать так, чтобы объект, с которым мы работаем, явно наследовал от нулевого прототипа.
Cookies (часто называемые интернет-куки) — это текстовые файлы с небольшими фрагментами данных — как имя пользователя и пароль — которые используются для идентификации вашего компьютера при использовании сети. Определенные cookies используются для идентификации конкретных пользователей и улучшения их опыта веб-серфинга.
Предоставлено Kaspersky: https://www.kaspersky.com/resource-center/definitions/cookies
CookieJar — это объект для хранения cookies.
Согласно описанию уязвимости, она возникает из-за того, как Tough-Cookie инициализирует Cookies. Поскольку Cookies являются объектами, они, по крайней мере теоретически, уязвимы для Prototype Pollution.
Имея возможность вмешиваться в объекты и, в частности, в cookies через прототип объекта, злоумышленник потенциально может получить доступ к неавторизованным данным, выполнить удаленный код, вызвать отказ в обслуживании, перехватить сессию, если веб-сайт полагается на cookies для управления сессией, и извлечь конфиденциальные данные из самих cookies.
Патч был сделан в файле: memstore.js. Согласно отслеживанию проблемы, а также патчу, представленному в версии 4.1.3, для исправления уязвимости необходимо хранить cookies в карте или создать объект this.idx. Создавая this.idx с помощью: this.idx = Object.create(null); вместо this.idx = {}, мы применяем мое предложение по предотвращению Prototype Pollution из введения, наследуя от нулевого прототипа и обрывая цепочку прототипов.
Snyk опубликовал Proof of Concept (PoC) для обсуждаемой уязвимости. Я построил index.js на его основе. Обернул его в логику try-catch для перехвата исключений, если они возникают, добавил дополнительный вывод для отслеживания прогресса тестов и получил требуемый вывод (например, "EXPLOITED SUCCESSFULLY" или "EXPLOITED FAILED"). При выполнении команды: npm install [email protected] && node index.js Мы получаем следующий вывод:
При выполнении команды: npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js Мы получаем следующий вывод:
В обоих сценариях (запуск с опубликованной версией 2.5.0 и запуск с моей исправленной версией) нам удалось установить как обычный cookie, так и эксплуатируемый cookie, но в исправленной версии нам не удалось получить доступ к эксплуатируемому cookie.
В ходе этого задания я узнал об атаке Prototype Pollution, изучил объекты JavaScript и познакомился с пакетом Tough-Cookie.