Эта задача во многом похожа на предыдущую, хоть и касается формата PDF. Для начала представим себе классическую атаку. Существует сервер, на который мы можем загрузить картинку. Есть способ изготовить такой файл, который одновременно будет и валидным изображением, и правильным PDF. После загрузки такого файла мы можем заманить жертву к себе на сайт и заставить открыть нашу картинку как PDF. При помощи FormCalc из PDF можно отправлять и принимать запросы с того хоста, откуда загружен файл. Используя это, мы обходим Same Origin Policy и получаем доступ к серверу от имени нашей жертвы.
К сожалению, эту атаку можно провести только через браузер IE, так как он по умолчанию использует официальный плагин Adobe. У других браузеров есть встроенные просмотрщики (вернее, что-то вроде конвертеров), которые не поддерживают FormCalc.
Изначальная атака типа content smuggling была направлена на смешение форматов PNG и PDF. Но в Adobe запатчили плагин, который проверяет по черному списку, не совпадает ли начало файла PDF с одним из типовых заголовков для графических файлов. Например, PNG
— для PNG, GIF89a
— для GIF, JFIF
— для JPEG.
Предполагается, что если нет соответствующих строк в заголовке, то файл уже не может считаться валидным. Но важно, что пробелы и переносы строк плагином не учитываются.
Суть формата при этом тоже никак не изменилась: в файле перед самим PDF могут находиться практически любые данные. Так что потенциальная возможность content smuggling тоже осталась.
Ей-то и воспользовались ребята из Minded Security. Они смогли собрать специальный файл: одновременно валидный PDF и SVG (они называют такие файлы словом polyglot). В черном списке Adobe перечислены и заголовки SVG (svg
, <?xml
), но парсеры SVG гуманнее парсеров XML, а потому и возможностей обойти проверку нашелся целый мешок. Любой из вариантов можно вставить в самое начало:
- стандартный DOCTYPE для svg (
<!DOCTYPE svg …
); - произвольный тег (
<zzzz/>
); - произвольный тег «инструкций» (
<?xxxx ?>
); - XML-комментарии (
<!-- ->
).
Следом мы вставляем валидный SVG, после него — валидный PDF. А дальше — в бой!
В общем, это очередное доказательство того, что черные списки крайне ненадежный подход. Но исследователи признают, что реального толка от найденной уязвимости не очень много. Как мы уже знаем, SVG «из коробки» — очень опасный формат, и если мы можем загрузить SVG на сервер, то почти точно сможем выполнять и код на JavaScript. Добавлять сюда возможности PDF не требуется.
В Adobe запатчили и эту уязвимость. Скорее всего, в черный список добавили символ <
, так как он необходим для всех методов обхода (кстати, интересно было бы удостовериться в этом). Зато в Minded Security предложили использовать эту атаку для обхода некоторых вариантов настройки CSP, но метод иначе как наркоманским не назовешь.
PDF — очень многофункциональный формат. В нем есть такое понятие, как action, — некоторые действия. Одно из этих действий — GoToE
позволяет сделать редирект на какой-то сайт. Для веба это привычная вещь, но в PDF, оказывается, отсутствует защита от редиректа на JavaScript. Если PDF загружается с помощью тега <object>
или <embed>
, то в нем можно указать редирект на скрипт, и тот будет выполнен в контексте того сайта, в который вставлен документ.
/GoToE /F (javascript:alert(location))
При чем тут SVG? Тут надо вспомнить, что этот формат позволяет подгружать внешние ресурсы и создавать внутри себя HTML. Можно сделать такой файл SVG-PDF, который при открытии будет отрабатывать как SVG, а потом сам себя загружать как PDF. Загруженный PDF, в свою очередь, будет делать редирект на исполнение кода.
Пример такого SVG-PDF можно увидеть на картинке.