Блог
Проверка профиля перед первым входом: 12 показаний
Команда ARMANOS6 мин
Что площадка успевает прочитать до входа
Страница входа читает ваш браузер раньше, чем вы дотянетесь до кнопки. Разрешения эти чтения не спрашивают и следа на экране не оставляют.
Поэтому смотреть вы будете до логина, а не после письма о блокировке. Все показания вы читаете в соседней вкладке, и наружу не уходит ни одного запроса.
- 1
Откройте проверку в профиле
Первой вкладкой нового профиля, до всякого входа.
- 2
Откройте её же у себя
Обычным браузером на той же машине.
- 3
Сравните два столбца
Совпавшее пришло от вашей машины, а не от профиля.
Все показания одной таблицей
Каждое показание ниже стоит рядом с тем, что оно выдаёт площадке.
| Что спрашивает страница | Что здесь выдаёт профиль |
|---|---|
| User agent | версия, которой не бывает у объявленной системы |
| Система | версия и разрядность спорят со строкой User agent |
| Экран | экран меньше окна, в котором он открыт |
| Ядра и память | те же числа, что у вашей машины |
| Часовой пояс | пояс вашего города при чужом выходе |
| Языки | одна строка там, где живой Chrome даёт несколько |
| Холст | одинаковый рисунок у двух ваших профилей |
| Видеокарта | дорогое имя карты при выключенном ускорении |
| Пиксели WebGL | имя подменено, а пиксели пришли ваши |
| Звук | сумма отсчётов совпала у двух профилей |
| Шрифты | шрифты вашей системы под чужой объявленной |
| Точки касания | ноль у настольного профиля, пять у телефонного |
Часы и языки выдают страну профиля
Часовой пояс и список языков площадка сверяет с адресом выхода первым делом. Профиль с киевским прокси и московскими часами виден на первом же запросе.
Старое имя зоны расхождением не считается: профиль, просивший Europe/Kyiv, получает в ответ Europe/Kiev. Список языков читайте целиком: живой браузер несёт за основным языком базовый, и на сборке под Windows профиль отдал uk-UA, uk, ru, en.
Площадка считает рисунок и звук числом
Холст, WebGL и звук площадка читает числом, а не глазами: она просит браузер нарисовать картинку и сложить байты. Два профиля на одной машине обязаны дать здесь разные числа.
Разница бывает крошечной и всё равно рабочей: сумма звуковых отсчётов на двух профилях одной сборки вышла 124,04347810969193 против 124,04347865358432.
Расходятся эти числа с седьмого знака после запятой, и площадке такого расхождения хватает. Имя карты страница получает готовой строкой, а пиксели считает сама, и подменённое имя рядом с вашими пикселями это готовое противоречие.
Холст проверяют на снимаемость шума
Совпадение двух чтений холста доказывает мало: движок со сломанным шумом тоже отвечает дважды одинаково. Поэтому самопроверка задаёт три других вопроса, и на каждый ждёт своего ответа.
Один и тот же пиксель, прочитанный через разные прямоугольники, обязан быть одним и тем же. Прозрачный пиксель обязан остаться прозрачным, а не вернуться цветным. И сдвиг, выученный на сплошной заливке, не должен повторяться на другом рисунке: шум, который снимается вычитанием, хуже отсутствия шума, потому что становится приметой.
Заливка для этого берётся двумя серыми, а не чёрным и белым. У чёрного сдвиг вниз упирается в ноль, у белого сдвиг вверх упирается в потолок, и оба цвета прятали бы половину шума.
Звук читают так, как его читает площадка
Площадка не слушает тишину: она прогоняет тон через компрессор без вывода на колонки и складывает отсчёты. Полученная сумма и есть звуковой отпечаток, и именно её сдвигает профиль на своё, заданное зерном, число.
Самопроверка делает то же самое и смотрит на две вещи: сумма получилась, и повторный прогон дал ту же сумму. Чтение пустого анализатора здесь не годится: оно даёт одинаковую тишину на любом браузере, с подменой и без.
Картинку WebGL проверка читает двумя дорогами и сравнивает байты: две дороги к одной картинке обязаны сойтись. Окно профиля при этом не должно быть шире экрана, а список голосов синтеза не должен содержать чужих языков.
Шрифты называют настоящую систему
Список шрифтов страница собирает замером, а не запросом: рисует одну строку каждым шрифтом и смотрит на ширину. Шрифта, которого в системе нет, она не увидит: ширина совпадёт с запасным.
Поэтому профиль, объявивший Windows, обязан показывать шрифты Windows. Menlo, Monaco и Optima под объявленной Windows это противоречие внутри одного окна.
Кадр и поток отвечают отдельно
Страница читает не только своё окно: тот же вопрос она задаёт внутри невидимой рамки и в отдельном потоке. Три ответа обязаны совпасть.
Подмена поверх обычного Chrome видна именно здесь: окно назвало 16 ядер и Win32, а поток в том же окне ответил 8 ядрами и MacIntel. На сборке под Windows и кадр, и поток ответили 8 и Win32, как и страница над ними.
Что программа проверяет у себя сама
Кроме проверки на сайте у профиля есть своя самопроверка внутри программы, «Автопроверка отпечатка» (меню профиля > Проверить отпечаток): страница с одним скриптом, которую открывает сама программа на этом компьютере, сравнивает то, что отвечает браузер, с тем, что профилю было задано. Один и тот же код гоняется и в программе, и при приёмке движка на сборочной машине, поэтому две копии разойтись не могут.
Сама страница наружу ничего не шлёт, а проверочный браузер выходит в сеть только так, как вышел бы сам профиль: через его прокси, а при выходе по SSH и при прокси с паролем не выходит вовсе. У профиля с прокси самопроверка ещё проверяет WebRTC двумя короткими пробами, которые шлют проверочный запрос STUN на адрес этого же компьютера в местной сети; этот запрос компьютер не покидает. На macOS 15 и новее при первой такой проверке система может спросить разрешение на доступ к локальной сети.
Самопроверка спрашивает не только значения, но и то, спрятана ли сама подмена. Способ чтения параметров WebGL и получатель флага автоматики обязаны выглядеть встроенными в браузер: их текст кончается словами «native code», иначе площадка увидит нашу руку раньше, чем наш ответ.
Ответ страницы, ответ невидимой рамки и ответ отдельного потока сверяются между собой в той же самопроверке. Расхождение любого из трёх красит строку красным, и по строке видно, какая пара разошлась.
Адрес мимо прокси и его вердикт
WebRTC отдаёт адреса сам, не спрашивая ни вас, ни страницу. Домашний адрес вашей машины одинаков во всех профилях на ней, поэтому он связывает аккаунты вернее отпечатка.
Стартовая страница профиля ставит адрес выхода рядом с вашим настоящим и говорит прямо, когда они совпали. Своего адреса она не знает, значит вердикта вы не увидите вовсе.
Уходит ли мимо прокси сам WebRTC, меряет «Сеть > Запустить диагностику» в том движке, которым открываются ваши профили. У отдельного профиля с прокси это меряет и «Проверить отпечаток», с настройками самого профиля, в строке «Защита от утечки WebRTC».
- 1
Настоящий адрес в списке
Домашний адрес вида 192.168.1.42 виден каждому сайту и одинаков во всех ваших профилях.
- 2
Имя вместо адреса
Строка, кончающаяся на local, это работающая защита браузера.
- 3
Заглушки из нулей
0.0.0.0 и :: адресом не считаются.
Порядок на первые десять минут
Начните с трёх строк: часы, языки, ядра и память. Если строка совпала с вашей машиной, профиль до площадки не доехал.
Дальше сверьте холст, пиксели и звук между двумя профилями и сличите их восьмизначные коды. Последним откройте тест утечки: весь обход занимает меньше десяти минут и не требует входа.
Что делать с расхождением
Одно расхождение вы закрываете настройкой: часы и языки ставите по стране выхода, экран и память выбираете из списка. Правку видно сразу, потому что следующее чтение даёт другие значения.
Другое настройкой не закрыть. Разошлись кадр и поток или пиксели пришли ваши, значит выбор у вас из двух: сменить инструмент или работать дальше с известной приметой.
Чего это не утверждает
- Это не утверждает, что сошедшиеся 12 показаний делают аккаунт безопасным. Поведение, платёжные данные и история аккаунта остаются вне любого браузера.
- Это не утверждает, что каждая площадка читает всё перечисленное. Кто-то читает часть, кто-то не смотрит вовсе, и свой список не публикует никто.
- Числа звука, пояса и языков сняты на одной сборке под Windows 2 сентября. Другая машина даёт другие значения, и переносится отсюда правило, а не числа.
- Эти показания стоит прочитать и на ARMANOS: они написаны не для одного браузера. И ни одно из них не говорит, как площадка поведёт себя завтра.
Где это можно увидеть самому
Каждое число выше выходит из файла, который можно открыть и запустить.
- Проверка на сайте не делает ни одного сетевого вызова и ничего не запоминает
- apps/web/components/tools/FingerprintCheck.tsx · apps/web/test/инструмент-отпечатка.js
- 12 показаний считаны с самой проверки, а не вписаны рукой
- apps/web/scripts/сосчитать-проверки.js · apps/web/test/числа-не-вписаны-рукой.js
- Автопроверка отпечатка исполняется в настоящем браузере, а число её строк берётся из журнала приёмки
- apps/desktop/src/lib/fpAudit.js · apps/desktop/test/audit-on-builtin.js
- Старое и новое имя часовой зоны считаются совпадением
- apps/desktop/src/lib/fpAudit.js · apps/desktop/test/fp-audit.js
- Кадр и поток сходятся с окном в живом браузере
- apps/desktop/test/audit-on-builtin.js · apps/desktop/test/fingerprint-realms.js
- Вердикта нет, когда сравнивать адрес выхода не с чем
- apps/desktop/src/start/start.html · apps/desktop/test/leak-verdict.js
Вопросы
- Можно ли проверить профиль, не заходя в аккаунт?
- Да, и это единственный безопасный порядок. Все 12 показаний читаются на пустой вкладке.
- Часы показывают Europe/Kiev, а я просил Kyiv. Это поломка?
- Нет. Это одно имя зоны в двух видах, и живой Chrome отвечает так же.
- Сколько профилей открыть, чтобы понять, разные ли они?
- Два. Половина этих показаний имеет смысл только рядом с чем-то ещё.
- Проверка на сайте хранит мои значения?
- Нет. Все числа вы получаете прямо во вкладке, и наружу не уходит ни одного запроса.
- Мой домашний адрес виден в тесте утечки. Это страшно?
- Да, если адрес настоящий: он одинаков во всех ваших профилях и связывает их. Строка на local это другое дело.
- Хватит ли одной такой проверки перед входом?
- Перед первым входом да. После смены прокси повторите: часы и языки едут за страной выхода.
Рядом с этим
Посмотрите, что отвечает ваш профиль
Проверка читает 12 показаний и никуда их не отправляет.