Comments 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, где, оказывается, можно указать произвольное выражение и оно будет вычислено....
Задумываюсь иногда, сколько ещё подобных мин "разложено" по софту, но пока не выявлено. Найти бы что-нибудь такое...
del
Во флеше была забавная уязвимость - можно было заставить браузер выполнить произвольный JS на странице если скормить парсеру плеера поломанный XML. Это в те времена, когда половина всей баннерной рекламы была на нем родимом.
О, а можете дать наводку поточнее? Интересно почитать.
Нашел-таки на старом диске. К моему удивлению прямо рядом с PoC'ом лежала и ссылка на эту и эту статьи.
К сожалению память меня подвела и дело было не совсем в парсинге XML, но если вы прочтете статью, то поймете, почему мне запомнилось именно так как запомнилось.
Статья за 11 год, мой файл датируется декабрем 2013, так что использовалось где-то с 2010 и работало в том или ином виде как минимум до 2014.
вот поэтому флеш и джаву задушили, а жаль.
продвигают html5 как безопасную замену, но вопрос: не может ли там быть подобных уязвимостей или нельзя ли было именно песочницу настроить?
хотя, конечно, есть wasm, с помощью которого можно сделать почти то же самое (флеш/апплеты), но как-то никто не спешит, странно...
Масштабируемая векторная графика...
Казалось бы...
Нужна графика? Векторная? Масштабируемая? Дерзай!!! Математика в руки!!!
Почему моё приложение при открытии SVG-файла отправляет сетевые запросы?