В начале 2019 года исследователи безопасности в Snyk раскрыли подробности серьезной уязвимости в Lodash, популярной библиотеке JavaScript, которая позволяла хакерам атаковать несколько веб-приложений.
Дыра в безопасности представляла собой Prototype pollution - тип уязвимости, который позволяет злоумышленникам использовать правила JavaScript и различными способами компрометировать приложения.
Что такое Prototype pollution?
JavaScript основан на прототипах: когда создаются новые объекты, они переносят свойства и методы прототипа «object», который содержит основные функции, такие как:
Наследование на основе объектов придает JavaScript гибкость и эффективность, которые полюбились веб-программистам, но также делает его уязвимым для подделки.
Вредоносные субъекты могут вносить изменения во все объекты в масштабе всего приложения, изменяя объект, отсюда и название Prototype pollution (Загрязнение прототипа)
Интересно, что злоумышленникам даже не нужно напрямую изменять объект - они могут получить к нему доступ через свойство
Вот простой пример того, как работает прототип загрязнения. Следующий код изменяет значение функции toString в прототипе на произвольный, вредоносный код:
Теперь каждый раз, когда вызывается функция
Вот что говорит исследователь безопасности Мохаммед Алдуб для The Daily Swig:
Каково воздействие загрязнения прототипа?
Воздействие загрязнения прототипа зависит от приложения. Короче говоря, каждый раз, когда JavaScript код обращается к свойству, которого не существует в объекте (включая проверку существования свойства), мы можем изменить результат проверки с помощью загрязнения прототипа. В зависимости от логики приложения загрязнение прототипа может привести практически ко всем популярным веб-уязвимостям: удаленному выполнению кода (RCE), межсайтовому скриптингу (XSS), SQL-инъекции и так далее.
Эксплуатация загрязнения прототипа на стороне клиенто в настоящее время недостаточно хорошо изучена и освящена, в то время как на стороне сервера prototype pollution более известен.
Воздействие загрязнения прототипа на серверную часть - по крайней мере, отказ в обслуживании, вызывающий сбой сервера Node.js. Однако он определенно может быть связан с другими уязвимостями, такими как удаленное выполнение кода.
В прошлом году Бентковски обнаружил прототип ошибки загрязнения в Kibana, библиотеке визуализации данных, которая позволила реверс шелл и достичь RCE.
Затем, в июле, Posix сообщил о том же типе уязвимости в популярной библиотеке express-fileupload, которая могла позволить хакеру получить удаленный доступ к серверу Node.js.
В том же месяце исследователь безопасности Франческо Сончина обнаружил прототип уязвимости к загрязнению в библиотеке JavaScript для отображения объектов TypeORM, которая позволила хакерам проводить атаки с использованием SQL-инъекций на приложения Node.js.
Как защититься от атак прототипа загрязнения.
Как и многие другие уязвимости, злоумышленники используют прототипы загрязнения путем ввода данных пользователем в веб-приложения и отправки своего вредоносного кода в текстовых полях, заголовках и файлах.
Другая проблема - это способ написания многих приложений на JavaScript. «Шаблон кодирования (синтаксиса), который приводит к загрязнению прототипа, чрезвычайно распространен в коде JavaScript», - отмечает Бентковски.
Например, многие библиотеки JavaScript принимают объект параметров и проверяют объект на наличие определенных свойств. В случае, если какое-то свойство отсутствует, по умолчанию используется какой-то предопределенный параметр:
В этом случае злоумышленники могут использовать загрязнение прототипа, чтобы переопределить someOption и изменять логику приложения.
Один из популярных способов защиты - создание блок-листов, в которых разработчики удаляют опасные поля из входных строк.
Например, с помощью вышеупомянутой уязвимости Lodash разработчики сначала проверяли строки по полю __proto__, но затем поняли, что конструктор также является потенциальной целью загрязнения прототипа.
Другой важный шаг - проверка зависимостей модулей потенциальных прототипов загрязнения, что создает новые проблемы. С точки зрения разработчика, очень сложно проверить все используемые модули, поэтому перед использованием необходимо убедиться, что модуль полностью безопасен.
Недооцененный баг.
Сообществу необходимо изучить и практиковать этот тип уязвимости более глубоко и с большим вниманием, поскольку он все еще неизучен до конца и опасен. Загрязнение прототипов может серьезно повлиять на безопасность веб-приложений, но существует не так много источников, которые демонстрируют реальные случаи его использования.
Перевод: V1rtualGh0st. Специально для: xss.pro | Оригинальная статья
Дыра в безопасности представляла собой Prototype pollution - тип уязвимости, который позволяет злоумышленникам использовать правила JavaScript и различными способами компрометировать приложения.
Что такое Prototype pollution?
JavaScript основан на прототипах: когда создаются новые объекты, они переносят свойства и методы прототипа «object», который содержит основные функции, такие как:
toString, constructor и hasOwnPropertyНаследование на основе объектов придает JavaScript гибкость и эффективность, которые полюбились веб-программистам, но также делает его уязвимым для подделки.
Вредоносные субъекты могут вносить изменения во все объекты в масштабе всего приложения, изменяя объект, отсюда и название Prototype pollution (Загрязнение прототипа)
Интересно, что злоумышленникам даже не нужно напрямую изменять объект - они могут получить к нему доступ через свойство
‘__proto__’ любого объекта JavaScript. И как только вы вносите изменение в объект, оно применяется ко всем объектам JS в работающем приложении, включая те, которые созданы после подделки!Вот простой пример того, как работает прототип загрязнения. Следующий код изменяет значение функции toString в прототипе на произвольный, вредоносный код:
JavaScript:
let customer = {name: "person", address: "here"}
console.log(customer.toString())
//output: "[object Object]"
customer.__proto__.toString = ()=>{alert("polluted")}
console.log(customer.toString())
// alert box pops up: "polluted"
Теперь каждый раз, когда вызывается функция
toString(), всплывает окно предупреждения с сообщением «polluted» (если объект явно не переопределяет Object.toString () своей собственной реализацией). Поскольку toString широко используется в клиентском JavaScript, это приведет к нарушению работы приложения.Вот что говорит исследователь безопасности Мохаммед Алдуб для The Daily Swig:
«Загрязнение прототипа не является полностью уникальным типом уязвимости, поскольку это, в большей или меньшей степени, разновидность атаки путем инъекции объекта»
«Однако его особенность заключается в том, что это определенно не один из самых распространённых типов уязвимостей, о которых знает большинство людей.
И не популярен он, потому что в основном нацелен на определенные языки/фреймворки и он не так хорошо документирован, как другие. Однако он не менее опасен, чем другие «основные» уязвимости ».
Каково воздействие загрязнения прототипа?
Воздействие загрязнения прототипа зависит от приложения. Короче говоря, каждый раз, когда JavaScript код обращается к свойству, которого не существует в объекте (включая проверку существования свойства), мы можем изменить результат проверки с помощью загрязнения прототипа. В зависимости от логики приложения загрязнение прототипа может привести практически ко всем популярным веб-уязвимостям: удаленному выполнению кода (RCE), межсайтовому скриптингу (XSS), SQL-инъекции и так далее.
Эксплуатация загрязнения прототипа на стороне клиенто в настоящее время недостаточно хорошо изучена и освящена, в то время как на стороне сервера prototype pollution более известен.
Воздействие загрязнения прототипа на серверную часть - по крайней мере, отказ в обслуживании, вызывающий сбой сервера Node.js. Однако он определенно может быть связан с другими уязвимостями, такими как удаленное выполнение кода.
В прошлом году Бентковски обнаружил прототип ошибки загрязнения в Kibana, библиотеке визуализации данных, которая позволила реверс шелл и достичь RCE.
Затем, в июле, Posix сообщил о том же типе уязвимости в популярной библиотеке express-fileupload, которая могла позволить хакеру получить удаленный доступ к серверу Node.js.
В том же месяце исследователь безопасности Франческо Сончина обнаружил прототип уязвимости к загрязнению в библиотеке JavaScript для отображения объектов TypeORM, которая позволила хакерам проводить атаки с использованием SQL-инъекций на приложения Node.js.
Как защититься от атак прототипа загрязнения.
Как и многие другие уязвимости, злоумышленники используют прототипы загрязнения путем ввода данных пользователем в веб-приложения и отправки своего вредоносного кода в текстовых полях, заголовках и файлах.
Другая проблема - это способ написания многих приложений на JavaScript. «Шаблон кодирования (синтаксиса), который приводит к загрязнению прототипа, чрезвычайно распространен в коде JavaScript», - отмечает Бентковски.
Например, многие библиотеки JavaScript принимают объект параметров и проверяют объект на наличие определенных свойств. В случае, если какое-то свойство отсутствует, по умолчанию используется какой-то предопределенный параметр:
JavaScript:
options.someOption = options.someOption || default.someOption;
В этом случае злоумышленники могут использовать загрязнение прототипа, чтобы переопределить someOption и изменять логику приложения.
Один из популярных способов защиты - создание блок-листов, в которых разработчики удаляют опасные поля из входных строк.
Например, с помощью вышеупомянутой уязвимости Lodash разработчики сначала проверяли строки по полю __proto__, но затем поняли, что конструктор также является потенциальной целью загрязнения прототипа.
Другой важный шаг - проверка зависимостей модулей потенциальных прототипов загрязнения, что создает новые проблемы. С точки зрения разработчика, очень сложно проверить все используемые модули, поэтому перед использованием необходимо убедиться, что модуль полностью безопасен.
Недооцененный баг.
Сообществу необходимо изучить и практиковать этот тип уязвимости более глубоко и с большим вниманием, поскольку он все еще неизучен до конца и опасен. Загрязнение прототипов может серьезно повлиять на безопасность веб-приложений, но существует не так много источников, которые демонстрируют реальные случаи его использования.
Перевод: V1rtualGh0st. Специально для: xss.pro | Оригинальная статья