FlawOpen

flawopen.com/XSS/Content-type sniffing

XSS por MIME sniffing: como a confusão de MIME chega ao navegador

Página de referência
Resposta curta

O navegador usa o Content-Type da resposta para decidir como tratar os bytes. Se um app servir arquivos controlados por usuários com tipos ausentes ou incorretos, o MIME sniffing pode fazer algumas respostas se comportarem de modo inesperado. Envie o tipo correto e X-Content-Type-Options: nosniff e isole uploads da origem do app. O cabeçalho reduz um risco de interpretação do navegador; não sanitiza arquivos nem substitui controles de upload.

Como um upload pode atravessar a fronteira de documento

Imagine um app que aceita uploads e depois os serve na própria origem autenticada com Content-Type ausente ou incompatível. Se o navegador interpretar a resposta como documento HTML, a marcação do arquivo poderá se tornar ativa na origem do site. Isso cria risco de XSS armazenado ou confusão de conteúdo quando alguém abre o arquivo. A extensão e o tipo declarado na requisição de upload não comprovam o formato dos bytes.

Defina o tipo deliberadamente e isole downloads

ARRISCADO — upload servido inline com cabeçalhos ambíguos
HTTP/1.1 200 OK
Content-Type: application/octet-stream
// sem X-Content-Type-Options
// mesma origem do app autenticado
MAIS SEGURO — tipo correto, nosniff e download isolado
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Content-Disposition: attachment; filename="download.txt"

Use um Content-Type escolhido pelo servidor e compatível com os bytes; não copie o tipo declarado pelo remetente. X-Content-Type-Options: nosniff desativa o MIME sniffing em respostas de documento e bloqueia requisições de script ou stylesheet com tipo MIME incorreto. Não é uma correção universal de XSS: mantenha uploads em outra origem, prefira Content-Disposition: attachment para downloads e aplique regras de tamanho, autorização e validação de arquivos. Para imagens ou mídia inline, retorne o tipo verificado e teste a resposta real no navegador.

Perguntas frequentes

nosniff torna seguro servir qualquer upload?

Não. Ele controla a interpretação MIME do navegador e a validação de scripts/stylesheets, mas não valida nem sanitiza arquivos, não corrige um Content-Type incorreto e não isola um upload na mesma origem. Use outra origem e downloads como anexos para arquivos não confiáveis.

Referências

Veja também Cross-Site Scripting (XSS, CWE-79): como funciona e como evitar em todas as linguagens — flawopen.com CSP e escape de saída: você precisa dos dois? dangerouslySetInnerHTML do React é seguro? DOMPurify basta para proteger innerHTML? Markdown é seguro contra XSS? Svelte é seguro contra XSS por padrão? Upload de SVG pode causar XSS?