FlawOpen

flawopen.com/XSS/Content-type sniffing

XSS из-за MIME sniffing: как путаница типов достигает браузера

Справочная страница
Краткий ответ

Браузер использует Content-Type ответа, чтобы определить, как обрабатывать его байты. Если приложение отдаёт контролируемые пользователями файлы с отсутствующим или неверным типом, MIME sniffing может изменить обработку некоторых ответов. Указывайте правильный тип и X-Content-Type-Options: nosniff, а загрузки изолируйте от origin приложения. Заголовок снижает один риск интерпретации браузером, но не очищает файлы и не заменяет контроль загрузок.

Как загрузка пересекает границу документа

Приложение принимает файлы и затем отдаёт их с собственного аутентифицированного origin с отсутствующим или неверным Content-Type. Если браузер интерпретирует ответ как HTML-документ, разметка файла может стать активной в origin сайта. При открытии это создаёт риск хранимого XSS или подмены типа контента. Расширение и заявленный при загрузке тип не доказывают формат байтов.

Указывайте тип и изолируйте загрузки

ОПАСНО — пользовательский файл отдается inline с неоднозначными заголовками
HTTP/1.1 200 OK
Content-Type: application/octet-stream
// отсутствует X-Content-Type-Options
// тот же origin, что у аутентифицированного приложения
БЕЗОПАСНЕЕ — верный тип, nosniff и изолированная загрузка
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Content-Disposition: attachment; filename="download.txt"

Используйте заданный сервером Content-Type, соответствующий байтам; не копируйте тип, заявленный отправителем. X-Content-Type-Options: nosniff отключает MIME sniffing для документных ответов и блокирует запросы скриптов или стилей с неверным MIME-типом. Это не универсальное исправление XSS: храните загрузки на другом origin, предпочитайте Content-Disposition: attachment для скачивания и проверяйте размер, права и формат файлов. Для изображений и встроенных медиа возвращайте проверенный тип и тестируйте реальный ответ браузера.

Частые вопросы

Делает ли nosniff безопасной раздачу любых загруженных файлов?

Нет. Он управляет MIME-интерпретацией браузера и проверками скриптов и стилей, но не проверяет и не очищает файл, не исправляет ошибочный Content-Type и не изолирует файл того же origin. Для недоверенных файлов используйте отдельный origin и скачивание как вложение.

Источники

См. также XSS (межсайтовый скриптинг, CWE-79): как он работает и как его предотвратить в любом языке — flawopen.com CSP и экранирование вывода: нужны ли оба? Безопасен ли dangerouslySetInnerHTML в React? Достаточно ли DOMPurify для безопасного innerHTML? Защищает ли Markdown от XSS? Защищает ли Svelte от XSS по умолчанию? Опасна ли загрузка SVG из-за XSS?