Почему отключение JavaScript больше не спасает от кражи конфиденциальной информации через SVG-фильтры.

Эстонская исследовательница безопасности Лира Ребане представила необычный приём кликджекинга, который опирается на сочетание SVG-графики и каскадных таблиц стилей. Её доклад на конференции BSides Tallinn в октябре остался незамеченным широкой аудиторией, но опубликованное ею недавно описание техники показало, что речь идёт о куда более серьёзной проблеме, чем эксперимент с визуальными эффектами. Ребане обнаружила, что фильтры SVG способны вытягивать данные из веб-страниц, находящихся под ними во встроенном фрейме (iframe), - и тем самым нарушать одно из базовых правил браузерной безопасности, ограничивающее взаимодействие между разными источниками контента.
Кликджекинг существует больше десяти лет и объединяет множество способов заставить человека выполнить действие, которого он не собирался совершать. Манипуляция может выглядеть безобидной - например, пользователь нажимает на кнопку, не подозревая, что под ней спрятан элемент стороннего сайта. Термин предложили в 2008 году исследователи Джеремайя Гроссман и Роберт Хансен, изучавшие способы перехвата кликов и перенаправления их на элементы, выбранные злоумышленником. С тех пор появились надёжные методы защиты, которые ограничивают работу страниц во фреймах, блокируют перенос сессионных файлов cookie в таких условиях и повышают прозрачность взаимодействия между доменами.
Несмотря на защитные меры, новые варианты атак продолжают всплывать - достаточно вспомнить прошлогоднюю технику подделки межоконных взаимодействий. Открытие Ребане из той же оперы, но опирается на совершенно иной механизм. Первоначально исследовательница пыталась воссоздать характерный визуальный эффект Apple Liquid Glass с помощью SVG-фильтров и CSS. Когда эксперимент удался, она заметила, что применённый фильтр, будучи размещённым во встроенном фрейме, получает доступ к пикселям основного документа, который по правилам должен оставаться недоступным.
Ребане подчёркивает, что работа с SVG в междоменных атаках изучается давно: она ссылается на исследование Perfect Pixel Timing Attacks Пола Стоуна и работу Рона Масаса Human Side Channel. Тем не менее, по её словам, никто прежде не проделывал ничего подобного с данными, полученными через SVG-фильтры, таким способом: «Я не думаю, что кто-то ещё запускал вычисления на междоменных данных так, как это сделала я», отметила она в разговоре с The Register.
Особенность подхода в том, что SVG-фильтры можно комбинировать так, чтобы они выполняли роль логических элементов. Используя feBlend и feComposite, Ребане создала цепочки, позволяющие обрабатывать пиксели страницы произвольными функциями - фактически превращая набор фильтров в примитивный вычислительный модуль, которому не нужен доступ к JavaScript. Такой подход позволяет собирать атаки, которые были бы слишком сложны или вовсе невозможны другими средствами.
Доказать применимость метода Ребане решила на примере Google Docs. Её демонстрационная схема включала всплывающее окно с кнопкой «Generate Document». После нажатия на ней появлялась текстовая область для ввода CAPTCHA, а код подменял содержимое скрытого поля на заранее подготовленный фрагмент, который модель затем размещала в документе. Подобное поведение обычно блокируется заголовками X-Frame-Options или политиками frame-ancestors, но сервисы Docs можно внедрять на сторонние сайты, что делает механизм уязвимым для подобного приёма.
Исследовательница обращает внимание, что фреймирование разрешают и множество других сервисов: видеоплатформы, карты, системы комментариев, рекламные сети, платёжные модули. Кроме того, существует немало интерфейсов, которые не предназначены для загрузки во фреймах, но по ошибке не задают заголовки, запрещающие это. Особенно часто такая ситуация возникает у API-эндпоинтов.
Техника не ограничивается сценарием с внедрённым фреймом. При наличии возможности HTML-инъекции можно собрать такую же цепочку поверх самой целевой страницы. Ребане напоминает, что класс XSS долгое время позволял злоумышленникам исполнять JavaScript на скомпрометированных сайтах. Однако всё больше владельцев ресурсов ужесточают политики, запрещая выполнение небезопасного кода. В таких условиях злоумышленникам приходится искать обходные пути, и CSS становится удобным инструментом: он позволяет управлять отображением страниц и взаимодействием пользователя без выполнения скриптов. SVG-кликджекинг - лишь один из вариантов, доступных при таком подходе.
Хотя новая методика не меняет фундаментальные основы защиты веба, она значительно упрощает создание сложных атакующих цепочек. Google выплатила Ребане вознаграждение в размере 3133,70 доллара за сообщение о проблеме. Исправления пока нет, и неясно, относится ли этот эффект к ошибкам браузера или к особенностям стандарта. Исследовательница отмечает, что проблема воспроизводится не только в Chromium-браузерах - аналогичное поведение наблюдается и в Firefox.
Разработчики могут защититься от подобных атак. В числе методов Ребане приводит API Intersection Observer v2, который помогает выявить ситуацию, когда SVG-фильтр перекрывает содержимое фрейма. Тем временем в баг-трекере Chromium остаётся открытой заявка, поданная ещё в марте и связанная с утечкой визуальных данных из-за особенностей обработки пикселей. Её уже пометили как «won't fix», что на фоне продемонстрированной техники выглядит тревожным заделом для будущих исследований.