При разборе XML от пользователя разрешены внешние сущности. Как это расширяет атакующую поверхность сервиса?
Разрешённые внешние сущности позволяют содержимому XML заставить серверный парсер обратиться к ресурсам, указанным внутри документа. Это может привести к чтению локальных файлов, запросам во внутреннюю сеть или раскрытию чувствительных данных; для недоверенного XML внешние сущности следует отключать.
Внешние сущности появились в XML как штатный механизм повторного использования содержимого и подключения внешних определений через DTD. Для документов из доверенной среды это упрощало композицию и валидацию данных.
Проблема возникла, когда универсальные XML-парсеры начали применять к пользовательскому вводу без изменения настроек безопасности. Парсер выполняет не только синтаксический разбор, но и разрешение ссылок, поэтому данные начинают влиять на действия самого сервера.
Атакующий отправляет XML, содержащий ссылку на локальный или сетевой ресурс. Если парсер автоматически разрешает такую ссылку, приложение может прочитать доступный процессу файл либо инициировать исходящее соединение от имени сервера.
Последствия зависят от прав процесса и сетевого окружения: возможны утечка конфигурации и секретов, обращение к внутренним административным интерфейсам и раскрытие данных через сообщение об ошибке или ответ приложения. Проверка расширения файла или заголовка Content-Type не устраняет проблему, поскольку опасное поведение возникает на этапе разбора содержимого.
Для недоверенного XML нужно отключить обработку DTD и разрешение внешних сущностей на уровне парсера. Важно проверить фактические настройки используемой библиотеки и всех путей разбора: одна безопасная настройка в основном обработчике не защищает другой компонент, который принимает XML.
Если DTD действительно необходимы, безопаснее применять заранее известный набор определений и запретить любые внешние загрузки. Также следует ограничить исходящий трафик, права процесса и доступ к файловой системе, но это дополнительные уровни защиты, а не замена безопасной конфигурации парсера.
Отдельный риск создают рекурсивные или чрезмерно большие сущности, способные вызвать исчерпание памяти и CPU. Поэтому нужны ограничения размера документа, глубины вложенности, времени разбора и объёма раскрываемого содержимого; конкретные названия параметров зависят от библиотеки.
Сервис обмена документами принимал XML от внешних контрагентов. Команда рассматривала три варианта: полностью доверять парсеру, разрешить внешние сущности только для внутренних IP-адресов или отключить внешние сущности и оставить разрешённые схемы локально.
Первый вариант сохранял совместимость, но позволял документу управлять обращениями сервера. Второй создавал слабую границу: внутренние адреса сами по себе не доказывают безопасность ресурса, а правила фильтрации могут ошибаться. Выбрали третий вариант: внешние сущности отключили, необходимые определения поставляли из фиксированного локального набора, а исходящие соединения дополнительно ограничили на уровне сети.
После этого документы продолжили проходить требуемую валидацию, но XML больше не мог инициировать произвольное чтение ресурсов от имени сервиса. Ограничения размера и времени разбора закрыли отдельный класс атак на доступность.
Нет. Даже при недоступной файловой системе разрешение внешних сущностей может позволить серверу выполнять исходящие запросы во внутреннюю сеть или к внешним адресам. Поэтому нужно запрещать саму несанкционированную загрузку внешних ресурсов, а не только один тип источника.
Сетевой фильтр может уменьшить последствия, но не устраняет возможность чтения локальных файлов и не гарантирует корректную блокировку всех адресов. Кроме того, изменение маршрутизации или появление нового внутреннего сервиса способно превратить ранее безопасное правило в уязвимое. Базовая защита должна находиться в компоненте, который обрабатывает недоверенный XML.
Нет. Валидация проверяет соответствие структуры и типов заданной схеме, но не обязательно запрещает выполнение внешних обращений во время разбора. Безопасность зависит от порядка обработки и настроек парсера: внешние сущности и DTD должны быть запрещены или строго ограничены до того, как документ будет считаться доверенным.