Блог
Почему Facebook связывает ваши аккаунты между собой: семь сигналов
Команда ARMANOS8 мин
Совпадения решают, а не имена
Площадка не ищет одного человека за двумя именами. Она складывает мелочи, которые браузер отдаёт сам, и смотрит, где две колонки сошлись слишком близко, чтобы это было совпадением.
Семь таких мелочей названы ниже поимённо. Первые три площадка снимает сама: рукопожатие между приложениями, учёт внутри страницы и счётчик на чужих сайтах. Остальные четыре приходят с вашей стороны.
Рукопожатие между Facebook и Instagram
Facebook и Instagram принадлежат одной компании и обмениваются идентификатором пользователя напрямую. Этот обмен идёт на обычной загрузке страницы, без вашего нажатия и без формы входа.
Один запрос уходит от Facebook, встречный от Instagram, и оба несут идентификатор соседнего приложения в самом адресе. Открыв в одном профиле обе площадки, вы отдаёте им готовую связку из двух аккаунтов, и никакой прокси её не разорвёт.
- 1
Вы открываете страницу
Ни входа в аккаунт, ни нажатия для этого обмена не нужно.
- 2
Facebook зовёт соседа
Адрес facebook.com/ig_xsite_user_ выносит идентификатор наружу.
- 3
Instagram отвечает тем же
Адрес instagram.com/accounts/xuserid называет того же человека.
Своя слежка внутри самой страницы
Кроме рукопожатия между приложениями, Meta ведёт внутри страницы собственный учёт: что вы открыли, сколько смотрели, докуда долистали. Такие запросы уходят на тот самый адрес, куда вы пришли, и на чужой счётчик не похожи вовсе.
Обычный блокировщик по доменам их пропускает. Закрыть их можно только правилом по адресу самого запроса, и в профиле со сценарием «Соцсети» вы такие правила получаете вместе со списком.
| Площадка и её собственные запросы | Адресов под правилом |
|---|---|
| Facebook и Instagram | 11 |
| X | 6 |
| 4 | |
| Всего в этом наборе | 21 |
Правило работает только на своих адресах
Кусок адреса вроде /ajax/bz встречается и на чужих сайтах, и перекрытый везде он ломал бы посторонние страницы. Поэтому правила набора соцсетей заперты на адресах самих площадок: у Facebook и Instagram это по два имени, своё и хранилища картинок, и ещё пять имён приходятся на X и Pinterest.
На чужом сайте тот же кусок адреса проходит как обычно. На своей площадке он перекрывается, и площадка теряет отчёт, а не страницу.
Пиксель встречает вас на чужих сайтах
Второй слой учёта живёт вне самой площадки. Магазин, блог или посадочная страница ставит у себя её счётчик, и он сообщает о вашем визите ещё до первого нажатия.
Этот счётчик узнаёт браузер по тем же мелочам, что и площадка, поэтому два ваших профиля он сводит так же легко, и ещё до того, как вы дошли до самой площадки. Ниже по сетям разложен список счётчиков соцсетей, который идёт со сценарием «Соцсети».
| Чей счётчик ждёт снаружи | Адресов в списке |
|---|---|
| Meta | 6 |
| TikTok | 13 |
| X | 5 |
| 3 | |
| Другие сети рядом | 6 |
Метки в ссылке срезаются при переходе
Ссылка из рекламы или из переписки несёт хвост: fbclid, igshid, mibextid и ещё тридцать семь меток, по которым площадка узнаёт, кто и откуда вас прислал. Одна и та же метка, пришедшая в два профиля, связывает их без всякого отпечатка.
Профиль срезает эти метки при переходе, и страница открывается та же, но без хвоста. Скопированной вами ссылки это не касается: чистится то, куда вы идёте, а не то, что вы вставляете в чужой чат.
Один выход на несколько аккаунтов
Адрес выхода площадка сравнивает первым, и стоит ей это сравнение дешевле всего. Два профиля с одного адреса выглядят двумя вкладками одного человека, как бы ни различались их отпечатки.
Серверный адрес площадка узнаёт по владельцу диапазона, и у Meta такие диапазоны на счету давно. Домашний или мобильный адрес обходится дороже, зато он не подписывает ваш профиль заранее, до первого прочитанного значения.
Часы и язык против страны выхода
Часовой пояс и список языков браузера страница читает без всякого разрешения. Если прокси выводит вас из Бразилии, а часы показывают Москву, площадка видит человека, который прячется.
Пояс и набор языков обязаны идти от страны выхода, а не от вашей домашней машины. В программе они приезжают из справочника на 114 стран и встают в профиль сами, как только известна страна прокси, без правки руками.
Страну выхода спрашивают четыре источника
Пояс и языки берутся от страны выхода, а страну надо сперва узнать. Профиль спрашивает её у четырёх независимых источников по очереди, через собственный прокси и только по защищённому соединению, и берёт первый внятный ответ.
Если не отвечает ни один из четырёх, страна не выдумывается: профиль открывается с тем поясом, что выпал ему при создании, и предупреждение об этом выходит на экран. Выдуманная страна была бы хуже честного «не знаю».
Окно шире объявленного экрана
Браузер называет странице размер экрана и размер окна, и оба числа она читает одной строкой. Окно шире объявленного экрана описывает машину, которой не бывает.
На наборе из 900 профилей развёрнутое окно не помещалось в объявленный экран примерно у шести профилей из десяти, и это замер для монитора 1920 на 1080. На другом мониторе доля будет своя. Разных экранов в наборе было 18.
Видеокарта спорит с архитектурой машины
Сайт спрашивает у браузера имя видеокарты и отдельно архитектуру процессора. Два ответа по отдельности выглядят обычно, а вместе описывают машину, которой никто не выпускал.
Такая пара попадалась на профилях с macOS: имя Apple M1 рядом с архитектурой x86, и ловится она одним сравнением двух строк. Именно ради этого случая у нас заведена проверка согласия видеокарты с архитектурой, и сегодня она держит их вместе. Настоящий Mac на этой видеокарте архитектуру x86 не называет, и одного расхождения площадке хватает.
Что проверить у своих профилей
Шесть сигналов из семи видны из окна разработчика за один вечер, и ставить для этого ничего не нужно: список сетевых запросов это то же окно. Седьмой это адрес выхода: своего внешнего адреса браузер не показывает, его спрашивают у стороннего источника.
Пройдите по профилям парами: те, что должны остаться чужими друг другу, обязаны разойтись хотя бы по адресу выхода, по часам и по экрану, а лучше и по видеокарте. Совпавшая пара это та, ради которой площадка и заводит правило.
- 1
Сверьте адрес выхода
У двух профилей, которые должны остаться чужими, он обязан различаться.
- 2
Сверьте часы и языки
Пояс и языковой набор обязаны идти от страны, из которой вы выходите.
- 3
Сверьте экран и окно
Окно не бывает шире экрана, который профиль объявляет странице.
- 4
Посмотрите сетевые запросы
На первой загрузке видно, уходит ли обмен идентификаторами между приложениями.
Чего это не утверждает
- Это не полный список того, что читает площадка. Здесь семь сигналов, которые вы проверите сами, а полного перечня не публикует ни одна площадка.
- Это не утверждает, что сошедшиеся семь делают аккаунт безопасным. Поведение, платёжные данные и история жалоб остаются при вас, и ни один браузер их не меняет.
- Порядок сигналов здесь не означает их веса. Какая мелочь стоит дороже других, площадки не говорят, и вывести это со стороны нечем.
- Числа про наборы правил описывают сценарий «Соцсети» на сегодня. Набор лежит файлом внутри программы и обновляется вместе с ней: ленты, которая подтягивала бы его отдельно, у нас нет.
Где это можно увидеть самому
Каждое число выше выходит из кода, который можно открыть и запустить.
- Собственные запросы площадок перечислены поимённо, вместе с обменом между Facebook и Instagram
- apps/desktop/src/lib/tracker-rules.js
- Эти правила исполняются на профиле и заперты на хостах своей площадки
- apps/desktop/test/слежка-по-хостам.js
- Счётчики на чужих сайтах лежат отдельным списком, разложенным по сетям
- apps/desktop/assets/trackers_social.json
- Часы и языки профиля выводятся из страны и сверяются на настоящих отпечатках
- packages/shared/src/index.js · apps/desktop/test/fingerprint-consistency.js
- Видеокарта и архитектура профиля не спорят между собой
- apps/desktop/test/fingerprint-consistency.js
- Окно профиля не открывается шире объявленного экрана
- apps/desktop/src/lib/окноПрофиля.js · apps/desktop/test/окно-не-шире-экрана.js
Вопросы
- Разные прокси у меня уже есть, этого мало?
- Адрес это один сигнал из семи. Два профиля с разных адресов сводятся по часам, по экрану или по обмену между приложениями.
- Если не заходить в Instagram, связки не будет?
- Обмен идёт на загрузке страницы, а не на входе в аккаунт. Достаточно того, что вкладка соседнего приложения открыта в том же профиле.
- Помогает ли режим инкогнито?
- Он забывает куки после закрытия окна и не трогает ни адрес выхода, ни часы, ни экран, ни видеокарту. Четыре сигнала из семи остаются на месте целиком.
- Блокировщик рекламы закроет эти запросы?
- Списки доменов закрывают счётчики на чужих сайтах. Запросы самой площадки они не трогают: те идут на тот адрес, куда вы и пришли.
- Чем это отличается от подмены user agent?
- Строка user agent это одно поле, а сигналов семь. Подменив одно поле, вы чаще заводите новое расхождение, чем закрываете старое.
- Сколько аккаунтов можно вести с одного компьютера?
- Предел ставит не компьютер, а совпадения между профилями. Разойдутся адрес, часы, экран и видеокарта, и вопрос переедет с числа профилей на их непохожесть.
Рядом с этим
Почему площадки связывают аккаунты
Что именно сравнивают между собой два аккаунта и чем закрывается каждая примета.
Аккаунты Facebook
Дневные потолки, первая неделя и цена переключения между аккаунтами.
Окно шире объявленного экрана
Откуда взялись 900 профилей и эта доля в этой записи.
Бесплатная проверка отпечатка
12 значений, прочитанных в вашем браузере, и ни одного запроса наружу.
Посмотрите, что ваш браузер рассказывает о вас
Проверка читает 12 значений прямо в окне и никуда их не отправляет.