Когда Apple выпустила macOS Mojave на WWDC 2018, она представила, что Safari теперь имеет возможность защищаться от технологии снятия отпечатков пальцев. Какое отношение эта технология имеет к отпечаткам пальцев, для чего она используется и насколько стоит волноваться рядовым пользователям? Начнем с его плюсов и минусов :-)
Что такое отпечатки пальцев
Первоначальная цель Fingerprinting — сбор отпечатков пальцев, так что же это означает в контексте веб-браузеров? Давайте посмотрим на проблему, которую он призван решить.
Достаточно ли в человеческом обществе для однозначной идентификации человека имени и идентификационного номера? В целом проблем с использованием этих конвенций, основанных на социальных институтах, нет, но во многих случаях этого недостаточно:
- Имена можно менять по желанию, а повторяющихся имен очень много.
- Удостоверения личности могут быть подделаны или использованы мошенническим путем.
- Крайние случаи (например, безымянный труп) не имеют ни имени, ни идентификатора.
В вебе, если мы сравним браузер с человеком, у нас будет очень соответствующая аналогия:Пользовательский агент эквивалентен имени, а файл cookie аналогичен удостоверению личности.. Например, пользовательский агент браузера Chrome будет использовать такую форму, какChrome/66.0.3359.181Поля указывают на их собственное имя и версию, а для случая того же имени (многие пользователи используют одну и ту же версию Chrome), мы также можем однозначно идентифицировать пользователей через файлы cookie. Это очень интуитивно понятно? Но вышеприведенные три проблемы все еще неизбежны в Интернете:
- Пользовательские агенты подобны именам, которые в основном можно изменить по желанию в современных браузерах.
- Файлы cookie похожи на удостоверения личности. Если вы знаете чей-то идентификационный номер (значение файла cookie), вы можете замаскировать свою личность под кого-то другого.
- Для анонимного или злонамеренного доступа информация, полученная от обоих вышеперечисленных, часто недействительна.
Это обнажает внутреннюю хрупкость условностей, предполагающих, что «каждый человек хороший человек». Поэтому нам нужно разработать технологию, позволяющую однозначно идентифицировать человека биологически, и,Уникально идентифицирует браузер на техническом уровне.. Для первых у нас есть отпечатки пальцев, радужная оболочка глаза, ДНК и другие технологии идентификации. Точно так же для последнего мы используем метод снятия отпечатков пальцев, который описан ниже.
Краткие сведения о технологии Web Fingerprinting
В некотором смысле снятие отпечатков пальцев — это особый вид уловки — использование чего-то совершенно не по назначению, но развитие новой цели:
- Отпечатки пальцев изначально использовались для предотвращения проскальзывания, а мы использовали их для идентификации человека.
- Изначально радужная оболочка использовалась для регулировки размера зрачка, а мы использовали ее для идентификации человека.
- Изначально ДНК использовалась для того, чтобы давать девочкам потомство, а мы использовали ее для идентификации человека.
В мире программистов таких уловок больше. хотетьУникально идентифицирует браузер, работающий на платформе ОС, сколько способов вы можете придумать? В связи с этим просто посмотрите на open sourcefingerprintjs2Библиотеки, и вы понимаете, какие сумасшедшие программисты могут придумать, чтобы следить за пользователями. Размеры, связанные с этими операциями, в основном включают, но не ограничиваются:
- айпи адрес
- Поведение JavaScript
- Плагины Flash и Java
- шрифт
- Canvas
- WebGL
Ниже мы даем краткое введение в каждое из этих измерений.
айпи адрес
Самый простой сбор IP-адресов требует не сотрудничества клиента, а в основном работы сервера. Например, сервер веб-сайта может зарегистрировать запрошенный IP-адрес и получить соответствующее географическое местоположение пользователя. Если пользователь добавил прокси-сервер, мы можем обнаружитьX-Forwarded-Forполе для обнаружения этой ситуации. Между прикладным уровнем HTTP и сетевым уровнем IP нам нетрудно получить некоторую информацию о транспортном уровне, собирая заголовки пакетов TCP на стороне сервера.
Для получения вышеуказанной информации достаточно только серверной службы. Итак, неужели в сборе таких данных нет места для внешнего отображения? Не так, давайте рассмотрим два особых способа снятия отпечатков пальцев:DNS LeakиWebRTC Leak.
Немного поработав над интерфейсом, мы смогли найти DNS-серверы, используемые пользователем. В частности, при посещенииexample.com, пока ряд адресов генерируется случайным образом на странице внешнего интерфейса, какabcdefg.example.comизображений, вы можете разрешить браузеру инициировать DNS-запросы для этих субдоменов. если толькоexample.comконтролировать финалns1.example.comВторичный сервер доменных имен, затем DNS-запрос, инициированный шаг за шагом при запросе этих адресов, может быть записан сервером, а затем может быть получен DNS-сервер пользователя. В результате, если прокси-сервер настроен только для HTTP-запросов, может произойти утечка используемого пользователем DNS-адреса.В это время, если пользователь использует ближайший DNS-сервер, назначенный оператором по умолчанию, он может раскрыть свое реальное местоположение серверу..
По сравнению с описанным выше методом вставки только динамических ссылок, утечка WebRTC требует немного большего участия внешнего интерфейса. Мы знаем, что WebRTC можно использовать для поддержки приложений реального времени, таких как потоковое видео, а для реализации WebRTC в Firefox и Chrome требуется протокол STUN для создания связи UDP между двумя хостами за NAT. Сервер STUN может возвращать пользователям локальный и общедоступный IP-адрес. Итак, мы можем использовать этот способ,Получить IP-адрес интрасети пользователя после NAT в JavaScript.
Если вы хотите ознакомиться с данными, собранными описанными выше методами снятия отпечатков пальцев, нажмитездесь.
Поведение JavaScript
Вышеприведенное описание, по-видимому, в основном работает на сетевом уровне, но на самом деле есть много информации, которую нужно собрать в рамках JavaScript при просмотре.
Чтобы программно управлять пользовательским интерфейсом и поведением веб-страницы, мы должны использовать JavaScript для управления DOM. Студенты, изучающие фронтенд с небольшим опытом, знают, что модель DOM загружена множеством атрибутов и очень тяжела. Это также означает, что в DOM хранится много конфиденциальной информации о браузере: User-Agent, архитектура системы, язык системы, местное время, часовой пояс, разрешение экрана... И для вновь добавленных форм в HTML5, таких как электричество, ускорение Не говоря уже о конкретной ценности их обнаружения, просто обнаружения существования этих API, объем информации очень велик. И насколько сложно обнаружить эти атрибуты? Нам просто нужно получить доступ в JavaScriptnavigator.xxxсвойства, вы можете легко получить "рост, вес, группа крови, созвездие..." браузера.
Конечно, чтобы избежать утечки некоторых конфиденциальных свойств DOM, современные браузеры используют некоторые политики безопасности для ограничения доступа к некоторым свойствам. Но для сценариев снятия отпечатков некоторые политики безопасности аналогичны краже колокольчиков. Давайте взглянем на кусок исходного кода в fingerprintjs2:
// https://bugzilla.mozilla.org/show_bug.cgi?id=781447
hasLocalStorage: function () {
try {
return !!window.localStorage
} catch (e) {
return true // SecurityError when referencing it means it exists
}
},
Эта процедура встречается довольно много раз во всей библиотеке. Спрятаны и спрятаны от моего визита? Разве это не место без серебра 300 таэлей :-)
Демонстрацию снятия отпечатков пальцев JavaScript см.здесь.
Плагины Flash и Java
Flash и Java пропускают информацию об устройстве пользователя в разной степени.
На уровне браузера они соответствуютnavigator.pluginsСамо поле представляет собой большую яму: список всех установленных пользователем плагинов и подробная информация о номере их версии, что само по себе значительно повышает уникальность браузера. Например, следующий код может легко получить информацию о подключаемом модуле браузера пользователя в старой версии Firefox:
for (plugin of navigator.plugins) { console.log(plugin.name); }
"Shockwave Flash"
"QuickTime Plug-in 7.7.3"
"Default Browser Helper"
"Unity Player"
"Google Earth Plug-in"
"Silverlight Plug-In"
"Java Applet Plug-in"
"Adobe Acrobat NPAPI Plug-in, Version 11.0.02"
"WacomTabletPlugin"
Чтобы исправить ситуацию, производители браузеров добавили к этому свойству защиту от «маскировки», блокируя имена подключаемых модулей, отличные от обычных подключаемых модулей. В текущем Firefox результат приведенного выше кода должен выглядеть так:
for (plugin of navigator.plugins) { console.log(plugin.name); }
"Shockwave Flash"
"QuickTime Plug-in 7.7.3"
"Java Applet Plug-in"
Однако эта возможность не мешает следопытамnavigator.plugins["Shockwave Flash"]способ упреждающего обнаружения установки плагинов. Таким образом, это первая уязвимость раскрытия информации API плагина браузера.
В каких местах на уровне среды выполнения подключаемого модуля, отличного от уровня браузера, Flash и Java-апплеты могут быть отпечатаны?
Flash может предоставить языку AS3 возможность считывать информацию о системе: помимо версии Flash, сюда также входит такая информация, как версия ОС, производитель оборудования, архитектура веб-браузера, разрешение и многие другие атрибуты, используемые для описания оборудования и системного мультимедиа. совместимость. Что касается Java-апплета, в дополнение к предоставлению описания JVM, версии системы, информации о локали пользователя и даже некоторой файловой системы, использования памяти, состояния сети и другой информации. В совокупности эта информация, несомненно, значительно упростит отслеживание.
В тени этих проблем с безопасностью апплеты Flash и Java исчезли из современной сети. в то время как вышеnavigatior.pluginsAPI, также былзаброшенный.
Для нескольких методов снятия отпечатков пальцев, представленных до сих пор, большая часть полученных данных не обладает особенно высокой уникальностью (например, UA) или может иметь большее дрожание (например, IP-адрес). Далее мы упомянем некоторые функции, которые действительно похожи на «отпечатки пальцев», которые ближе к сути технологии снятия отпечатков пальцев.
здесьявляется примером снятия отпечатков пальцев Flash. К счастью, ваш браузер может больше не поддерживать Flash :-)
шрифт
Казалось бы, обычные шрифты на самом деле могут привести к очень большой теме. Роль шрифтов неотъемлемая часть методов снятия отпечатков пальцев.
в нашей компанииКак упоминалось в шеринге босса, расчет макета шрифта включает в себя множество параметров: базовые линии/лигатуры/кернинг... Это настолько сложно, что браузеру приходится полагаться на библиотеку рисунков операционной системы (такую как Pango в Linux, CoreText в macOS и DirectWrite в Windows). Мало того, что поведение этих библиотек будет иметь свои тонкие различия, браузер продолжит контролировать процесс рендеринга шрифтов через свойства CSS. Таким образом, мы можем узнать процесс вычисления через результат набора шрифта. Этот процесс может показаться тонким, но на самом деле он очень прост:
- Отрисовка различными специальными шрифтами в местах, не видимых пользователю
<span>Этикетка. - Измерьте получившуюся метку Bounding Box.
С помощью таких простых шагов мы можем получить две ключевые части информации:
- Установлен ли у пользователя шрифт (для неустановленных шрифтов будет использоваться шрифт по умолчанию).
- Различия в типографике ограничивающей рамки на уровне пикселей, вызванные разными методами рендеринга шрифтов.
Чтобы увидеть расчетную разницу отпечатков пальцев на основе типографики, см.здесь.
Canvas
Canvas API в HTML предоставляет JavaScript контроль над визуализируемым содержимым на уровне пикселей. Мы знаем, что помимо поддержки основных форм, текста и режимов рисования в Canvas также можноЭкспорт содержимого Canvas в виде изображений(Если вы использовали функцию «Сохранить в альбом» в различных Моментах, вы использовали этот API). На уровне формата изображения браузеры используют разные механизмы обработки изображений, параметры экспорта и уровни сжатия, что делает конечное изображение, даже если каждый пиксель точно такой же, хеш-значение экспортируемого файла подвержено незначительным различиям. На уровне операционной системы различные методы рендеринга шрифтов, конфигурации сглаживания и методы субпиксельного рендеринга также привносят тонкие различия. В совокупности мы можем использовать Canvas для получения «отпечатка пальца».
В fingerprintjs2 реализация этой функции в исходном коде очень лаконична:
getCanvasFp: function () {
var result = []
var canvas = document.createElement('canvas')
// ...
// 调用了一大堆 canvas API 之后
if (canvas.toDataURL) { result.push('canvas fp:' + canvas.toDataURL()) }
},
Вы, вероятно, не найдете никакой другой "основной реализации", в которой даже нет if-else... но она работает очень хорошо. на этопример страницы, вы можете просмотреть отпечаток холста вашего браузера:
Your Fingerprint
Signature ✔ 4FAFB231
Uniqueness 99.56% (1130 of 258561 user agents have the same signature)
Это означает, что легко получить очень высокую Уникальность.
WebGL
WebGL — это API более низкого уровня, чем Canvas, и вы можете использовать его, чтобы получить всю мощь трехмерного рисования. Основанный на фингерпринтинге WebGL, принцип ничем не отличается от шрифтов и Canvas, за исключением следующих двух моментов:
- Всесторонне оцените поддержку браузерами API WebGL (да, только 88 API).
- Нарисуйте специальную форму, затем вычислите хеш отрендеренного изображения.
Щелкните здесь, чтобы получить соответствующийдемонстрационная страница. Это может быть причиной того, что демо-версия не ввела отрисовку шрифта.Уникальность изображений, полученных здесь, не слишком высока.Мой Safari и Chrome могут фактически получить одно и то же значение хеш-значения изображения...
Производительность в реальном мире
Объединив кучу методов, описанных выше, можно получить очень мощную библиотеку фингерпринтинга промышленного уровня. Если у вас есть какие-либо сомнения относительно фактического эффекта, пожалуйста, посетитеДомашняя страница проекта fingerjs2, попробуйте что-то вроде этого:
- Сначала создайте отпечаток пальца в обычном режиме Chrome.
- В Safari также генерируется отпечаток пальца.
- Сравните результаты с тем же Mac коллеги, чтобы увидеть, есть ли разница.
- Обновите страницу после смены пользовательского агента и посмотрите, имеет ли значение отпечаток пальца.
- Войдите в режим инкогнито Chrome, заново создайте отпечаток пальца и посмотрите, совпадает ли он.
Неудивительно, что при изменении различных распространенных конфигураций в том же Chrome отпечаток не изменится. Независимо от того, переходите ли вы на ту же версию браузера на другом компьютере или на другой браузер на том же компьютере, это приведет к другим результатам отпечатков пальцев. В этом сила технологии снятия отпечатков пальцев.
Согласно Мозилле1, 83,6 % браузеров имели уникальный отпечаток пальца из 1 миллиона посещений сайта, а 94,2 % браузеров с поддержкой Flash или Java.
Еще одна интересная статистика заключается в том, что файлы cookie, которые часто прописываются в политиках конфиденциальности, очень мало влияют на уникальность отпечатков пальцев. Данные показывают, что в описанном выше методе отслеживания плагин для браузера может привести к увеличению энтропии на 15,4 бита, в то время как включение файлов cookie может привести к увеличению энтропии только на 0,353 бита. это2^15и2^0.3разница на порядки - и статистика даже не учитывает лучшую технологию отслеживания Canvas. Теперь я понимаю, как усердно вас пытаются найти рекламные объявления на всевозможных спам-сайтах :-)
Суммировать
Зарубежные страны используют порох для изготовления пуль для защиты от врага, а Китай использует его как петарды для поклонения богам; иностранные страны используют стрелки компаса для плавания, а Китай использует их для изучения фэн-шуй; иностранные страны используют опиум для лечения болезней, но Китай использует их в пищу.
В настоящее время основные производители браузеров усердно работают над созданием более эффективных стратегий защиты конфиденциальности. Safari, упомянутый в начале этой статьи, использует упрощенные параметры конфигурации, чтобы затруднить отслеживание. Но за технологией Fingerprinting стоит подумать о злоупотреблении этой технологией ценностью конфиденциальности. Во-первых, вы бы отключили Canvas, WebGL и рендеринг шрифтов для большей конфиденциальности? Боюсь, большинству людей будет трудно вернуться. С другой стороны, точно так же, как Google будет использовать ИИ для игры в го, а Baidu будет использовать его для оптимизации рекламы поддельных лекарств, в самой технологии нет правильного или неправильного, важны люди, которые ее используют.