Как XML превращает несколько строк в миллиард повторов
В XML можно объявить сущность — короткое имя для текста, который парсер подставит при чтении документа. Например, сущность `lol` может означать слово «лол», а другая — десять обращений к первой. Если затем третья сущность содержит десять обращений ко второй, каждый уровень увеличивает результат в десять раз.
После нескольких таких уровней маленькая последовательность объявлений описывает уже колоссальный объём текста. В варианте, известном как «атака миллиарда смехов», вложенные сущности дают примерно миллиард повторов слова. В исходном файле этих повторов нет: они возникают, когда парсер раскрывает ссылки.
Почему страдает не только память
Чтобы обработать документ, программа может создавать раскрытый текст в памяти, передавать его дальше или снова разбирать. Объём работы тогда определяется не размером входного файла, а тем, сколько данных получится после подстановок. Парсер тратит ресурсы на построение результата, а сервис, ожидающий обычный XML, может замедлиться или перестать отвечать на другие запросы.
Это пример атаки отказа в обслуживании: документ не обязан содержать исполняемый код — достаточно заставить программу выполнить слишком много работы. Насколько серьёзным окажется эффект, зависит от настроек парсера и от того, ограничивает ли приложение размер раскрытия.
Защита — ограничивать раскрытие
Парсеры и приложения могут запрещать или ограничивать обработку сущностей, а также задавать пределы на глубину вложения и объём результата. Важно проверять именно стоимость обработки после подстановок: крошечный размер файла сам по себе не означает, что его безопасно разбирать.
Поэтому этот XML опасен не своей длиной, а разницей между тем, что сервер получает, и тем, сколько работы документ заставляет его выполнить.






