Как стать автором
Обновить

Почему моё приложение при открытии SVG-файла отправляет сетевые запросы?

Время на прочтение8 мин
Количество просмотров15K
Всего голосов 82: ↑82 и ↓0+82
Комментарии14

Комментарии 14

Как обезопасить себя в Java:

   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);

Также есть константы ACCESS_EXTERNAL_STYLESHEET, ACCESS_EXTERNAL_DTD, ACCESS_EXTERNAL_SCHEMA, но если верить документации, кода выше должно быть достаточно.

За Java, увы, пока что сказать не могу. Но могу про .NET. :)

В современном .NET с обработкой внешних сущностей тоже всё хорошо - по умолчанию в различных XML-парсерах процессинг DTD / внешних сущностей отключен.

По ощущениям (и немногочисленной информации об XXE с примерами из реальных проектов), в .NET Framework 4.5.1 и ниже основная проблема была как раз с дефолтными настройками. То есть создали какой-нибудь XmlDocument и используют его для загрузки XML. А инстансы из коробки обрабатывают внешние сущности - получаем сразу дефект безопасности.

Соответственно, в .NET Framework 4.5.2 дефолтные настройки поменяли, и жить стало лучше.

Но то речь про дефолтные настройки.
Другое дело, когда процессить внешние сущности всё-таки надо и настройки выставляются явно (как в данном случае). Вот тут уже нужно поаккуратнее быть, чтобы не подорваться, так как просто врубать процессинг внешних сущностей опасно.

*далее следует вопрос дилетанта

я, конечно, понимаю, что xml - язык расширяемый (eXtendible), но не понимаю, 1.зачем его "расширять" для известных производных (структура должна быть известна обработчику), т.е. разве нужны в svg такие фичи, как внешние сущности? и 2. почему возможен выход за пределы песочницы (разрешено обращение по любым урлам)?

это как недавняя уязвимость в log4j, где, оказывается, можно указать произвольное выражение и оно будет вычислено....

А вы просмотрите код любого SVG, там урлы будут с самой первой строки. И вот вам готовая XXE для DOCTYPE.. так сделали изначально, нам теперь расхлёбывать.

1.зачем его "расширять" для известных производных (структура должна быть известна обработчику), т.е. разве нужны в svg такие фичи, как внешние сущности?

¯_(ツ)_/¯ Не могу ответить, к сожалению. Не копал "зачем", интересовался исключительно с точки зрения эксплуатации/защиты, но не первопричин.

2. почему возможен выход за пределы песочницы (разрешено обращение по любым урлам)?

Например, не только к локальным файлам (что уже само по себе опасно)? Наверное, всё тянется корнями туда же, куда и первый вопрос - кто-нибудь в своё время посчитал, что так будет удобно. Зачем - вопрос, да. Опять же, не копал.

С точки зрения поставщиков парсеров, наверное, наболее простое и правильное решение - просто по дефолту напрочь обрубать резолвинг внешних сущностей (что и делается в том же .NET). Если нужно - разбирайте сами, осознавая риски, и накладывая необходимые ограничения на резолвинг.

это как недавняя уязвимость в log4j, где, оказывается, можно указать произвольное выражение и оно будет вычислено....

Задумываюсь иногда, сколько ещё подобных мин "разложено" по софту, но пока не выявлено. Найти бы что-нибудь такое...

ну да, сначала добрые самаритяне разработчики думали о том, что это будет удобно, а не о том, как этим можно напакостить...

Во флеше была забавная уязвимость - можно было заставить браузер выполнить произвольный JS на странице если скормить парсеру плеера поломанный XML. Это в те времена, когда половина всей баннерной рекламы была на нем родимом.

О, а можете дать наводку поточнее? Интересно почитать.

Нашел-таки на старом диске. К моему удивлению прямо рядом с PoC'ом лежала и ссылка на эту и эту статьи.

К сожалению память меня подвела и дело было не совсем в парсинге XML, но если вы прочтете статью, то поймете, почему мне запомнилось именно так как запомнилось.

Статья за 11 год, мой файл датируется декабрем 2013, так что использовалось где-то с 2010 и работало в том или ином виде как минимум до 2014.

Спасибо за ссылки.

вот поэтому флеш и джаву задушили, а жаль.

продвигают html5 как безопасную замену, но вопрос: не может ли там быть подобных уязвимостей или нельзя ли было именно песочницу настроить?

хотя, конечно, есть wasm, с помощью которого можно сделать почти то же самое (флеш/апплеты), но как-то никто не спешит, странно...

Масштабируемая векторная графика...
Казалось бы...
Нужна графика? Векторная? Масштабируемая? Дерзай!!! Математика в руки!!!

поддерживаемая на уровне браузеров, стандартизированная

рендерить джаваскриптом так себе затея

Зарегистрируйтесь на Хабре, чтобы оставить комментарий