flawopen.com/XSS/Загрузка SVG
Опасна ли загрузка SVG из-за XSS?
Загруженный SVG — это документ, а не просто пиксели: он может содержать активные элементы, например скрипты и обработчики событий. Выполнение зависит от контекста браузера. В <img> действует ограниченный режим; встроенный в страницу SVG, прямое открытие или включение как документа могут быть активными.
Чем SVG отличается от других форматов изображений
В отличие от PNG и JPEG, SVG — это XML, который может содержать активное содержимое. Браузеры отключают сценарии в ограниченных контекстах изображений, например <img>, но не при прямом открытии SVG, встраивании как документа через <object>, <iframe> или <embed>, а также при вставке разметки inline. Загруженное изображение профиля может стать stored XSS, если приложение отдаёт его в активном контексте под своим origin. Поведение зависит от контекста; расширение и MIME не очищают содержимое.
Как безопасно обрабатывать загрузки
- ✓До сохранения или отображения используйте поддерживаемый SVG-санитайзер с явным списком разрешённого. Удаляйте исполняемые элементы, обработчики событий, внешние ссылки и
foreignObject, если они не нужны; не очищайте XML регулярными выражениями. - ✓Если пользователю нужно только изображение, растрируйте SVG в изолированном процессе с ограничениями ресурсов и отдавайте растр. Храните оригинал вне web-root, если он не нужен.
- ✓Отдавайте загрузки с отдельного регистрируемого домена, который не получает cookie приложения. Соседний поддомен может получать cookie, заданные для родительского домена.
- ✓Если недоверенный SVG остаётся документом, принудительно скачивайте его через Content-Disposition: attachment и
X-Content-Type-Options: nosniffлибо используйте только ограниченный контекст изображения, например <img>. Избегайте inline, <object>, <iframe> и выдачи документа с того же origin.
Часто задаваемые вопросы
['Достаточно проверить расширение или MIME-тип?', 'Нет. Расширение и заявленный MIME — это метаданные, а не проверка активного содержимого. Проверьте реальный формат, затем примените SVG-санитайзер со списком разрешённого или преобразуйте файл в растр, если функции SVG не нужны.']
Источники
- OWASP XML Security Cheat Sheet
- flawopen.com — Cross-Site Scripting
- OWASP — File Upload Cheat Sheet
- OWASP ASVS — sanitizing or sandboxing SVG scriptable content