flawopen.com/XSS/Upload de SVG
Upload de SVG pode causar XSS?
Um SVG enviado é um documento, não apenas pixels: pode conter elementos ativos, como scripts e manipuladores de eventos. A execução depende de como o navegador recebe o arquivo. SVG em <img> fica em um contexto de imagem restrito; SVG inline, navegação direta ou incorporação como documento podem ser ativos.
O que diferencia SVG de outros formatos de imagem
Diferentemente de PNG ou JPEG, SVG é XML e pode conter conteúdo ativo. Navegadores desativam scripts em contextos restritos de imagem, como <img>, mas essa restrição não se aplica quando o SVG é aberto diretamente, incorporado como documento via <object>, <iframe> ou <embed>, nem quando sua marcação é inserida inline. Uma imagem de perfil enviada pode virar stored XSS se a aplicação a servir em contexto ativo na origem da aplicação. O comportamento depende do contexto; extensão e MIME não são sanitização.
Como proteger uploads
- ✓Use um sanitizador SVG mantido e com allowlist explícita antes de armazenar ou exibir. Remova elementos executáveis, event handlers, referências externas e
foreignObjectse não forem necessários; não use expressões regulares para sanitizar XML. - ✓Se o usuário só precisa da imagem, rasterize o SVG em processo isolado com limites de recursos e sirva o raster. Mantenha o original fora da raiz web se não for necessário.
- ✓Sirva uploads em domínio registrável separado, sem cookies da aplicação. Um subdomínio irmão ainda pode receber cookies definidos para o domínio pai.
- ✓Para SVG não confiável que ainda precise ser documento, force download com Content-Disposition: attachment e
X-Content-Type-Options: nosniff, ou use apenas um contexto de imagem restrito como <img>. Evite inline, <object>, <iframe> e servir como documento na mesma origem.
Perguntas frequentes
['Validar extensão ou MIME do arquivo resolve o problema?', 'Não. Extensão e MIME declarado são metadados, não análise do conteúdo ativo do documento. Verifique o formato real e depois use uma allowlist de sanitização compatível com SVG ou converta para raster se os recursos SVG não forem necessários.']
Referências
- OWASP XML Security Cheat Sheet
- flawopen.com — Cross-Site Scripting
- OWASP — File Upload Cheat Sheet
- OWASP ASVS — sanitizing or sandboxing SVG scriptable content