Перейти к содержимому

Глоссарий

Утечка через кадр (iframe realm)

Рамка это отдельный мир JavaScript со своим navigator. Защита, написанная только для документа, туда не достаёт, и три строки кода страницы читают второй ответ.

Утечка через кадр это расхождение отпечатка между страницей и рамкой, которую страница создала внутри себя.

Что такое отдельный мир

Мир это одно пространство JavaScript: свои глобальные объекты, свой navigator, свой screen. Каждая рамка на странице открывает ещё один такой мир.

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

Как сайт это снимает

Всё чтение стоит сайту четырёх строк и кончается раньше, чем дочитается страница. Разрешения на него не нужно, и ничего необычного в нём нет.

  1. 1

    Добавляет рамку вне экрана

    Вам ничего не показывают и ни о чём не спрашивают: рамка шириной в ноль точек стоит за краем видимой области.

  2. 2

    Читает второй navigator

    Рамка отвечает своим числом ядер, своей платформой и своим часовым поясом.

  3. 3

    Сравнивает два ответа

    Одинаковые значения не говорят ничего нового. Разница говорит, что браузер переписывает одно из них, и это уже вывод о браузере.

Ваша страница прямо сейчас

Эти четыре значения прочитаны в документе, который вы сейчас читаете, и никуда отсюда не уходят.

У рамки, созданной внутри него, спросили бы те же четыре имени, а её ответ сравнили бы с тем, что вы видите.

Ваша машина прямо сейчас

Платформа
измеряем на вашей машине
Логических процессоров
измеряем на вашей машине
Экран
измеряем на вашей машине
Часовой пояс
измеряем на вашей машине

Прочитано в вашем браузере и показано здесь. Никуда не отправляется.

Почему разница хуже самого значения

Редкая видеокарта делает из вас одну машину среди многих. Браузер, у которого страница и рамка расходятся, это браузер, который изменили.

Первое это отпечаток, который стоит записать. Второе это повод внимательнее смотреть на всё остальное в этом аккаунте.

Поэтому защита, положенная наполовину, хуже отсутствующей: она отдаёт и настоящее значение, и доказательство попытки его спрятать.

Откуда берутся значения

На нашем движке значения профиля приходят во весь браузер при запуске, до первой строки кода страницы.

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

  • Один источник под каждым navigator

    navigator страницы и navigator рамки читают одно и то же место, поэтому согласовывать их между собой руками больше нечего.

  • Пустая рамка ничем не особенная

    Рамка, которая не загружала своего адреса, отвечает ровно так же, как загрузившая.

  • Самопроверка спрашивает обе

    Внутри профиля самопроверка отпечатка сама строит рамку и сравнивает её с документом вокруг, а расхождение показывает красной строкой.

Часто путают с этим

  • Утечка через поток

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

  • Рамка чужого сайта

    Её страница прочитать не может вовсе: браузер отвечает отказом на первое же обращение. Её значения принадлежат сайту внутри.

  • Защита от обрамления

    Скрипты, отказывающиеся работать внутри рамки, это про подмену нажатий. О значениях рамки они молчат.

  • Песочница у рамки

    Признак песочницы отнимает у рамки права. Что отдаёт navigator внутри неё, он не меняет.

Чего это не делает

  • Это не мешает странице делать рамки. Их вправе создать любая страница, а браузер без такой возможности встречается реже прячущегося значения.
  • На двух движках это сделано не одинаково. Наш собственный отвечает из-под каждого мира, а встроенный закрывает рамку, прочитанную мгновением позже, и оставляет прочитанную в тот же миг.
  • Это не разрывает уже возникшую связь. Согласная рамка это один признак из десятка, а история аккаунта и его поведение к отпечатку отношения не имеют.
  • Это не касается браузера, открытого вне профиля. Значения принадлежат тому профилю, который запустил окно.

Проверить

Каждое утверждение выше взято из файла, который можно открыть.

Замер кадра в самопроверке
apps/desktop/src/lib/fpAudit.js
Замерено в настоящем браузере при обычной политике содержимого
apps/desktop/test/fingerprint-realms.js
Что отдала отгружаемая сборка на странице и в кадре
engine/приёмка-отчёт.json
Значения профиля доходят до каждого процесса отрисовки
engine/patches/armanos-fp.cumulative.diff

Вопросы

Может ли сайт прочитать рамку незаметно?
Да. Рамку можно построить вне экрана и прочитать в ту же секунду, и ни постройка, ни чтение нигде вам не показываются.
Меняет ли прокси то, что отдаёт рамка?
Нет. Прокси меняет адрес, с которого уходит трафик. Рамка читает машину и браузер, и это чтение через сеть не проходит вовсе.
Пустая рамка отличается от загруженной?
Для сайта нет. Он спрашивает тот же navigator в обоих случаях, а пустая дешевле, потому что ничему не нужно приезжать.
Можно просто отказаться от рамок?
Обычные страницы держат их ради оплаты, карт и видео. Браузер без единой рамки заметнее всего того, что внутри этих рамок лежит.
Где посмотреть свой ответ?
Самопроверка внутри профиля создаёт рамку и сравнивает её со страницей. Это один из 29 замеров, которые там идут.

Посмотрите, что ответит кадр в вашем профиле

Самопроверка отпечатка идёт внутри профиля и показывает все 29 замеров, и зелёные, и красные.