22.06.2021

Идентификация через анализ внешних обработчиков протоколов в браузере

Разработчики библиотеки fingerprintjs, позволяющей генерировать идентификаторы браузера в пассивном режиме на основе косвенных признаков, таких как разрешение экрана, особенностей WebGL, списки установленных плагинов и шрифтов, представили новый метод идентификации, основанный на оценке установленных у пользователя типовых приложений и работающий через проверку поддержки в браузере дополнительных обработчиков протоколов. Код скрипта с реализацией метода опубликован под лицензий MIT.

Проверка осуществляется на основе анализа привязки обработчиков к 32 популярным приложениями. Например, определив наличие в браузере обработчиков схем URL telegram://, slack:// и skype:// можно сделать вывод о наличии в системе приложений telegram, slack и skype, и использовать данную информацию в качестве признака при генерации идентификатора системы. Так как список обработчиков одинаков для всех браузеров в системе идентификатор не меняется при смене браузера и может применяться в Chrome, Firefox, Safari, Brave, Yandex Browser, Edge и даже в Tor Browser.

Метод позволяет генерировать 32-битные идентификаторы, т.е. по-отдельности не позволяет добиться большой точности, но имеет смысл как дополнительный признак в сочетании с другими параметрами. Ощутимым минусом метода является заметность попытки идентификации для пользователя — при генерации идентификатора на предложенной демонстрационной странице в правом нижнем углу открывается небольшое, но явно заметное окно в котором достаточно долго перебираются обработчики. Данный минус не проявляется в Tor Browser, в котором идентификатор может быть вычислен незаметно.

Для определения наличия приложения скрипт пытается открыть во всплывающем окне ссылку, связанную с внешним обработчиком, после чего браузер выводит диалог с предложением открыть содержимое в связанном приложении, если проверяемое приложение присутствует, или выдаёт страницу с ошибкой, если приложения нет в системе. Через последовательный перебор типовых внешних обработчиков и анализ возвращения ошибки можно сделать вывод о наличии в системе проверяемых программ.

В Chrome 90 для Linux метод не сработал и браузер на все попытки проверки обработчика вывел типовой диалог подтверждение операции (в Chromе для Windows и macOS метод работает). В Firefox 88 для Linux, как в обычном режиме, так и в режиме инкогнито, скрипт определил наличие установленных дополнительных приложений из списка, а точность идентификации оценена в 99.87% (35 подобных совпадений из 26 тысяч проведённых тестов). В запущенном на той же системе Tor Browser был сгенерирован идентификатор, совпадающий с тестом в Firefox.

Интересно, что дополнительная защита в Tor Browser сыграла злую шутку и обернулась возможностью провести идентификацию незаметно для пользователя. Из-за отключения в Tor Browser диалогов подтверждения использования внешних обработчиков проверочные запросы оказалось можно открывать в iframe, а не в popup-окне (для разделения наличия и отсутствия обработчиков используется то, что правила same-origin блокируют доступ к страницам с ошибкой и разрешают к страницам about:blank). Из-за защиты от флуда проверка в Tor Browser занимает заметно дольше времени (10 секунд на приложение).

Источник.